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

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

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


有些设计者的做法是,测试一下公有接口中有没有哪个成员对于特定的角色无法使用。如果有这样的成员,那么就意味着需要另一个类。如果它只是没有被用到,那么它只是被用作多个角色的同一个类。例如,如果“母亲”的一个操作是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 确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

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

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

  1. 面向对象编程启思录——读《OOD启思录》有感

    <OOD启思录>给我留下最深刻的三个印象是:首先,作者谦逊而委婉地建议面向对象成为为软件开发的首选方法.其次,作者以严谨的研究方式详细地介绍和讨论了关于面向对象编程的诸多细节性.关键性问题 ...

  2. 《OOD启思录》目录—导读

    版权声明 OOD启思录 Authorized translation from the English language edition, entitled OBJECT-ORIENTED DESIG ...

  3. HOOK启思录---第三章 HOOK的应用模式

    观察模式 在HOOK很多应用中,有一类应用最为常用,那就是观察模式.对于信息获取的要求,在很多时候都是非常的重要的功能.在很多时候,我们都需要根据一定量的信息去判断如何决策.正如打仗一样,没有一定量的 ...

  4. Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  5. 可转债数据一览表集思录_学习先进的可转债投资策略

    这两周查阅了大量的可转债模拟盘,收益让我惊掉下巴,迄今没见过一个亏损的. 为了防止人择原理,我刻意不看大V,我要全面的.客观的看待可转债.然而,它确实没有亏损过. 这是大V的: 这是普通用户的: 这是 ...

  6. 网易手游《幻书启世录》将于2022年2月14日停止运营

    12月8日消息,网易手游<幻书启世录>官网发布公告称,由于游戏开发运营策略的调整,<幻书启世录>手机游戏将于 2022年2月14日15时终止运营. 具体来看,2021年12月8 ...

  7. 集思录REITs基金数据python爬取写入EXCEL表

    本文主要讲述REITs基金相关内容, 封闭基金数据获取参见: 集思录封闭基金数据python爬取写入excel表 国债数据获取参见: 和讯网债券数据Python爬取保存成CSV文件之一 1.什么是RE ...

  8. 集思录封闭基金数据python爬取写入excel表

    本文是在之前文章"集思录REITs基金数据python爬取写入EXCEL表"的基础上写成的. 封闭式基金,是相对于开放式基金而言的,是指基金规模在发行前已确定,在发行完毕后和规定的 ...

  9. 【雅思写作】第一章:写作基础

    [雅思写作]第一章:写作基础 标签(空格分隔):[雅思写作] 第一章:写作基础 文章目录 第一章:写作基础 1.1句子翻译练习 1.1.1 简单的主谓宾结构 1.1.2 主语 + 及物动词 + 宾语 ...

最新文章

  1. Calc3: Geometrics
  2. linux以预置密码进行验证拒绝访问,Linux重置MySQL密码
  3. 一文详解pytorch的“动态图”与“自动微分”技术
  4. Chrome DevTools:如何过滤网络请求
  5. NLP《Tranformer和Self-Attention》
  6. druid最大连接数oracle,性能超过DRUID的最强数据库连接池——HikariCP相关配置及简单示例...
  7. linux内核之kfifo队列
  8. iPhone 12/13正面对比图曝光:祖传大刘海终于有所改变
  9. 软件架构入门,看这篇就够了···
  10. 程序小白天天打卡(函数模板)
  11. Pspice仿真实验-RC滤波器电路
  12. 单片机学习笔记-基础知识
  13. 开发中mock什么意思_开发中
  14. ubuntu下安装Realtek usb无线网卡驱动(8821cu)
  15. 12-监听器实现统计网站当前在线人数
  16. Docker学习(一):基础理论基础操作
  17. 从事手机软件开发需要掌握什么知识
  18. it is forbidden to set both [discovery.seed_hosts] and [discovery.zen.ping.unicast.hosts]
  19. 挂载zookeeper到文件系统 (mount zookeeper)
  20. Spark读HBASE - shc方案

热门文章

  1. 17. OD-带有多态、变形的程序进行打补丁去掉nag(分析xor加密解密、自身修改代码的程序)
  2. 七、内存、寄存器数据的传送
  3. PPT图片模板等素材打包下载
  4. TCP滑窗与拥塞控制
  5. datetime方法
  6. 滑动cell的时候执行动画效果
  7. vb添加GIF动态图片
  8. 写代码三年,月薪不到一万,是不是很失败?
  9. 北京焦灼?上海颓废?看大数据如何解读城市性格
  10. 我们分析了全美Top Business Analyst 和 Data Science专业,最后给你总结了这几点