通过代码重复来应对需求变化
消除代码重复是绝大部分程序员矢志不渝追寻的目标。而在本文中,我们通过引入代码重复来解决开发中常见的需求变化。
代码重复
美国知名的软件工程师SandiMetz曾经说过一句很经典的话:
代码重复比错误的抽象伤害更小。(duplicationisfarcheaperthanthewrongabstraction)
或者说:
宁可代码重复,也不要错误的抽象。(preferduplicationoverthewrongabstraction)
代码重复比错误的抽象伤害更小
错误的抽象问题是非常普遍和棘手。我们经常在工作中发现下面的场景:A程序员看见了代码重复。A程序员提取了重复的代码并给它取了一个名字。这创建了一个新的抽象。它可以是一个新的方法,甚至可能是一个新的类。A程序员将重复的代码用新的抽象代替了。哈哈,代码是如此的完美。A程序员开心的跑开了。时间流逝。对于目前如此完美的抽象,有一个新的需求出现。B程序员被指派来完成这个需求。B程序员觉得有必要保留现有的抽象,但由于并不是在每种情况下都是完全相同的,他修改代码以接受一个参数,然后添加逻辑,根据该参数的值按条件去做正确的事情。曾经是通用抽象,现在根据不同情况而有不同的行为表现。现在又一个新的需求来了。X程序员又添加了一个额外参数,又一个新的条件。就这样循环下去直到代码无法理解。然后你出现在这个场景里,你的生活也发生了戏剧性的转折。
现存的代码具有强大的影响力。它的存在本身就表明它是正确的和必要的。我们知道代码代表了所花费的工作,并且我们非常有动力去保存这项工作的价值。不幸且可悲的事实是:代码越复杂、越难以理。也就是说,在创建代码时投入越多,我们就越会有保留这些代码的压力(沉没成本谬误)。就好像我们的潜意识告诉我们:天哪,这么如此让人迷惑,一定花了很长时间才弄好。这些代码必然非常非常重要。让所有的努力付诸东流将是一种罪过。
沉没成本谬误:人们往往不愿意正视持续增加投资未必会带来更多回报的事实,而选择铤而走险地持续对过去投资失败的项目增资,以逃避过去投资失败带来的反悔心理。
沉没成本谬误
当你出现在上面的第8步时,这种压力也可能会迫使你继续前进,也就是说,通过更改现有代码来实现新的需求。然而我们面临的残酷的现实是:代码不再代表一个单一且通用的抽象,而是变成了一个包含条件的过程,其中交织着许多模糊关联的思想。它很难理解且很容易打破。
如果你发现自己在这种情形下,不要被沉没成本所驱使。在处理错误的抽象时,最快的前进方法是回退。做以下几点:通过将抽象代码放回每个调用者来重新引入重复代码。在每个调用者中,使用错误抽象中传递的参数,来确定此不同调用者所需要调用的代码部分。删除不同调用者不需要的代码部分。
通过这样做消除了抽象和条件,并将每个调用者减少到仅它需要的代码。当你以这种方式回顾决策时,通常会发现虽然每个调用者表面上调用了一个共享抽象,但他们运行的代码却独一无二。一旦你完全删除了旧的抽象,你就可以重新开始,重新隔离重复代码并重新提取抽象。
在工作中人们勇敢地尝试以错误的抽象方式前进,但收效甚微。添加新功能变得非常困难,每次成功都会使代码更加复杂,这使得添加下一个功能更加困难。当他们将观点从我必须保留我们对这些代码的投入转变为这些代码对解决以前的问题是有阶段性意义的,但也许我们已经从中学到了我们所需要的一切,接着根据当前需求重新思考它们的抽象,一切都变得更容易了。一旦代码被放回调用者,前进的道路就变得显而易见,添加新功能变得更快、更容易。
故事中的场景的寓意是什么?不要被沉没成本谬误所困!如果你发现自己通过共享代码传递参数和添加条件路径,则标明抽象是错误的。也许这个抽象一开始可能是对的,但那一天已经过去了。一旦抽象被证明是错误的,最好的策略是重新引入代码重复,让它告诉你什么是正确的。虽然偶尔积累一些条件语句以深入了解正在发生的事情是有意义的,但如果你早点放弃错误的抽象,你会遭受更少的痛苦。
当抽象错误时,最快的前进方式就是回退。这不是退缩,而是朝着更好的方向前进。这样做,你不仅将改善自己的工作,也会改善所有追随者的工作。
参考资料:
https:sandimetz。comblog2016120thewrongabstraction
正装需要配丝袜吗?女生穿正装最好配丝袜。穿丝袜能让自己的腿看的更好看,更光滑,增加了正装的美感,更增加了女人的魅力。正装穿丝袜最重要的一点就是,给人带来的感觉是尊重礼貌。丝袜款式一定是长筒丝袜或者连
为什么说不要轻易从央企国企辞职?我在央企上班上下班都是按时只是倒班4班2倒下夜班休息两天今年平均月收入可以达到2万左右我觉得我很幸福老婆在某医院的护士月收入也可以达到1万5害羞害羞,所以不要轻易的从央企国企辞职外
聊城的新飞机场建在那里?重磅消息!4月中旬,聊城机场预选场址地震安全性评价项目竞争性磋商公告发布。根据相关资料披露,聊城民用机场预选址位于东昌府区郑家镇西南,总用地约4500亩。没想到聊城机场的预选址这么
有人说不要看不起小摊贩,他们的收入你无法想象,是真的吗?三百六十行,行行出状元!我身边就有一个朋友摆摊不到一年时间买房买车!大概是13年4月份的样子,广州增城新塘镇,为什么我会记得那么清楚呢,因为清明放假前还跟他吃了个饭,当时在聊想摆摊
现在的贷款中介该如何走下去?现在贷款中介要做好,简单说就是上线和下沉。飞刀做了二十年的银行小贷,有很多朋友做贷款中介,非常熟悉,有很强的发言权。1,上线小贷已经进入科技时代,大数据,客群画像,精准营销都是常见
踏板摩托车过了磨合期,一般都多少公里再换机油,我换的是全合成的?专业解析摩托车故障,精准推荐所需车型。大家好,我是骑士分享欢迎您的关注!摩托车润滑油的更换除了机油的品质以外,还应该考虑车辆的使用频率和所处环境,这两项指标对于润滑油的更换也是比较
杜锋带上6后卫征战世预赛,能排出哪些阵容?带6后卫,和内线锋线队员匹配,能排出好多阵容,下面笔者列举一二,如果有不同想法可以补充。一最强阵中锋周琦,大前锋周鹏,小前锋张镇麟,后卫郭艾伦赵继伟。这套阵容,应该是最强阵容,以辽
你认为现役国足最强阵容是怎样的?两场比赛打完,还是谈谈什么阵容合适吧,仁者见仁,智者见智,没有唯一正确答案,您就当个消遣在门将位置上我选择的是王大雷,曾诚的门线技术更加出色,但是短板就是开大脚和发动进攻的能力不足
王者荣耀问题为什么甄姬冰雪圆舞曲皮肤与原皮几乎没区别却卖史诗皮肤的价?感谢邀请你好,我是游戏开心说王者荣耀问题为什么甄姬冰雪圆舞曲皮肤与原皮几乎没区别却卖史诗皮肤的价?答首先开心很喜欢玩甄姬这个英雄,因为冰弹弹来弹去的非常给力,并且甄姬团控很强,但是
什么是用了iQOOZ5之后才知道的事?感谢邀请什么是用了iQOOZ5之后才知道的事?用了iQOOZ5这款手机之后,我发现原来手机续航的时间可以这么久。同时我觉得这也算是千元机手机中颜值最高的。当然最让我惊喜的是在散热方
如何运营亚马逊澳洲站?亚马逊澳洲站2017年上线,截至2020年,站点访问量增长了7倍之多。整个澳洲人口3000多万,相较于美国3。3亿的总人口确实不多,但是消费水平和美国差不多,物价方面比美国还要高,