|
|
武器一:复用(Reusability) |
代码的坏味道——解决方案蔓延
DRY原则
复用的方式——继承与组合
对象的粒度——迪米特法则
合理的封装
保持对象的高内聚
模式参考
-
简单工厂模式
-
原型模式
-
代理模式
-
门面模式
-
模板方法模式
阅读大师作品:
JUnit中对异常的重用
JUnit中的Assert断言
-
ASP.NET MVC中的Copy Constructor
-
泛型工厂类 |
|
如何实现扩展
- 利用继承实现扩展
- 利用组合实现扩展
- 利用继承与组合实现扩展
-
利用抽象实现扩展
模式参考
- 装饰器模式
- 访问者模式
- 策略模式
- 命令模式
- 状态模式
- 职责链模式
-
观察者模式
阅读大师作品
- JDK中线程的运用
- .NET中对文件流的处理 |
武器三:分离(Separation) |
职责分离
分离与抽象、依赖的解耦
分离体现的设计原则
-
单一职责原则
-
接口隔离原则
-
合成/聚合复用原则
对象的职责
- 如何定义职责
- 如何分解职责
-
如何抽象职责
分离的目标
- 分离变与不变
- 分离接口与实现
-
分离数据与行为
模式参考
- 工厂方法模式
- 建造者模式
- 桥接模式
- 迭代器模式
- MVC模式
-
分层架构模式
阅读大师作品
- JUnit中的职责委派
- JDK中对日志的处理
-
RuleParser |
武器四:变化(Change) |
封装变化
- 封装创建的变化
- 封装结构的变化
-
封装行为的变化
应对变化应遵循的原则
- 开放封闭原则
-
依赖倒置原则
解除具体依赖
- 配置文件与反射
- 表驱动法
- 依赖注入
-
惯例优于配置
隔离变化
- 通过分离隔离变化
- 通过抽象隔离变化
-
利用依赖注入隔离变化
模式参考
- 工厂方法模式
- 抽象工厂模式
- 装饰器模式
- 策略模式
-
命令模式
阅读大师作品
- NHibernate中对延迟加载的支持
-
JUnit中的TestListener |
武器五:简约(Simplicity) |
极限编程的KISS原则
根据场景驱动设计
避免设计过度
如何实现简约
- 封装有利于简约:职责的封装
- 继承有利于简约:职责的复用
-
多态有利于简约:职责的委派
简约的本质:简单+优雅
重构和精益求精
如何考量简约
- 可复用性
- 可扩展性
- 可测试性
-
可读性
模式参考
- 门面模式
- 调停者模式
- 适配器模式
-
入口模式
阅读大师作品
- JDBC中的DataSource
- NHibernate中的SessionFactory和Configuration
- LINQ中的DataContext |
武器六:一致(Coherence) |
软件结构的和谐与平衡
体现一致的方式
- 接口的一致——对于实现可替换
- 形式的一致——窥一斑而知全豹
- 调用的一致——客户可透明访问
-
解决方案的一致——团队合作的基石
惯例优于配置
Liskov替换原则
模式参考
-
适配器模式
- 合成模式
- 代理模式
- 门面模式
- 单例模式
-
空对象模式
阅读大师作品
- JUnit中的TestCase和TestSuit
- WCF的Endpoint |
武器七:间接(Indirection) |
以迂为直的设计思想
如何实现间接
- 职责的委派
- 职责的封装
-
职责的抽象
间接的目的
- 降低耦合
- 化繁为简
-
隐藏细节
模式参考
- 门面模式
- 代理模式
- 调停者模式
- 入口模式
- 资源库模式
-
分层架构模式
阅读大师作品
- .NET Remoting的客户端激活 |