代碼之丑(四)——代碼找茬游戲

作者: dreamhead  發布時間: 2011-01-03 21:35  閱讀: 1460 次  推薦: 0   原文鏈接   [收藏]  

  這是一個找茬的游戲,下面三段代碼的差別在哪:

 
if (1 == insertFlag) {
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中看到的。

  不妨設想一下修改這些代碼時的情形:費盡九牛二虎之力,我終于找到該在哪改動代碼,然后改了。作為一個有職業操守的程序員,我知道別的地方也需要類似的修改。 于是,趁人不備,把剛做修改拷貝了一份,放到另外需要修改的地方。修改了幾個變量,編譯通過了。世界應該就此清凈,至少問題解決了。

  好吧!雖然這個程序員有職業操守的程序員,卻缺少了些職業技能,至少在揮舞著“拷貝粘貼”的錘子時,他沒有嗅到散發出的臭味。

  只要意識到壞味道,修改是件很容易的事,提出一個新函數即可:

 
void AddNode(List& retList, int insertFlag, int pos, Node& node) {
if (1 == insertFlag) {
retList.insert(pos, Node);
}
else {
retList.add(node);
}
}

  于是,原來那三段代碼變成了三個調用:

 
AddNode(retList, insertFlag, i, newCatalog);
AddNode(retList, insertFlag, m, newCatalog);
AddNode(retList, insertFlag, j, newPrivNode);

  當然,這種修改只是一個局部的微調,如果有更多的上下文信息,我們可以做得更好。

  重復,是最為常見的壞味道。上面這種重復實際上是非常容易發現的,也是很容易修改。但所有這一切的前提是,發現壞味道。長時間生活在這種代碼里面,我們會對壞味道失去嗅覺。更可怕的是,一個初來乍到的嗅覺尚靈敏的人意識到這個問題,那些失去嗅覺的人卻告誡他,別亂動,這挺好。

  趁嗅覺尚在,請堅持代碼正義。

  作者簡介:

  鄭曄,ThoughtWorks公司咨詢師,擁有多年企業級軟件開發經驗,熱衷于探索各種程序設計語言在真實軟件開發中所能發揮的威力,致力于探尋合理的軟件開發方式,加入ThoughtWorks公司后,投入到敏捷開發方法的實踐之中,為其他公司提供敏捷開發方法方面的咨詢服務。他的blog是夢想風暴

  查看原文:代碼之丑(四)

0
0
 
標簽:重構
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()