你一定见过这种开发者,或者干脆就是你自己。他们发现一个叫“不重复自己”的原则之后,脑子里某个开关啪地一声合上了,一种原始的冲动被唤醒。每段重复的字符串、每对看起来相似的功能、每一行在某种光线下押韵的代码,全都变成了道德瑕疵、职业污点、必须立刻消灭的烦恼根。
两个礼拜之后,他们的代码库活像一局叠叠乐,每一块木头都在承重,每一个模块都高度抽象,每一个函数都准备了六种参数组合来应对未来,而且——最关键的是——谁也看不懂了。恭喜,你成功达成了“不重复自己”,也成功打造了一个能毁灭接下来三个周五、外加所有人心情的系统。
![]()
“不重复自己”出自Andy Hunt和Dave Thomas的《程序员修炼之道》。原书给出的定义是:“系统中的每一份知识,都必须有单一、明确、权威的表示。”请注意这个词:知识。它不是代码,不是字符,更不是“眯着眼从房间那头看觉得有点像的一切东西”。这个原则要避免的是重复的意图和重复的业务逻辑,而不是像销毁证据一样把所有看起来一样的字符都清洗干净。偏偏从书页到键盘这一段路,许多人停止了阅读,开始像翻垃圾桶的浣熊一样疯狂做模式匹配:如果两行代码长得像,必须立刻合并,否则就是你道德破产、专业可疑,搞不好每日站会开太久也是你害的。
这哪是“不重复自己”,这分明是带着哲学学位的审美强迫症,还得加上一个闪闪发光的GitHub贡献图来证明自己。来看一个温和的例子:函数formatUserName和formatAuthorName,碰巧在今天长得一模一样,都是把姓和名拼成字符串。标准的DRY脑反应是:“这两个东西一样,抽走!”于是你得到一个可爱的小抽象函数formatName。乍看无害,就像干草丛里的篝火。六个月后,用户名要求加尊称,作者名却要笔名兜底,你那个精巧的formatName开始癌变,长成一个需要十五个参数的怪物,还配上一个叫NameFormattingStrategy的枚举类——这种函数得自带入职说明文档,能让新人当场转行。
当初的重复根本不是缺陷,不过是两个不同的东西,在一个普通的周二碰巧穿了一样的衣服。用户不是作者,他们的名字沿着不同的路线演变。重复的代码当时就在悄悄告诉你这件事,你却听成“重构机会”,随手搭了一座牢笼。再看一个过滤器:原来的getActiveAdminUsers三秒读完,DRY之后变成filterEntities,像个解谜盒,选项对象里还夹着limit。原本一眼就懂的业务意图,现在需要顺着参数表和谓词逻辑一路破译。
所以,下次再看见重复代码,别急着动手。它或许正替你守护着两条完全不同、不应被强行绑定的业务。一条好的规则,从来不是用来把代码变成无可理解的抽象拼图的。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.