按抽象分层
软件系统由若干层组成,高层执行任务时需要借助底层提供的功能。
对一个系统分层的依据是什么?不同的抽象。
每个层应属于不同的抽象,层与层之间调用方法时,应会改变抽象。(好的设计)
如果层与层之间的抽象的区别不够大,说明太“浅”了:这意味着在增加了复杂度(加抽象层就是在增加复杂度)的前提下,却没有获得足够明显的好处(分层后应减少上层使用者对该系统的复杂度的认知)
分层的重点
让新增的每个方法都有它自己的(不会被其他方法替代)的职能。
正确使用接口复制(不同的方法具有同样的签名)的时机
- 各“相同”的接口提供了自己的功能:并非完全的一致。
- 多个方法实现同一接口可减少认知负荷,这些方法通常属于同一抽象层,相互之间不调用(为替代关系)。
装饰器模式
将一个已有的Obj包起来,扩展其功能(提供几乎一致的API,调用被包起来的Obj的对应方法)
在创建装饰器类前应思考是否真的有必要创建它:
- 能不能把新功能直接添加到原始类中(因为不够特殊)
- 能不能把新功能直接添加到用例中(因为足够特殊)
不要有太多层的装饰器:这很可能意味着层太浅了。
接口和实现
接口和实现的区别应足够大(表现为数据结构、表达方式等),这说明二者的抽象层次的差别足够大。
总结
在编程中引入任何元素(接口、参数、方法、类……)都会增加复杂度(有代价),因此在引入任何元素时都要思考:我引入它后能消除哪些复杂度(如通过封装隐藏了一些复杂度)。
网友评论