设计原则(一)
一. 单一职责原则(Single Responsibility Principle)
• 定义:应该有且只有一个引起类变更的原因=>一个类,只能做一件事
• 好处:
1. 提高了代码的可读性,提高系统的可维护性
2. 降低类的复杂度,一个模块只负责一个职责,提高系统的可扩展性和可维护性
3. 降低类变更引起的风险,变更是必然的,如果单一职责做的好,当修改一个功能的时候可以显著的降低对另一个功能的影响
二. 开放封闭原则(Open Closed Principle)
○ 开放封闭原则是面向对象所有原则的核心
○ 对功能开放,面向修改代码封闭
○ 需求改变时,在不改变软件实体源代码(类、接口、方法等)的前提下,通过扩展功能,使其满足新的需求
○ 面向抽象编程:使用抽象,封装变化
三. 依赖倒置原则(Dependency Inversion Principle)
○ 开放封闭原则是面向对象设计的终极目标,而依赖倒置原则 是实现开放封闭原则的基础
1. 高层模块(调用者)不应该依赖于低层模块(被调用者),两个都应该依赖于抽象
2. 抽象不应该依赖于细节,细节应该依赖于抽象
3. 依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,互不影响,实现模块间的松耦合
○ 面向接口编程,不要面向实现编程
4. 关于依赖
i. 一个优秀的面向对象程序设计,核心原则之一就是将变化【隔离】/【封装】
ii. 为了实现这个目的,需要面向接口编程,使用后,客户类,不再直接依赖于服务类,而是依赖一个抽象的接口,这样,客户类就不能在内部直接实例化服务类
iii. 但是在客户类运行的过程中,又需要具体的服务类来提供服务,因为接口是不能被实例化的,就产生了一个矛盾:客户类不允许实例化服务类,但是客户类又需要服务类的服务
iv. 为了解决这个矛盾,我们设计了一种解决方案,即:客户类定义一个注入点,用于服务类的注入,而客户类的客户类(Program类),负责根据具体情况,实例化服务类,注入到客户类中,从而解决了这个矛盾
5. 依赖注入的方式
i. 通过接口传递(接口注入)
ii. 通过构造函数传递
iii. 通过属性的set方法传递
四. 里氏替换原则(Liskov Substitution principle)
○ 所有引用父类对象的地方,都可以使用其子类代替
○ 如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象
五. 接口隔离原则(Interface Segragation Principle)——设计接口时采用的指导思想
1. 客户端不应该依赖它不需要的接口
2. 一个类对另一个类的依赖应该建立在最小接口上
3. 接口尽量细分,不要在一个接口中放很多方法
4. 接口隔离原则和单一职责原则的关系
§ 单一职责:一个类干一件事 //影响类变化的原因只有一个 高内聚(模块内部元素的相似程度高)
§ 接口隔离:// 低耦合 模块之间的依赖程度较低
5. 根据接口隔离原则拆分接口时,首先必须满足单一职责原则
六. 迪米特原则(Law of Demeter)(最小知识原则(The Least Knowledge Principle))——设计类的时候采用的指导思想
1. 要求一个对象应该对其它对象有最少的了解(最小知识原则)
2. 降低类之间的耦合
3. 迪米特原则实际上就是一个类在创建方法和属性时要遵守的法则
4. 只和直接朋友通信!
i. 成员对象
ii. 方法参数
iii. 方法返回值
iv. 注意:出现在局部变量中的类,不是直接朋友
七. 合成复用原则(Composite Reuse Principle)
○ 合成复用原则,又称组合/聚合复用原则
○ 尽量使用对象组合,而不是继承来达到复用
○ 合成复用原则是将已有的对象纳入到新对象中,作为新对象的对象成员来实现的,新对象可以调用已有对象的功能,从而达到复用
○ 继承的“bug”
§ 破坏了系统的封装性,基类如果发生了改变,子类的实现也会发生改变
§ 子类如果不需要父类中新添加的方法,则系统耦合度会变高
§ 继承是静态的,不能在程序运行时发生改变
○ has-a关系 使用合成复用
○ is-a关系 使用继承