类应该短小

单一权责原则

类只应有一个权责——只有一条修改的理由。

  1. public class SuperDashboard extends JFrame implements MetaDataUser{
  2. public Component getLastFocusedComponent()
  3. public void setLastFocused(Component lastFocused)
  4. public int getMajorVersionNumber()
  5. public int getMinorVersionNumber()
  6. public int getBuildNumber()
  7. }

貌似很小的SuperDashboard类有两条加以修改的理由。
首先,它跟踪大概会随软件每次发布而更新的版本信息。第二,它管理Java Swing组件(extends JFrame)

单一权责类

  1. public class Version {
  2. public int getMajorVersionNumber()
  3. public int getMinorVersionNumber()
  4. public int getBuildNumber()
  5. }

问题是太多人在程序能工作时就以为万事大吉了。我们没能把思维转向有关代码组织和整洁的部分。我们直接转向下一个问题,而不是回头将臃肿的类切分为只有单一权责的去耦式单元。


与此同时,许多开发者害怕数量巨大的短小单一目的类会导致难以一目了然抓住全局。他们认为,要搞清楚一件较大工作如何完成,就得在类与类之间找来找去。

然而,有大量短小类的系统并不比有少量庞大类的系统拥有更多移动部件,其数量大致相等。问题是:你是想把工具归置到有许多抽屉、每个抽屉中装有定义和标记良好的组件的工具箱中呢,还是想要少数几个能随便把所有东西扔进去的抽屉?

一个抽屉,里面放了各种类型的物品。 许多抽屉,每个抽屉分类整齐。

每个达到一定规模的系统都会包括大量逻辑和复杂性。管理这种复杂性的首要目标就是加以组织,以便开发者知道到哪儿能找到东西。

高内聚性

内聚性高,意味着类中的方法和变量互相依赖、互相结合成一个逻辑整体。

  1. public class Stack {
  2. List<Integer> elements = new LinkedList<Integer>();
  3. private int topOfStack = 0;
  4. public int size() {
  5. return topOfStack;
  6. }
  7. public void push(int element) {
  8. topOfStack++;
  9. elements.add(element);
  10. }
  11. public int pop() throws PoppedWhenEmpty {
  12. if (topOfStack == 0) throw new PoppedWhenEmpty();
  13. int element = elements.get(--topOfStack);
  14. elements.remove(topOfStack);
  15. return element;
  16. }
  17. }

这个类非常内聚。在三个方法中,只有size( )方法没有使用所有两个变量。

  • 保持内聚性就会得到许多短小的类