五大设计原则

本文类容基于《Clean Architecture》

五大设计原则包括:单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖反转原则(DIP),它们是经受过时间检验和筛选的软件设计指导思想,这种指导既适用于架构设计,也适用于程序设计,遵循设计原则,便于写出更具灵活性(易读、易扩展、易维护和易重用)的软件

SRP: 单一职责原则

单一职责原则最初的描述是:“一个软件模块(类)都应该有且仅有一个被修改的原因”,更易于理解的描述为:“任何一个软件模块(类)都应该只对某一类行为者负责”,在开发实践中,单一职责原则主要讨论的是函数和类之间的关系,即哪些函数是适合归属于一个类的。

对单一职责原则的理解主要在于 “职责” 两个字,职责不等于功能,而是和行为者(可以理解为函数的调用方)相对应,职责的划分应视具体的行为者而定。例如有一个Rectangle类,它有一组负责计算面积、周长等的函数,还有一组负责绘制展示的函数,如果它们分别被计算模块和渲染模块所使用,那么Rectangle便应该被拆分为两个不同的类,如果它计算函数的结果,最后也仅被渲染模块用于展示,那么这些函数都归一个类就是没有问题的。

OCP: 开闭原则

开闭原则认为软件模块应该对扩展开发,对修改关闭,也就是一个设计良好的软件模块应该在不需要修改的前提下就可以轻易被扩展。

开闭原则是设计原则的总则,它阐明了对良好设计最本质的需求,其它设计原则都在或直接或间接的满足了开闭原则。在开发实践中,满足开闭原则最简单易行的技巧,便是多使用抽象(抽象类,接口,协议等),面向接口编程、面向协议编程都是满足开闭原则的极好实践。

LSP: 里氏替换原则

里氏替换原则强调的是子类型对基类型的可替换性,在可以使用基类型的地方使用其子类型,程序的行为应该依然保持不变。

可替换性使程序可以不用添加大量复杂的应对机制,开发实践中,多态便满足里氏替换原则,多态不仅存在于继承体系的父类和子类之间,也存在于接口/协议类型和实现类型之间。

ISP: 接口隔离原则

接口隔离原则指出,任何软件模块都不应该依赖它不需要的方法,否则容易带来意料之外的麻烦(因为不相干方法的变动而引发自身的重新编译/部署等),所以在设计时应保持接口的隔离。

开发实践中,按功能和需求设计小接口,大接口由小接口组合而成,将能很好的满足接口隔离原则。单一职责原则指导了如何进行类的划分,接口隔离原则指导了如何进行接口的划分,很容易被混为一谈,但实际上它们的观察角度是相反的:单一职责原则关注的是服务的提供者,强调提供者的职责应该单一,这样能减少引起自身修改的原因,而接口隔离原则关注的是服务的使用者,强调使用者应该依赖的功能要纯粹,这样能避免不相干的变更为自身带来麻烦。

DIP: 依赖反转原则

依赖反转原则认为,高层次的模块不应该依赖低层次模块的实现细节,而是应该由低层次模块依赖于高层次模块的需求抽象,因为抽象层是稳定的,而具体实现是容易经常变动的。

依赖反转原则提出一种特定的解耦形式,为高层次模块添加需求抽象,使得代码的控制流方向和依赖方向发生反转。依赖反转原则能提升系统的灵活性和稳定性,但严苛的执行依赖反转原则是不可能也没有必要的,在实践中,要避免对依赖反转原则的过度设计,对于稳定可靠的底层模块(如系统和平台设施),或者本已将实现细节隐藏在稳定的抽象接口后面的底层模块,再做依赖反转就是完全没有必要的。

-------------This article is over, thank you for reading -------------