当我刚学会写代码的时候,自己也算是一个 DRY 狂魔,恨不得把能复用的都抽出公共 method 和 class。随着接触的项目越来越多,修改所谓 DRY 代码遇到各种麻烦,才开始意识到有些 DRY 是没有必要的,DRY 强迫症并不总是给项目可维护带来帮助。最近时不时看到有大牛谈论 DRY 的话题,虽然不完全认同,但也受到一些启发:
DRY code is least expensive to change when the change is universally applicable eg. all files
WET (duplicated) code is least expensive to change when the change only applies to one context eg. one file
how often are changes universally applicable? how often are they contextual?
I’d rather make an easy change to 3 files than a hard change to 1 file.
I’d rather make a hard change to 1 file than easy change to 20 files
大家在工作中一定遇到过这样的情况:有的代码虽然写的很工整,抽象得看起来很完美,但你拿到手上改起来却想骂娘;有些代码看起来不那么 DRY,但修改起来确实最容易的。
有时候,我们高估 WET 代码的修改困难程度,尤其是 Ruby、Python 这样动态语言,在没那么熟悉业务的情况下,大家还是通过编辑器全局搜索、替换,其实替换一处和替换 N 处的代价是相当的,而过于抽象或抽象不好的代码,遇到逻辑变化,你只能深入业务去改了,这是 Hard 模式…
另外一个经验是,新增和删除方法或功能是简单的,修改功能或方法是复杂的。
最后,该 DRY 还是要去 DRY 的,知道原则很重要,但知道什么时候打破原则更重要。
LINKS:
补个 link https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction