面向对象设计的启发60条黄金法则

本文翻译内容来自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 ,但是我没有参考这个,结合了自己的理解尽可能客观的翻译原文。虽然有些地方很生硬,但是作为提高设计水平也值得尝试。

  1. 不要重复自己!不要重复自己!不要重复自己!(我已经重复了)
  2. 所有数据应该隐藏在类内。
  3. 类的使用者必须依赖于公共接口,但是类不应该依赖于使用它的客户端。
  4. 最小化类的消息规范。
  5. 实现所有客户端可理解的最小接口。
  6. 不要在一个类的公共接口展现实现细节,比如支持的功能。
  7. 不要将用户不需要的或者不感兴趣特性的聚集在公共接口。
  8. 一个类应该捕获有且只有一个关键抽象。
  9. 保存数据和行为在同一地方。
  10. 拆分不相关信息到另一个类。
  11. 不要向对象请求它的状态,或者显示设置状态。向对象请求为你做事。
  12. 将对象视为一类服务而不是一类数据。
  13. 设计面向对象服务时使用它们的状态决定行为。
  14. 使用不可变对象,也叫信使。
  15. 设计时,尽可能水平得,统一得分配系统智能。
  16. 系统中不要创建上帝对象,对那些名字包含Driver, Manager, System, or Subsystem的类保持怀疑。
  17. 小心那些在公共接口中有很多访问器方法的类,拥有这些意味着相关数据和行为没有保持在一处。
  18. todo
  19. 尽可能对真实世界建模。
  20. 从设计中消除不相关的类
  21. 减少系统无关的类。
  22. todo
  23. 最小化类和其他类的协作者。
  24. 最小化类和协作者之间的消息传递。(这是一种叫动态解耦的解耦形式)
  25. 最小化类和协作者之间的协作数量,比如不同的消息传递。
  26. 如果一个类包含另一个类的对象,包含类应该传递消息给被包含对象,包含关系应始终暗示使用关系。
  27. 在一个类内定义的大多数方法大多数情况下应该使用数据成员变量。当这个启发被打破时候意味着差的内聚性。
  28. 类不应该包含 开发者能够短期记忆记住的类的实例变量,这个数字一般是6.
  29. 一个类必须知道它包含什么,但是永远不应该知道谁包含它。
  30. 继承应该只被用作对层次体系建模。
  31. 派生类必须根据定义了解其基类,但基类不应知道任何关于它们的派生类的信息。
  32. 所以数据在基类中应该私有,不要使用受保护的数据,指定受保护查询当希望数据隐藏其表现。
  33. 理论上,继承层次应该很深,越深越好。
  34. todo
  35. 对于实现继承结构,所有抽象类必须是基类。
  36. 在实现继承时,所有基类应该是抽象类。
  37. 如果两个或以上类仅仅共享数据(非公共行为),应该让他们共同继承包含数据和方法的公共基类。
  38. 如果两个或以上类仅仅共享接口(而非实现),仅当它们将被多态使用时,它们应该继承自Java接口或公共基类。