第 4 章 设计原则

《代码精进之路 从码农到工匠》学习笔记目录

原书:《代码精进之路 从码农到工匠》 | 作者:张建飞

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 在《重构》中提出的思想。

三次原则指导我们可以通过下列步骤写代码:

  1. 第一次用到某个功能时,写一个特定的解决方法。
  2. 第二次又用到的时候,复制上一次的代码。
  3. 第三次出现的时候,才着手“抽象化”,写出通用的解决方法。

这 3 个步骤是对 DRY 和 YAGNI 原则的折中,是代码冗余和开发成本的平衡点。

同时也提醒我们反思,是否做了很多无用的超前设计、代码是否开始出现冗余、是否要重新设计。

我觉得这个不靠谱,第三次出现的时候有可能是在第一次的 1 小时后、1 星期后、1 个月后、1 年后,那时还记得当初的代码吗?

4.10 KISS 原则

Keep It Simple and Stupid

简单是先发散、再收敛。在纷繁复杂中,把握问题的核心。背后有大量的艰辛和积累。

要分清简单和简陋。

4.11 POLA 原则

Principle of least astonishment. 最小惊奇原则。

写代码要简单易懂,不要时不时冒出个 “Surprise”。

《复杂》第 7 章 “度量复杂性”中使用“惊奇度”度量复杂度,“惊奇度”越高,复杂性越大。

如果减少“惊奇度”?规范和标准。

comments powered by Disqus