第六章 对象和数据结构

将变量设置为私有(private )有一个理由:我们不想其他人依赖这些变量。我们还想在 心血来潮时能自由修改其类型或实现。那么,为什么还是有那么多程序员给对象自动添加赋 值器和取值器,将私有变量公之于众、如同它们根本就是公共变量一般呢?

6.1 数据抽象

image.png

6.2 数据、对象的反对称性

这两个例子展示了对象与数据结构之间的差异。对象把数据隐藏于抽象之后,曝露操作 数据的函数。数据结构曝露其数据,没有提供有意义的函数。回过头再读一遍。留意这两种 定义的本质。它们是对立的。这种差异貌似微小,但却有深远的含义。
面向过程

在这里插入图片描述

面向对象

在这里插入图片描述

6.3 得墨忒耳律

模块不应了解它所操作对象的内部情形。
这意味着对象不应通过存取器曝露其内部结构,因为这样更像是曝露而非隐藏其内部结构。

image.png

6.3.1 火车失事

image.png

6.3.2 混杂

这种混淆有时会不幸导致混合结构,一半是对象,一半是数据结构。
此类混杂增加了添加新函数的难度,也增加了添加新数据结构的难度,两面不讨好。

6.3.3 隐藏结构

怎么来获取临时目录的绝对路径?
image.png

6.4 数据传送对象

最为精练的数据结构,是一个只有公共变量、没有函数的类。这种数据结构被称为数据传输对象DTO。
Active Record是一种特殊的DTO形式,他们拥有公共的变量的数据结构,通常也会有save()或者find()这样可浏览的方法。Active Record一般是对数据库表或其他数据源直接的翻译。
我们不幸经常发现开发者往这类数据结构中塞进业务规则方法,把这类数据结构当成对 象来用。这是不智的行为,因为它导致了数据结构和对象的混杂体。
当然,解决方案就是把Active Record 当做数据结构,并创建包含业务规则、隐藏内部数 据(可能就是Active Record 的实体)的独立对象。

6.5 小结

对象曝露行为,隐藏数据。便于添加新对象类型而无需修改既有行为,同时也难以在既有对象中添加新行为。数据结构曝露数据,没有明显的行为。便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐