Litong's Blog

Work to become, not to acquire.

第6章 对象和数据结构

隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象。

要以最好的方式呈现某个对象包含的数据,需要做严肃的思考。

对象把数据隐藏于抽象之后,暴露操作数据的函数。数据结构暴露其数据,没有提供有意义的函数。它们是对立的。

过程式代码(使用数据结构的代码),便于在不改动既有数据结构的前提下添加新函数。

过程式代码难以添加新数据结构,因为必须修改所有函数。

面向对象代码便于在不改动既有函数的前提下添加新类。

面向对象代码难以添加新函数,因为必须修改所有类。

对于面向对象比较难的事,对于过程式代码却较容易,反之亦然!

模块不应了解它所操作对象的内部情形。

对象隐藏数据,暴露操作,这意味着对象不应通过存取器暴露其内部结构。

方法不应调用由任何函数返回的对象的方法。换言之,只跟朋友说话,不与陌生人谈话。

使用公共访问器把私有变量公开化,会诱导外部函数以过程式程序使用数据结构的方式使用这些变量。

如果ctx是个变量,就应该要求它做点什么,不该要求它给出内部情形。

对象暴露行为,隐藏数据。便于添加新对象类型而无需修改既有行为,同时也难以在既有对象中添加新行为。

不过貌似Rust的trait可以在不破坏既有继承/接口实现的前提下,无侵入式的为一个已有的类增加一个新的接口实现

数据结构暴露数据,没有明显的行为。便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。

我们有时会希望能够灵活地添加新数据类型,所以更喜欢在这部分使用对象。

另外一些时候,我们希望能灵活地添加新行为,这时我们更喜欢使用数据类型和过程。