一、进行良好编程设计的常见7大原则
首先介绍进行良好编程设计的常见的7大原则,分为三类。
本节叙述还涉及到一个概念——继承有“多态”和“复用”两个作用。
1.1、第一类
围绕“扩展时,不影响现有代码”目标。
1.1.1、开闭原则
英文名:Open Close Principle。
内容:对扩展开放,对修改关闭。
含义:即“扩展时,不影响现有代码”目标本身,具体实现途径是:基于接口编程,利用类继承的多态特性(继承的多态作用),扩展时通过新的具体实现子类完成,在不影响现有代码的前提下,达成扩展目标。
1.1.2、依赖倒转原则
英文名:Dependence Inversion Principle。
内容:底层模块依赖高层模块中提炼出来的接口层。
含义:有高层模块和底层模块两个模块,直观的依赖关系是高层模块依赖底层模块,这带来了“扩展底层模块时影响高层模块”问题,为了解决该问题,从高层模块提炼出接口层,高层模块和底层模块都依赖这个接口层,倒转指的是从“高层模块依赖底层模块”到“底层模块依赖高层模块中提炼出来的接口层”[1]。本质上来说,依赖倒转原则是开闭原则在高层模块底层模块依赖场景中的应用。
1.1.3、里氏替换原则
英文名:Liskov Substitution Principle。
内容:任何接口可以出现的地方,具体实现子类一定可以出现。
含义:里氏替换原则是开闭原则的规范和限制,因为不满足里氏替换原则的继承关系不能达成开闭原则场景中的扩展目标。
1.2、第二类
围绕“扩展时,在不能做到不影响现有代码的情形下,对现有代码影响尽量小”目标,这个目标等价于“类或者模块设计须高内聚低耦合”目标。
1.2.1、单一职责原则
英文名:Single Responsibility Principle。
内容:一个类或者模块只负责完成一个职责。
含义:从职责维度追求达成类或者模块设计的“高内聚低耦合”目标。
1.2.2、接口隔离原则
英文名:Interface Segregation Principle。
内容:使用多个专门的接口,而不使用单一的总接口,即继承时不依赖不需要的接口。
含义:从接口继承维度追求达成类或者模块设计的“高内聚低耦合”目标。
1.2.3、迪米特原则
英文名:Demeter Principle。
内容:指的是一个类或者模块应当尽量减少与其他实体的相互作用,增强独立性。
含义:通过应用该原则,可以降低类或者模块之间的耦合性,增强独立性,达成“高内聚低耦合”目标,但是具有副作用——“在类和模块之间直接联系减少的情形下,产生了大量的中介和传递类”,须权衡使用该原则。
1.3、第三类
围绕“如何更好进行复用”目标。
1.3.1、组合优于继承
英文名:Composition over Inheritance / Composite Reuse Principle。
内容:有“组合”和“继承(继承的复用作用)”两种复用方式,在这两种复用方式中,组合优于继承。
含义:在有些场景中,继承层次过深过于复杂,会影响代码的可读性和可维护性;在有些场景中,使用继承方式进行复用会导致类爆炸问题,可参见“桥接设计模式”说明。
二、设计模式概论
设计模式是针对某类业务场景进行权衡设计后的编程范式,具有特点:
- 针对某类业务场景,故不是银弹
- 进行权衡设计(在权衡设计过程中涉及到“是否遵循以上7大原则”等问题)的产物,故应用设计模式是在付出一定代价的前提下获取收益
常见的设计模式有23种,根据以上设计模式的定义,可以再创建新的设计模式。
如何应用设计模式:
- 理解设计模式,吸收设计模式养分
- 在实际编程过程中,切忌拿着锤子找钉子,此时最好忘记设计模式,否则反而形成干扰,具体业务场景进行具体的良好设计即可
- 事后发现正好凑巧应用了某个设计模式,那么后续在介绍这段代码时,可以引用设计模式概念,从而带来“体现设计思考”和“帮助他人理解”两个好处