Chapter 4
1.代码的可读性/可理解性很多时候比效率/性能更重要,不可读/不可理解代码可能蕴含更多错误
2.SAP和SDP共同构成了包之间的“依赖倒置原则DIP”
SDP:依赖应该指向更稳定的方向
SAP:稳定性隐含着抽象
因此,依赖应该指向抽象的方向
Chapter 5
1.软件复用的两个方面:
-面向复用编程,开发出可复用的软件
-基于复用编程:利用已有的可复用软件搭建应用系统
2.软件复用的理由:
-降低成本和开发时间
-经过充分的测试,稳定、可靠
-标准化,在不同应用中保持一致
3.一个有很高的复用性的代码应该具备的特点:
-小、简单
-与标准兼容
-灵活可变
-可扩展
-泛型、参数化
-模块化
-变化的局部性
-稳定
-丰富的文档和帮助
... ...
4.代码复用类型:
白盒复用:源代码可见,可修改和扩展
黑盒复用:源代码不可见,不能修改
5.控制反转:
由第三方的容器来控制对象之间的依赖关系,而非传统实现中由代码直接操控
控制权由代码中转到了外部容器,带来的好处就是降低了对象之间的依赖程度,提高灵活性和可维护性
6.委派/委托:一个对象请求另一个对象的功能
如果子类只需要复用父类中的一小部分方法,可以不需要使用继承,而是通过委派机制来实现
7.子类型多态:客户端可以用同意的方式来处理不同的类型的对象
8.LSP原则:
-更强的不变量
-更弱的前置条件
-更强的后置条件
Chapter 6
1.可维护性:可扩展性、灵活性、可适应性、可管理性、支持性
2.评估模块性的5个标准:
可分解性、可组合性、可理解性、可持续性、出现异常之后的保护
3.模块化设计5个规则:
直接映射、尽可能少的接口、尽可能小的接口、显示接口、信息隐藏
4.OO设计原则:SOLID
SRP:单一责任原则
OCP:开放-封闭原则
LSP:Leskov替换原则 子类型必须能够替换其基类型
DIP:依赖转置原则
ISP:接口聚合原则
5.SRP:责任:变化的原因
不应该有多于一个的原因使得一个类发生变化
6.OCP:模块的行为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化,但模块自身的代码不应该被修改
对扩展性的开放,对修改的封闭
7.耦合:是对模块之间的从属关系的一种测定
如果两个模块中的一方改变了那另一方要跟着改变
耦合的程度由模块之间的借口(quantity)、每个借口的复杂性(由交流的类型决定)(quality)
8.凝聚、聚合:是对一个模块的可能性/和功能有关的健壮性的一种测定
9.好的设计:high cohesion low coupling
10.ISP:客户端不应该依赖于他们不需要的方法
11.DIP:抽象的模块不应依赖于具体的模块,具体应依赖于抽象
12.工厂方法模式:
创建对象不指定准确的类
13.抽象工厂模式:提供接口以创建一组相关/相互依赖的对象、但不需要指明其具体类
创建的不是一个完整产品,而是产品族
14.构造器模式:创建复杂对象,包含多个组成部分
15.桥接模式:
是OOP最基本的structural pattern,通过delegation + inheritance建立两个具体类之间的关系
16.组合模式:目的是在同类型的对象之间建立起树形层次结构
一个上层对象可包含多个下层对象
17.迭代器:以遍历的方式访问集合数据而无需暴露其内部表示,将遍历这项功能delegate到外部的iterator对象
18.visitor:在特定的ADT上执行某种特定操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活扩展/改变visitor的操作算法,而不影响ADT
19.Mediater:多个对象之间要进行交互,而是通过mediator实现消息的广播,从而将对象之间松散耦合,利于变化