代碼之丑(六)——分家的聲明和使用
這是一段長長的C++代碼,我的問題是:relaPri、relaSec和 scoutBySec這三個變量在哪里用到了?
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程序那樣,只能在函數的開頭把函數內部用到的變量一口氣聲明。 那么 ,我們就讓聲明和使用團聚吧!
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(“0”));
看到這里,我們就可以看出原來的做法到底有多么浪費:浪費時間給變量起名字——我們都知道,起個好名字不容易,也 浪費了時間在執行上,修改前的代碼創建了兩個XString對象,而修改后,只創建了一個對象。
或許,你會覺得,有個變量會讓我們了解這里實際上填加的內容到底是什么。不過,也許一個好的函數命名才是更好的選擇,比如addRelaPri。這個疑問會揭示出這段代碼存在另外一個問題,直接使用基本的數據結構而沒有進行封裝。不過,這不是這里討論的目標,就到此打住吧!
根據這段代碼的調整,我們得出一條規則:
- 代碼的聲明和使用應盡量接近。
有的C程序員會暗自念叨,這個要求對C程序來說,簡直太不合情理了。好吧!我承認,從語言的角度來說,是這樣的。但是,我們需要仔細想想,為什么對于C語言來說,變量的聲明和使用會距離遙遠。通常,遙遠的背后意味著碩大的函數,這才是讓聲明和使用天各一方的重要原因。
在干凈代碼的世界里,大函數永遠是不受歡迎的。為了讓聲明和使用盡早團聚,請把函數寫小。
作者簡介:
鄭曄,ThoughtWorks公司咨詢師,擁有多年企業級軟件開發經驗,熱衷于探索各種程序設計語言在真實軟件開發中所能發 揮的威力,致力于探尋合理的軟件開發方式,加入ThoughtWorks公司后,投入到敏捷開發方法的實踐之中,為其他公司提供敏 捷開發方法方面的咨詢服務。他的blog是夢想風暴。
查看原文:代碼之丑(六)