软件设计原则之SOLID面向对象设计

中国公益传播网 2019-11-06


设计篇之软件设计原则(二)
                                         ---SOLID面向对象设计

前言


S.O.L.I.D设计原则是由Robert C. Martin 在一篇文章中提出的"first five principles" 而来。

  • Single-responsibility principle :单一职责原则

  • Open-closed Principle:开闭原则

  • Liskov substitution principle:里式替换原则

  • Interface segregation principle:接口隔离原则

  • Dependency Inversion principle:依赖倒置原则

    注:Robert C. Martin著有<<代码整洁之道>>、<<敏捷软件开发>>等

01

单一职责原则

The single responsibility principle revolves around the claim that a certain code module (most often, a class) should only have responsibility over one part of the functionality provided by the software.

  • 描述:一个类只有一个变化因子,即一个类只有一个职责

  • 问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改 类T时,有可能会导致原本运行正常的职责P2功能发生故障。

  • 解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。 这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。

举例说明,一个违背单一职责原则的例子(Java实现):

  1. class Text {

  2.    String text;

  3.    String author;

  4.    int length;

  5.    String getText() { ... }

  6.    void setText(String s) { ... }

  7.    String getAuthor() { ... }

  8.    void setAuthor(String s) { ... }

  9.    int getLength() { ... }

  10.    void setLength(int k) { ... }

  11.    /*methods that change the text*/

  12.    void allLettersToUpperCase() { ... }

  13.    void findSubTextAndDelete(String s) { ... }

  14.    /*method for formatting output*/

  15.    void printText() { ... }

  16. }

从上面例子可以看到,类有两个变化因子(即两种职责),一个是方法allLettersToUpperCase, 用于改变text,另一个是方法findSubTextAndDelete,用于格式化输出text,其中一个方法的 调用会影响另一个。可以将两种职责放在两个类中取单独实现:

  1. class Text {

  2.    String text;

  3.    String author;

  4.    int length;

  5.    String getText() { ... }

  6.    void setText(String s) { ... }

  7.    String getAuthor() { ... }

  8.    void setAuthor(String s) { ... }

  9.    int getLength() { ... }

  10.    void setLength(int k) { ... }

  11.    /*methods that change the text*/

  12.    void allLettersToUpperCase() { ... }

  13.    void findSubTextAndDelete(String s) { ... }

  14. }

  15. class Printer {

  16.    Text text;

  17.    Printer(Text t) {

  18.       this.text = t;

  19.    }

  20.    void printText() { ... }

  21. }

02

开闭原则

This principle states: “software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification".

  • 描述:软件实体(类,模块,方法等)应该对扩展开放,对修改封闭

  • 问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时, 可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过 重新测试。