标签
design-principles
- 里氏替换:签名对了不代表能换
退款渠道的方法签名相同,调用方却可能得到不同的行为。通过冲正、结算回执和状态历史的例子,理解里氏替换的四类契约检查,以及类型、能力接口和契约测试各自能保护什么。
- 开闭原则:先判断代码会往哪里变
同一套退款模块,加渠道很轻松,加冲正操作却要改动多个实现。沿着这两种变化,比较接口与联合类型的取舍,理解开闭原则保护的范围,以及什么时候值得增加抽象。
- 单一职责:职责不是一件事,是一个会来提要求的人
单一职责常被讲成「一个类只做一件事」,这句话没法用来判断任何代码。Martin 2014 年把话说明白了:这条原则是关于人的。把退款服务里混在一起的四类需求拆开之后,会发现它只是内聚与耦合的另一种说法。
- 三种看不见的耦合,和一次搬了家的依赖
耦合常被简化成「数一数 import」。这个判据在最典型的违例上够用,在生产代码里常常失效——把直接调用换成事件总线之后,import 少了两行,依赖并没有消失,只是从编译器能看见的地方挪到了看不见的地方。
- 高内聚:内聚的 6 个等级和误判
内聚常被定义成「模块内部元素的相似程度」。这个判据在最明显的违例上够用——把互不相干的方法扔进一个工具类,谁都看得出问题。它在生产代码里常常失效:按渠道分支的 handler 名字高度相似,却落在 1974 年那份等级表的偏低位置。
- 七条设计原则不是一座金字塔
面向对象的七条设计原则常被画成一座层层递进的金字塔。逐条查过出处之后,这张图不成立——它们出自六拨互不相干的人,跨度二十二年,并且会在同一段代码上给出相反的建议。这是《编程思想》系列的序章。