代碼之丑——讓判斷條件做真正的選擇

來源: InfoQ  發布時間: 2010-11-21 21:49  閱讀: 400 次  推薦: 0   原文鏈接   [收藏]  
摘要:鄭曄,ThoughtWorks公司咨詢師,擁有多年企業級軟件開發經驗,熱衷于探索各種程序設計語言在真實軟件開發中所能發揮的威力,致力于探尋合理的軟件開發方式,加入ThoughtWorks公司后,投入到敏捷開發方法的實踐之中,為其他公司提供敏捷開發方法方面的咨詢服務。他的blog是夢想風暴。

  諸位看官,上代碼:

 
if (0 == iRetCode) {
this->SendPeerMsg("000", "Process Success", outRSet);
}
else {
this->SendPeerMsg("000", "Process Failure", outRSet);
}

  乍一看,這段代碼還算比較簡短。那下面這段呢?

 
if(!strcmp(pRec->GetRecType(), PUB_RECTYPE::G_INSTALL)) {
CommDM.jkjtVPDNResOperChangGroupInfo(
const_cast(CommDM.GetProdAttrVal(
"vpdnIPAddress",
&(pGroupSubs->m_ProdAttr))),
true);
}
else {
CommDM.jkjtVPDNResOperChangGroupInfo(
const_cast(CommDM.GetProdAttrVal(
"vpdnIPAddress",
&(pGroupSubs->m_ProdAttr))),
false);
}

  看出來問題了嗎?經過仔細的對比,我們發現,對于如此華麗的代碼,if/else的執行語句真正的差異只在于一個參數。第一段代碼,二者的差異只是發送的消息,第二段代碼,差異在于最后那個參數。

  看破這個差異之后,新的寫法就呼之欲出了,以第一段代碼為例:

 
const char* msg = (0 == iRetCode ? "Process Success" : "Process Failure");
this->SendPeerMsg("000", msg, outRSet);

  為了節省篇幅,我選擇了條件表達式。我知道,很多人不是那么喜歡它。如果if/else依舊是你的大愛,勇敢追求去吧!

  由這段代碼調整過程,我們得出一個簡單的規則:

  • 讓判斷條件做真正的選擇。

  這里判斷條件真正判斷的內容是消息的內容,而不是消息發送的過程。經過我們的調整,得到消息內容和和發送消息的過程嚴格分離開來。

  消除了代碼中的冗余,代碼也更容易理解,同時,給未來留出了可擴展性。如果將來iRetCode還有更多的情形,我們只要在消息獲取的時候進行調整就好了。當然,封裝成一個函數是一個更好的選擇,這樣代碼就變成了:

 
this->SendPeerMsg("000", peerMsgFromRetCode(iRetCode), outRSet);

  至于第二段代碼的調整,留給你練手了。

  這樣丑陋的代碼是如何從眾多代碼中脫穎而出的呢?很簡單,只要看到,if/else兩個執行塊里面的內容相差無幾,需要我們人工比字符尋找差異,恭喜你,你找到它了。

  相關文章:代碼之丑(二)——長長的條件

0
0
 
 
 

文章列表

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

    IT工程師數位筆記本

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