面向对象设计原则
2021-11-25 本文已影响0人
_Walker__
六大原则
- 单一职责 (SRP, Single Responsibility Principle)
- 开闭原则 (OCP, Open Close Principle)
- 里氏替换原则 (LSP, Liskov Substitution Principle)
- 依赖倒置原则 (DIP, Dependence Inversion Principle)
- 接口隔离原则 (ISP, Interface Segregation Principle)
- 迪米特原则 (LOD, Law of Demeter、Least Knowledge Principle)
1 单一责任原则
一个类应该只有一个引起变化的原因
- 通常,一个类的功能数 = 引起变化的原因数
2 开放-封闭原则
类应该对拓展开放,对修改关闭
设计目标是允许类容易扩展,在不修改现有类的基础上,就可搭配新的行为。
3 里氏替换原则
继承必须确保超类所拥有的性质在子类中仍然成立。
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
- 子类中可以增加自己特有的方法
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
- 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等
4 依赖倒置原则(DIP,Dependency Inversion Principle)
要依赖抽象,不要依赖具体类。
不能让高层组件依赖低层组件,而且,不管高层或低层组件,“两者”都应依赖于抽象。
(所谓倒置,是指低层去依赖低层的抽象)
实践的指导方针(尽量达到,而不是严格达到)
- 变量不可以持有具体类的引用
- 不要让类派生自具体类
- 不要覆盖基类中已实现的方法
5 接口隔离原则
客户不应该被迫依赖于它不会使用的方法
要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
6 “最少知识”原则
只和你的密友交谈
白话:让类间的依赖变少
指导方针(主要为规避“链式调用”):在对象的方法内,只应该调用属于以下范畴的方法
- 该对象本身
- 参数传递进来的对象
- 此方法创建或实例化的任何对象
- 该对象的任何组件(字段)
缺点:
- 会产生更多的“包装”类
- 增加复杂度和开发时间
- 降低运行性能
其他原则
封装变化
找出需要变化的部分,把它们独立出来,避免和不需要变化的代码混在一起。
针对接口编程,不针对实现编程
用接口(超类型)表示行为,通过行为类提供实现,而不是类本身来实现。
多用组合,少用继承
使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以“运行时动态改变行为”。
为了交互对象间的松耦合设计而努力
好莱坞原则
别调用我们,我们会调用你
白话:允许低层组件将自己挂钩到系统(高层组件)上,但是高层组件决定什么时候、怎样使用这些底层组件。
模版方法遵守了好莱坞原则,它的高层组件是基类(定义算法流程的部分)。