(译者序) Robert C. Martin - <<UML for Java Programmers>>
(P29)
每一个软件模块都具有三个职责:
1. 运行起来所完成的功能;
2. 应对变化;
3. 能够使其阅读者理解;
(P76) “在准备战役时,我发现计划本身总是无用的,但是做计划却是绝对必要的。” —— 艾森豪威尔;
(P83) 当同样的代码以稍有不同的形式一再出现时,就表示开发人员忽视了抽象;
(P87) 我们生活在一个需求不断变化的世界中,我们的工作是要保证我们的软件能够经受得住那些变化;
(P92) SRP是所有原则中最简单的原则之一,也是最难正确运用的原则之一;
(P94)
OCP - 使用“抽象”来实现;
模块可能对抽象体进行操作。由于模块依赖于一个固定的抽象体,所以它对于更改可以是封闭的。同时,通过从这个抽象体派生,可以扩展此模块的行为;
(P101)
OCP是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处:灵活性、可重用性以及可维护性;
开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象;
拒绝不成熟的抽象和抽象本身一样重要;
(P114)
OCP是OOD中很多说话的核心;
LSP是使OCP成为可能的主要原则之一;
(P115) DIP是框架设计的核心原则;
(P116) 每个较高层次都为它所需要的服务声明一个抽象接口。较低的层次实现了这些抽象接口。每个高层类都通过该抽象接口使用下一层。这样高层就不依赖于低层,低层反而依赖于在高层中声明的抽象服务接口;
(P117)
“依赖于抽象”:
1. 任何变量都不应该持有一个指向具体类的引用;
2. 任何类都不应该从具体类派生;
3. 任何方法都不应该重写它的任何基类中已经实现了的方法;
(P138) 构建模型就是为了弄清楚某些东西是否可行;
(P139) 当模型比要构建的真实实体便宜地多时,我们就会使用模型来研究设计;
(P179) UML中的所有箭头都指向源代码依赖的方向;
(P229) “优先使用对象组合而不是类继承”;
(P230)
Template Method - 使用继承来解决问题;
Strategy - 使用委托来解决问题;
(P323) 任何一行使用了new关键字的代码都违反了DIP;