
1.2 软件设计原则
尽管本书没有涵盖面向对象的编程,但是一些面向对象的设计原则是通用的,可以应用于任何编程语言和编程范式。
在这里,我们将了解一些最著名的设计原则。具体地,我们将介绍以下内容:
·SOLID原则:单一职责原则、开放/关闭原则、里氏替换原则、接口隔离原则、依赖反转原则
·DRY原则:不要重复代码
·KISS原则:保持简单
·POLA原则:最小惊讶原则
·YAGNI原则:你不会需要它
·POLP原则:最小权限原则
让我们从SOLID原则开始!
1.2.1 SOLID原则
SOLID原则包括以下内容:
·S:Single Responsibility Principle(单一职责原则)
·O:Open/Closed Principle(开放/关闭原则)
·L:Liskov Substitution Principle(里氏替换原则)
·I:Interface Segregation Principle(接口隔离原则)
·D:Dependency Inversion Principle(依赖反转原则)
让我们来详细理解这些概念。
单一职责原则
单一职责原则规定,每个模块、类和函数都应对一个功能目标负责。你对其进行更改的原因应该只有一个。
单一职责原则的好处:
·开发人员可以在开发过程中专注于单个上下文
·每个组件都很小
·代码容易理解
·代码容易测试
开放/关闭原则
开放/关闭原则是指每个模块都对扩展开放,对修改关闭。这里有必要区分一下强化和扩展。强化是对现有模块的核心改进,而扩展是为提供附加功能而增加的组件。
开放/关闭原则的好处:
·现有组件可以被重用来增加新的功能
·组件之间是松耦合的,在不影响现有功能的情况下很容易将它们替换
里氏替换原则
里氏替换原则是指接受T类型的程序也可以接受S类型(它是T的子类型),而不会改变行为或预期结果。
里氏替换原则的好处:
·可以为参数中传递的任何子类型重用函数
接口隔离原则
接口隔离原则是指不应强迫客户端实现不需要使用的接口。
接口隔离原则的好处:
·软件的组件更具模块化和可重用性
·可以更轻松地创建新的实现
依赖反转原则
依赖反转原则是指高层次的类不应依赖于低层次的类,而是依赖于它实现。
依赖反转原则的好处:
·组件间更加解耦
·系统变得更加灵活,可以更轻松地适应变化。替换低级别的组件却不会影响高级别的组件
1.2.2 DRY原则
现在我们将介绍DRY原则:
·D:Don’t
·R:Repeat
·Y:Yourself
这个缩写是提醒开发人员重复代码是不好的。显然重复的代码经常是难以维护的,每当更改逻辑时,代码中的多个地方都会受到影响。
发现重复代码该怎么办?那就是消除重复,构建可从多个源文件重复使用的通用函数。另外,有时代码不是100%复制,而是90%相似。这是一种很常见的情况。在这种情况下,请考虑重新设计相关组件,可以将代码重构为公共接口。
1.2.3 KISS原则
让我们看一下KISS原则:
·K:Keep
·I:It(它即代码)
·S:Simple
·S:Stupid!
在设计软件时,我们通常喜欢超前考虑并尝试应对未来的各种情况。构建这种面向未来的软件的问题在于正确设计和编写代码需要花费更多的精力。这实际上是一个很难解决的问题,因为技术、业务和人员的变化,没有100%的面向未来的解决方案。而且,过度设计可能导致过多的抽象和间接性,使系统更难以测试和维护。
除此之外,在使用软件开发的敏捷方法时,我们认为更快、更高质量的交付胜过完美或过度的设计。保持设计和代码简单是每个开发人员都应牢记的一点。
1.2.4 POLA原则
我们来看下POLA原则:
·P:Principle
·O:Of
·L:Least
·A:Astonishment
POLA是指软件的组件应该易于理解,并且其行为绝不会给客户端带来惊喜(或更准确地说,是令客户端惊讶)。那我们该怎么做?
下面这几点需要牢记:
·确保模块、函数或函数自变量的名称清晰无误
·确保模块大小合适且维护良好
·确保接口小且易于理解
·确保函数具有较少的位置参数
1.2.5 YAGNI原则
让我们来看一下YAGNI原则:
·Y:You
·A:Aren’t
·G:Gonna
·N:Need
·I:It
YAGNI是指你只应开发当前所需的软件。该原则来自极限编程(XP)。极限编程的共同发起人Ron Jeffries在他的博客中写道:
始终在实际需要时才实现,永远不要在预见到你需要它时就实现。
有时,软件工程师倾向于觉得客户将来会需要某个功能而去开发,但一次又一次地被证明这不是开发软件的最有效方法。请考虑以下情形:
·因为客户永远不需要该功能,所以这块代码永远不会被用到。
·业务环境发生了变化,必须重新设计或更换系统。
·技术发生了变化,必须升级系统才能使用新的库、新的框架或新的语言。
最没有价值的软件是你还未编写的软件,因为你并不需要它。
1.2.6 POLP原则
现在看一下POLP原则
·P:Principle
·O:Of
·L:Least
·P:Privilege
POLP是指必须仅授予客户端访问其所需信息或函数的权限。POLP是构建安全应用程序的最重要支柱之一,并且已被亚马逊、微软和谷歌等云基础架构供应商广泛采用。
使用POLP原则有许多好处:
·敏感数据受到保护,不会暴露给没有权限的用户。
·由于测试用例数量有限,因此可以更轻松地测试系统。
·系统不太容易被滥用,因为只给出了有限的访问权限,并且接口也更加简单。
SOLID、DRY、KISS、POLA、YAGNI和POLP都只是一串软件设计原则的缩写词,它们在设计更好的软件时很有用。尽管SOLID原则来自面向对象的编程范式,但是SOLID的概念仍可以应用于其他语言和环境。在阅读本书的其余各章时,我鼓励你记住它们。
1.3节将介绍设计软件时的一些软件质量目标。