Kent Beck提出了简单设计的四条原则:
- 通过测试
- 消除重复 | 揭示意图
- 最少元素
并提到他们的优先级顺序依次降低。什么意思呢,就是说你可以违背其中一条原则,但前提是你是为了满足优先级更高的选择。举个例子,我增加了一个常量,我重构的过程中,增加了一个常量,违背了最后一条,但我是为了消除魔鬼数字,揭示代码意图,所以我是可以这么做的。
优先级容易理解,但问题来了,消除重复和揭示意图他也没有明确说哪个就一定比哪个高。以至于业界存在两派,A说消除重复优先级更高,B说揭示意图优先级更高。本来设计就是一个较抽象的概念,所以受优先级左右的初学者,可能有点不知如何是好。
写代码,最好的方式就是实践法。心里兜着这四条原则后,多有意识留意在你写过的项目代码中,到底那条更加优先。或者去找一些编码经验丰富的朋友聊一聊。
我自己也试过。但我试之前心里是有一个倾向的,因为我个人偏好,我认为重复是万恶之源,所以我心里把它放在更前。但实际上,我在项目代码中很少碰到我因为消除了重复而不揭示意图的,也很少要通过重复来表达意图的,很多时候重复会天然让人感到困惑 -- 为什么要写一样的逻辑呢?所以我也没觉得这两条会有什么冲突,只是因为重复造成的修改成本较高,我觉得应该尽可能消除重复。
后来,测试写多了,发现在测试代码中,我会留一定的重复,不会偏执狂般去消除重复。在测试中,有一种坏味道叫逻辑分割,这个会让我不得不在测试中跳来跳去,所以我做了另一种权衡。
关于这两条,你又是怎么看的呢?
网友评论