代碼之丑(六)——分家的聲明和使用

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

  這是一段長長的C++代碼,我的問題是:relaPri、relaSec和 scoutBySec這三個變量在哪里用到了?

 
void DealForServiceA(const char *oprCode, const char *subID, const char *oID, XList *callCicsList) {
XString relaPri(“NULL”);
XString relaSec(“NULL”);
XString scoutBySec(“
0”);
XList
*tempList = new XList ;
callCicsList
->Add(tempList);
tempList
->Add(new XString(oprCode));
tempList
->Add(new XString(oID));
XString
*psTelNum = new XString;
tempList
->Add(psTelNum);
GetServnumberBySubsID(subID,
*psTelNum);
tempList
->Add(new XString(relaPri.table { font-size: 10pt;}c_str()));
tempList
->Add(new XString(relaSec.c_str()));
tempList
->Add(new XString(scoutBySec.c_str()));
}

  經過認真仔細的查看,或是使用傳說的中“查找”功能,我們發現上面提到的那三個變量只在最后用了一下。

  不知道你是否注意到,我在最初特意強調了一下這是C++代碼。這意味著,變量可以隨用隨聲明,而不必像傳統的C程序那樣,只能在函數的開頭把函數內部用到的變量一口氣聲明。 那么 ,我們就讓聲明和使用團聚吧!

 
XString relaPri(“NULL”);
tempList
->Add(new XString(relaPri.c_str()));
XString relaSec(“NULL”);
tempList
->Add(new XString(relaSec.c_str()));
XString scoutBySec(“
0”);
tempList
->Add(new XString(scoutBySec.c_str()));

  當聲明和使用走到一起,我們的觀察就有了新的視角,其實,這幾個變量完全是可以不聲明的,于是,代碼再進一步:

 
tempList->Add(new XString(“NULL”));
tempList
->Add(new XString(“NULL”));
tempList
->Add(new XString(“0”));

  看到這里,我們就可以看出原來的做法到底有多么浪費:浪費時間給變量起名字——我們都知道,起個好名字不容易,也 浪費了時間在執行上,修改前的代碼創建了兩個XString對象,而修改后,只創建了一個對象。

  或許,你會覺得,有個變量會讓我們了解這里實際上填加的內容到底是什么。不過,也許一個好的函數命名才是更好的選擇,比如addRelaPri。這個疑問會揭示出這段代碼存在另外一個問題,直接使用基本的數據結構而沒有進行封裝。不過,這不是這里討論的目標,就到此打住吧!

  根據這段代碼的調整,我們得出一條規則:

  • 代碼的聲明和使用應盡量接近。

  有的C程序員會暗自念叨,這個要求對C程序來說,簡直太不合情理了。好吧!我承認,從語言的角度來說,是這樣的。但是,我們需要仔細想想,為什么對于C語言來說,變量的聲明和使用會距離遙遠。通常,遙遠的背后意味著碩大的函數,這才是讓聲明和使用天各一方的重要原因。

  在干凈代碼的世界里,大函數永遠是不受歡迎的。為了讓聲明和使用盡早團聚,請把函數寫小。

  作者簡介:

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

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

0
0
 
標簽:重構
 
 

文章列表

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

    IT工程師數位筆記本

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