一、软件设计七项原则
- 总结归纳
设计原则 | 归纳总结 |
---|---|
开闭原则 | 对扩展开放,对修改关闭 |
里氏替换原则 | 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 |
依赖倒置原则 | 高层不应该依赖低层,要面向接口编程 |
单一职责原则 | 一个类只干一件事,实现类要单一 |
接口隔离原则 | 一个接口只干一件事,接口要精简单一 |
迪米特法则 | 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 |
合成复用原则 | 尽量使用组合或者聚合关系实现代码复用,少使用继承 |
- 软件设计原则详细解释
- 开闭原则(扩展)
- 定义:软件实体应当对扩展开放,对修改关闭
- 含义:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求
- 实现方式:通过“抽象约束、封装变化”可以实现;通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中
- 里氏替换原则(继承)
- 定义:不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义
- 含义:继承必须确保超类所拥有的性质在子类中仍然成立
- 实现方式:子类可以扩展父类的功能,但不能改变父类原有的功能;即子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法
- 依赖倒置原则(接口)
- 定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
- 含义:要面向接口(抽象)编程,不要面向实现编程。
- 实现方式:每个类尽量提供接口或抽象类,或者两者都具备;变量的声明类型尽量是接口或者是抽象类;任何类都不应该从具体类派生;使用继承时尽量遵循里氏替换(继承)原则
- 单一职责原则(功能)
- 定义:对象不应该承担太多职责
- 含义:一个对象承担了太多的职责会导致——1. 一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;2. 只需要对象某职责时需要将其他的职责全都包含,造成冗余代码或代码浪费
- 实现方式:需要设计人员发现类的不同职责并将其分离,再封装到不同的类或模块中(人工实现)
- 接口隔离原则(有限接口)
- 定义:一个类对另一个类的依赖应该建立在最小的接口上;客户端不应该被迫依赖于它不使用的方法
- 含义:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用
- 实现方式:接口尽量小,但是要有限度;为依赖接口的类定制服务;了解环境,拒绝盲从;提高内聚,减少对外交互
- 迪米特法则(通信)
- 定义:只与你的直接朋友交谈,不跟“陌生人”说话
- 含义:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性
- 实现方式:在类的划分上,应该创建弱耦合的类;在类的结构设计上,尽量降低类成员的访问权限;在类的设计上,优先考虑将一个类设置成不变类;在对其他类的引用上,将引用其他对象的次数降到最低;不暴露类的属性成员,而应该提供相应的访问器(set 和 get );谨慎使用序列化(Serializable)功能
- 合成复用原则(复用)
- 定义:尽量使用组合或者聚合关系实现代码复用,少使用继承
- 含义:在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现;要使用继承关系,则必须严格遵循里氏替换原则
- 实现方式:通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用
- 开闭原则(扩展)