本文翻译内容来自http://www.cs.uno.edu/~jaime/Courses/4210/heuristics.pdf ,主要是面向对象设计的启发。而这些checklist来自Arthur J. Riel的书Object-Oriented Design Heuristics总结的checklist,中文出版书叫面向对象启示录,非常棒的一本书。中文也有相关checklist的翻译,https://www.cnblogs.com/dxz/archive/2006/07/06/443860.html ,但是我没有参考这个,结合了自己的理解尽可能客观的翻译原文。虽然有些地方很生硬,但是作为提高设计水平也值得尝试。
- 不要重复自己!不要重复自己!不要重复自己!(我已经重复了)
- 所有数据应该隐藏在类内。
- 类的使用者必须依赖于公共接口,但是类不应该依赖于使用它的客户端。
- 最小化类的消息规范。
- 实现所有客户端可理解的最小接口。
- 不要在一个类的公共接口展现实现细节,比如支持的功能。
- 不要将用户不需要的或者不感兴趣特性的聚集在公共接口。
- 一个类应该捕获有且只有一个关键抽象。
- 保存数据和行为在同一地方。
- 拆分不相关信息到另一个类。
- 不要向对象请求它的状态,或者显示设置状态。向对象请求为你做事。
- 将对象视为一类服务而不是一类数据。
- 设计面向对象服务时使用它们的状态决定行为。
- 使用不可变对象,也叫信使。
- 设计时,尽可能水平得,统一得分配系统智能。
- 系统中不要创建上帝对象,对那些名字包含Driver, Manager, System, or Subsystem的类保持怀疑。
- 小心那些在公共接口中有很多访问器方法的类,拥有这些意味着相关数据和行为没有保持在一处。
- todo
- 尽可能对真实世界建模。
- 从设计中消除不相关的类
- 减少系统无关的类。
- todo
- 最小化类和其他类的协作者。
- 最小化类和协作者之间的消息传递。(这是一种叫动态解耦的解耦形式)
- 最小化类和协作者之间的协作数量,比如不同的消息传递。
- 如果一个类包含另一个类的对象,包含类应该传递消息给被包含对象,包含关系应始终暗示使用关系。
- 在一个类内定义的大多数方法大多数情况下应该使用数据成员变量。当这个启发被打破时候意味着差的内聚性。
- 类不应该包含 开发者能够短期记忆记住的类的实例变量,这个数字一般是6.
- 一个类必须知道它包含什么,但是永远不应该知道谁包含它。
- 继承应该只被用作对层次体系建模。
- 派生类必须根据定义了解其基类,但基类不应知道任何关于它们的派生类的信息。
- 所以数据在基类中应该私有,不要使用受保护的数据,指定受保护查询当希望数据隐藏其表现。
- 理论上,继承层次应该很深,越深越好。
- todo
- 对于实现继承结构,所有抽象类必须是基类。
- 在实现继承时,所有基类应该是抽象类。
- 如果两个或以上类仅仅共享数据(非公共行为),应该让他们共同继承包含数据和方法的公共基类。
- 如果两个或以上类仅仅共享接口(而非实现),仅当它们将被多态使用时,它们应该继承自Java接口或公共基类。