更新时间:2022-09-15 10:16:38
本节书摘来自异步社区《OOD启思录》一书中的第2章2.6节角色与类,作者【美】Arthur J.Riel,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.6 角色与类
OOD启思录
经验原则2.11
确保你为之建模的抽象概念是类,而不只是对象扮演的角色。
“母亲”或者“父亲”是不是类,还是某个“人”对象所扮演的角色?答案取决于设计者为之建模的领域是什么。如果在给定的领域中,母亲和父亲具有不同的行为,那么或许他们应当被建模为类。如果他们的行为相同,那么他们只是“人”类的对象所扮演的不同角色。例如,我们可以把家庭看作“父亲”类的对象、“母亲”类的对象和几个“子女”类的对象所构成的对象,也可以把家庭看作一个称为“父亲”的“人”对象、一个称为“母亲”的“人”对象和一组称为“子女”的“人”对象构成的对象(参见图2.11)。区分只在于不同的行为。在创建不同的类之前,请确保它们的行为确实是不同的,而不是每个角色只使用“人”的能力的一个子集。请记住,一个对象只用到它的类的行为的一个子集是毫无问题的。
在设计过程中,面向对象设计者需要决定是否把一个特定的角色塑造成一个类。这就意味着我们还需要一条经验原则来指导这一决定。下面的章节将尝试给出这样的经验原则,但我对结果并不完全满意,因为这条经验原则并不是在所有领域中都适用的。
术语表
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 确保你为之建模的抽象概念是类,而不只是对象扮演的角色。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。