6.1 数据抽象
于对象而言我们应该隐藏实现细节,保护数据的隐私性;应提供出合理的抽象操作方法、取值器、赋值器。
隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎于抽象!类并不简单地用取值器和赋值器将其变量推向外间,而是曝露露抽象接口,以便用户无需了解数据的实现就能操作数据本体
6.2 数据、对象的反对称性
对象:把数据隐藏于抽象之后,曝露操作数据的函数
数据结构:曝露数据,没有提供有意义的函数
通过对象和数据结构本质对比体现出 数据 与 对象 是对立的:
过程式代码难以添加新数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类
老练的程序员知道,一切都是对象只是一个传说。有时候你真的想要在简单数据结构上做一些过程式的操作
6.3 得墨忒定律
只跟朋友谈话,不与陌生人谈话
模块不应了解它所操作对象的内部情况。对象隐藏数据,曝露操作。这意味着对象不应通过存取器曝露其内部结构,因为这样更像是曝露而非隐藏其内部结构。
通过存取器曝露其内部结构代码例子:ctxt.getOptions().getScratchDir().getAbsolutePath()
如果ctxt、Options、ScratchDir 只是数据结构,没有任何行为,则它们自然会曝露其内部结构,得墨忒耳律也就不适用了
隐藏其内部结构代码例子:ctxt.createScratchFileStream(classFileName)
直接将这一过程职责划分给对象,由对象直接完成这件事。
数据传送对象
最为精炼的数据结构,是一个只有公共变量、没有函数的类。这种数据结构有时被称为数据传送对象,或DTO
对于没有行为(函数)的数据结构对象,所有变量应该公开权限,不设有存取器。