一个烹饪说明的重构

昨天烧晚饭的时候,我注意到包装盒上的烹饪说明里有个很有意思的事情:三种烹饪方法的第一步是一模一样的,都是 “If frozen, defrost in refrigerator overnight”:

同样的内容重复了三遍,这在不少程序员的眼里是很糟糕的写法。遇到这种重复的内容,而且已经满足了Rule of Three,他们一定会要把它提取出来,放到一个公共的地方。如果让他们来重构这个烹饪说明,他们会增加一个公共的 “准备工作” 模块,把 “If frozen, defrost in refrigerator overnight” 这句话放到 “准备工作” 里:

他们这么做的理由是:

  1. 这个烹饪说明显得更简洁了
  2. 这个烹饪说明更容易维护,下次如果要修改 “If frozen, defrost in refrigerator overnight”这句话,比如把它改成 “If frozen, defrost in refrigerator for 12 hours or more”,就只需要修改1个地方,而不是3个地方。

在程序员的世界里,当一个人提出不要 copy/paste 代码时,几乎是不会遇到什么反对的。但是,减少重复的代码并不是一条“第一性原理”,它并不是不言而喻、不证自明的。减少重复的代码只是一种手段,它的目的是减少问题、减少工作量。如果在多个地方重复同一段代码反而可以减少问题、减少短期和长期的工作量,那就应该让它去重复,不要去抽取出来。

重复有重复的好处。我在蚂蚁的时候,经常给周围的人转发一篇题为《Write code that is easy to delete》的文章。这篇文章有一个核心观点:增加重复可以减少依赖。减少依赖可以降低风险和减少工作量。如果我的代码在另外N个地方被引用了,下次我修改我的代码的时候就不得不加倍小心、三思而行,生怕我的改动导致别人的代码无法正常工作。

对于重复,我的观点是:如果有两个地方有同一段逻辑,或者同一段文本,我们不应该简单粗暴的直接挥舞 Don’t Repeat Yourself 的大棒。我们要问清楚:这几个地方是否必须要保持一致的?如果要,那么怎么确保它们是一致的?如果不一致了会有什么后果?我是不主张在团队里大张旗鼓的提倡 “以代码复用为荣,以copy/paste为耻“的。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s