第六章 对象和数据结构
将变量设置为私有(private )有一个理由:我们不想其他人依赖这些变量。我们还想在 心血来潮时能自由修改其类型或实现。那么,为什么还是有那么多程序员给对象自动添加赋 值器和取值器,将私有变量公之于众、如同它们根本就是公共变量一般呢?
6.1 数据抽象
6.2 数据、对象的反对称性
这两个例子展示了对象与数据结构之间的差异。对象把数据隐藏于抽象之后,曝露操作 数据的函数。数据结构曝露其数据,没有提供有意义的函数。回过头再读一遍。留意这两种 定义的本质。它们是对立的。这种差异貌似微小,但却有深远的含义。
面向过程
面向对象
6.3 得墨忒耳律
模块不应了解它所操作对象的内部情形。
这意味着对象不应通过存取器曝露其内部结构,因为这样更像是曝露而非隐藏其内部结构。
6.3.1 火车失事
6.3.2 混杂
这种混淆有时会不幸导致混合结构,一半是对象,一半是数据结构。
此类混杂增加了添加新函数的难度,也增加了添加新数据结构的难度,两面不讨好。
6.3.3 隐藏结构
怎么来获取临时目录的绝对路径?
6.4 数据传送对象
最为精练的数据结构,是一个只有公共变量、没有函数的类。这种数据结构被称为数据传输对象DTO。
Active Record是一种特殊的DTO形式,他们拥有公共的变量的数据结构,通常也会有save()或者find()这样可浏览的方法。Active Record一般是对数据库表或其他数据源直接的翻译。
我们不幸经常发现开发者往这类数据结构中塞进业务规则方法,把这类数据结构当成对 象来用。这是不智的行为,因为它导致了数据结构和对象的混杂体。
当然,解决方案就是把Active Record 当做数据结构,并创建包含业务规则、隐藏内部数 据(可能就是Active Record 的实体)的独立对象。
6.5 小结
对象曝露行为,隐藏数据。便于添加新对象类型而无需修改既有行为,同时也难以在既有对象中添加新行为。数据结构曝露数据,没有明显的行为。便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。