原书:《代码精进之路 从码农到工匠》 | 作者:张建飞
4.1 SOLID 设计原则
SOLID 是 5 个设计原则开头字母的缩写,本身就有“稳定的”意思,寓意是 “尊从 SOLID 原则可以建立稳定、灵活、健壮的系统”
- Single Responsibility Principle (SRP): 单一职责原则
- Open Close Principle (OCP): 开闭原则
- Liskov Substiution Principle (LSP): 里氏替换原则
- Interface Segregation Principle (ISP): 接口隔离原则
- Dependency Inversion Principle (DIP): 依赖倒置原则
开闭原则、里氏替换原则是设计目标,其他 3 个是设计方法
4.7 DRY
DRY 是 Don’t Repeat Yourself 的缩写,特指在写代码时要避免重复代码,因为这样会降低代码的灵活性和简洁性, 并且可能导致代码之间的矛盾。
DRY 是 Andy Hunt 和 Dave Thomas 在 《The Pragmatic Programmer》中提出的核心原则。中文版《程序员修炼之道》
系统的每一个功能都应该有唯一的实现。也就是说,如果多次遇到同样的问题,就应该抽象出一个共同的解决方法,不要重复开发同样的功能。
贯彻 DRY 可以让我们避免陷入“散弹式修改 (Shotgun Surgery)”:由于代码重复而导致一个小小的改动,会牵扯很多地方。
4.8 YAGNI
You Ain’t Gonna Need It. 你不会需要它,出自 Ron Jeffries 的 《Extreme Programming Installed》中文版《解析极限编程》
8 本极限编程系列书:《解析极限编程 : 拥抱变化》、《规划极限编程》、《极限编程实践》、《极限编程研究》、《极限编程实施》、《探索极限编程》、《应用极限编程》、《极限编程基础、案例与实施》
YAGNI 是针对“大设计(Big Design)提出来的,是“极限编程”提倡的原则,是指你自以为有用的功能,实际上都是用不到的。因此,除了核心的功能之外,其他的功能一概不要提前设计,这样可以大大加快开发进程。 它背后的指导思想就是尽可能快、尽可能简单地让软件运行起来。
采用 YAGNI 并不表示完全不用预先考虑架构。总有一些时候,如果缺少预先的思考,重构会难以展开。 ——《重构 改善既有代码的设计(第 2 版)》2.6 重构、架构和 YAGNI
DRY 与 YAGNI 的冲突
- DRY 追求“抽象化”,要求找到通用的解决方法
- YAGNI 追求“快和省”,意味着不要把精力放在抽象化上面,因为很可能“你不会需要它”。
因此就有了 Rule of Three 原则。
4.9 Rule of Three
三次原则,是指当某个功能第三次出现时,就有必要进行“抽象化”了。
它是 Martin Fowler 在《重构》中提出的思想。
三次原则指导我们可以通过下列步骤写代码:
- 第一次用到某个功能时,写一个特定的解决方法。
- 第二次又用到的时候,复制上一次的代码。
- 第三次出现的时候,才着手“抽象化”,写出通用的解决方法。
这 3 个步骤是对 DRY 和 YAGNI 原则的折中,是代码冗余和开发成本的平衡点。
同时也提醒我们反思,是否做了很多无用的超前设计、代码是否开始出现冗余、是否要重新设计。
我觉得这个不靠谱,第三次出现的时候有可能是在第一次的 1 小时后、1 星期后、1 个月后、1 年后,那时还记得当初的代码吗?
4.10 KISS 原则
Keep It Simple and Stupid
简单是先发散、再收敛。在纷繁复杂中,把握问题的核心。背后有大量的艰辛和积累。
要分清简单和简陋。
4.11 POLA 原则
Principle of least astonishment. 最小惊奇原则。
写代码要简单易懂,不要时不时冒出个 “Surprise”。
《复杂》第 7 章 “度量复杂性”中使用“惊奇度”度量复杂度,“惊奇度”越高,复杂性越大。
如果减少“惊奇度”?规范和标准。