代碼之丑(四)——代碼找茬游戲
這是一個找茬的游戲,下面三段代碼的差別在哪:
retList.insert(i, newCatalog);
} else {
retList.add(newCatalog);
}
if (1 == insertFlag) {
retList.insert(m, newCatalog);
} else {
retList.add(newCatalog);
}
if (1 == insertFlag) {
retList.insert(j, newPrivNode);
} else {
retList.add(newPrivNode);
}
答案時間:除了用到變量之外,完全相同。我想說的是,這是我從一個文件的一次diff中看到的。
不妨設想一下修改這些代碼時的情形:費盡九牛二虎之力,我終于找到該在哪改動代碼,然后改了。作為一個有職業操守的程序員,我知道別的地方也需要類似的修改。 于是,趁人不備,把剛做修改拷貝了一份,放到另外需要修改的地方。修改了幾個變量,編譯通過了。世界應該就此清凈,至少問題解決了。
好吧!雖然這個程序員有職業操守的程序員,卻缺少了些職業技能,至少在揮舞著“拷貝粘貼”的錘子時,他沒有嗅到散發出的臭味。
只要意識到壞味道,修改是件很容易的事,提出一個新函數即可:
if (1 == insertFlag) {
retList.insert(pos, Node);
} else {
retList.add(node);
}
}
于是,原來那三段代碼變成了三個調用:
AddNode(retList, insertFlag, m, newCatalog);
AddNode(retList, insertFlag, j, newPrivNode);
當然,這種修改只是一個局部的微調,如果有更多的上下文信息,我們可以做得更好。
重復,是最為常見的壞味道。上面這種重復實際上是非常容易發現的,也是很容易修改。但所有這一切的前提是,發現壞味道。長時間生活在這種代碼里面,我們會對壞味道失去嗅覺。更可怕的是,一個初來乍到的嗅覺尚靈敏的人意識到這個問題,那些失去嗅覺的人卻告誡他,別亂動,這挺好。
趁嗅覺尚在,請堅持代碼正義。
作者簡介:
鄭曄,ThoughtWorks公司咨詢師,擁有多年企業級軟件開發經驗,熱衷于探索各種程序設計語言在真實軟件開發中所能發揮的威力,致力于探尋合理的軟件開發方式,加入ThoughtWorks公司后,投入到敏捷開發方法的實踐之中,為其他公司提供敏捷開發方法方面的咨詢服務。他的blog是夢想風暴。
查看原文:代碼之丑(四)