且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《OOD启思录》—第2章2.6节角色与类

更新时间:2022-09-15 10:16:38

本节书摘来自异步社区《OOD启思录》一书中的第2章2.6节角色与类,作者【美】Arthur J.Riel,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.6 角色与类
OOD启思录
经验原则2.11
确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

“母亲”或者“父亲”是不是类,还是某个“人”对象所扮演的角色?答案取决于设计者为之建模的领域是什么。如果在给定的领域中,母亲和父亲具有不同的行为,那么或许他们应当被建模为类。如果他们的行为相同,那么他们只是“人”类的对象所扮演的不同角色。例如,我们可以把家庭看作“父亲”类的对象、“母亲”类的对象和几个“子女”类的对象所构成的对象,也可以把家庭看作一个称为“父亲”的“人”对象、一个称为“母亲”的“人”对象和一组称为“子女”的“人”对象构成的对象(参见图2.11)。区分只在于不同的行为。在创建不同的类之前,请确保它们的行为确实是不同的,而不是每个角色只使用“人”的能力的一个子集。请记住,一个对象只用到它的类的行为的一个子集是毫无问题的。


《OOD启思录》—第2章2.6节角色与类

有些设计者的做法是,测试一下公有接口中有没有哪个成员对于特定的角色无法使用。如果有这样的成员,那么就意味着需要另一个类。如果它只是没有被用到,那么它只是被用作多个角色的同一个类。例如,如果“母亲”的一个操作是go_into_labor()(分娩),那么“父亲”***实现为另一个独立的类,因为父亲是无法分娩的。但是,如果这个家庭生活在一个父系社会中,只有母亲才会执行change_diaper()(换尿布)方法,那么“母亲”只是“人”类所扮演的一个角色。得出这一结论的理由是因为如果有必要的话,父亲也可以执行change_diaper()方法。但是,在更抽象的领域,若那个领域中“无法执行”与设计者或者领域选择“不去执行”的差异并不明显,那么这种方法就难以奏效了。

在设计过程中,面向对象设计者需要决定是否把一个特定的角色塑造成一个类。这就意味着我们还需要一条经验原则来指导这一决定。下面的章节将尝试给出这样的经验原则,但我对结果并不完全满意,因为这条经验原则并不是在所有领域中都适用的。

术语表
Abstract class

抽象类。不知道如何实例化自身对象的类。

Class

类。以双向联系的方式封装数据和行为的构造。与现实世界中的一个概念对应。抽象数据类型(ADT)是类的同义词。

Concrete class

具体类。知道如何实例化自身对象的类。

Constructor

构造函数。类的一个特殊的操作,负责创建/初始化该类的对象。

Destructor

析构函数。类的一个特殊的操作,负责销毁/清除该类的对象。

Dynamic semantic

动态语义。类的对象所能具有的所有可能状态,以及这些状态之间被允许的转换的集合。常用状态转换图来表示。

Information hiding

信息隐藏。类向该类的对象的使用者隐藏它的实现细节的能力。

Instantiation relationship

实例化关系。类和它的对象之间的关系。我们说类实例化对象。

Key abstraction

关键抽象。关键抽象被定义成领域模型中的一个主要实体。关键抽象经常表现为领域词汇中的一个名词。

Message

消息。类中定义的操作的名称。在强类型语言中,消息可以包含名称、返回类型以及操作参数类型(也即操作的原型)。

Method

方法。消息的实现。

Object

对象。属于它的类的一个样例,包含它自己的标识、类的行为、类的接口、类的数据的一份拷贝。也称为类的实例。

Overloaded function

重载函数。系统中的两个函数可以有相同的名字的能力,只要它们的参数类型不同(类内重载)或者所属的类不同(类间重载)。

Protocol

协议。类能响应的消息列表。

Self object

Self对象。控制位于方法内部时,接受消息的对象的引用。

经验原则小结
经验原则2.1 所有数据都应当隐藏在它所在的类内部。

经验原则2.2 类的使用者必须依赖类的公有接口,但类不能依赖它的使用者。

经验原则2.3 尽量减少类的协议中的消息。

经验原则 2.4 实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝与浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等]。

经验原则2.5 不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。

经验原则2.6 不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。

经验原则 2.7 类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。

经验原则2.8 类应当只表示一个关键抽象。

经验原则2.9 把相关的数据和行为集中放置。

经验原则2.10 把不相关的信息放在另一个类中(也即:互不沟通的行为)。

经验原则2.11 确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。