-
开闭原则
-
概念
- 对代码的拓展开放,对代码的修改关闭
-
含义
- 当应用程序的需求出现变化的时候,不修改软件已经实现的代码,而是通过拓展模块的功能来满足需求。
-
优势
- 1. 只测试新增加的功能,原有代码仍可正常运行
- 2. 实现开闭原则需要降低代码的粒度,单个目标明确的代码很少被更改,提高复用程度。
-
实现例子
- 对于某个界面,可以定义一个抽象类,规定拥有特定的不变功能,和需要实现的个性化元素。然后让各种主题都实现抽象类,继承了特定不变的功能,重写了需要实现的个性化元素。实现一个新的主题,没有修改原有的代码,而是通过拓展主题类实现新的主题。
-
替换原则
-
概念
- 继承必须保证父类所拥有的性质在子类中仍然成立
-
含义
- 在确定继承关系的时候,需要保证子类的所有方法都符合父类的要求,尽量不要重写父类已经实现的方法,避免多态玩脱了。
-
优势
- 保证继承关系的正确性,防止出现异常
-
实现例子
- 对于父类鸟,拥有方法 fly(),那么企鹅因为不会飞,所以需要重写 fly() ,但是就不能保证父类鸟的 fly() 的性值在子类企鹅中仍然成立,所以不符合替换原则,应该给企鹅找一个更适合它的父类,比如动物。
-
依赖倒置原则
-
概念
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
-
含义
- 要面向接口编程,不要面向实现编程,通过接口来制定好规范和契约,细节交给实现类来完成。
-
优势
- 只需要持有固定不变的接口就可以编写代码,将不变的地方(对这一类东西的处理)和变得地方(类本身的各种各样)分离开来。
-
做法
- 定义一个此类都会必有的功能,抽象成接口,然后操作这个接口,这样无论接口实现类如何改变,操作的接口代码都不用变。
-
单一职责原则
-
控制类的粒度大小,将对象解耦,提高内聚性
-
粒度
- 就是类中的实现内容,尽量保证一个方法实现一个内容,一个类实现一类内容。
-
耦合性
- 一个程序中,小模块与小模块之间的联系复杂度,之间联系越复杂,耦合度越高,牵一发而动全身。所以要提高模块的独立性,来降低模块之间的耦合性。
-
内聚性
- 指的是模块内部之间的元素之间的联系,这些元素之间的联系应该内聚到本模块之内,并降低和外部模块元素的联系,实现元素联系的内聚(内聚本模块中)
- 大概类似与手机封装的元器件
-
接口隔离原则
-
含义
- 为各个类建立它们需要的的专用接口
-
做法
- 将一个大的接口拆分为多个粒度更小的接口,保证一个接口只会服务一种业务逻辑或者一个子模块。
- 让接口用最少的方法完成最多的事情
-
最少知识原则
-
含义
-
只与本类自身的关系最近的类进行交互,不跨类操作
- 比如年级主任想要获取某班的某个学生的家庭情况,不应该直接去找学生进行交互,而是应该通过交互自己管辖的班主任,让班主任去和学生交互获取信息,然后返还给自己。
-
特点
-
只依赖应该依赖的对象
- 年级主任应该只依赖与班主任,而不能依赖于学生、家长。
-
只暴漏应该暴漏的方法
- 班主任应该只暴漏给年级主任执行班级管理的方法,而对于其他方法如生活接口方法不应该暴漏给它。
-
合成复用原则
-
含义
- 应该尽量使用组合 (has) 关系来实现,其次考虑及继承(is)关系。
-
做法
- 别轻易的通过继承父类来复用父类的代码,而更多的考虑组合父类的来复用代码。
-
例子
- 一个汽车类应该组合:红色汽车,电动汽车等类的共功能。而不是同时继承红色汽车,电动汽车来复用它们的功能。