您好,登錄后才能下訂單哦!
無論在iPhone開發還是學習的過程中都會看到一些不是很理想的代碼,不可否認自己也在不斷“貢獻”著這類代碼。面對一些代碼的“壞味道”,重構顯然是個有效的解決途徑。《iPhone開發重構》系列就想總結和補充iPhone開發中經歷的一些重構,其間可能會引用一些開源以及實際項目的代碼,本著對技術的探求,冒昧之處還請作者多多見諒。
記得剛開始做軟件開發的時候,我的導師就在一次函數設計的時候說:“函數粒度很重要,但即使我做了接近二十年的軟件,有時也無法很好把握粒度。這點就只可意會不可言傳了。”這句話可能一部分是出自謙虛,但更多是道出軟件開發的規律。當時我們無法去理解,現在開始慢慢理解。我們設計一個函數的時候,可能有時就按需設計了,比如需要獲取一個對年齡的文字提示的時候就設計一個getAgeTip()的函數,實現代碼如下:
重構前:
NSString* getAgeTip(int nBornYear, int nBornMonth, int nBornDay)
{
NSString* strRet = (@"");
int nAge = 0;
int nYear = ServerDate.serverYear;
int nMonth = ServerDate.serverMonth;
int nDay = ServerDate.serverDay;
nAge = nYear - nBornYear - 1;
if ((nMonth > nBornMonth) || (nMonth == nBornMonth && nDay > nBornDay)) {
++nAge;
}
nAge = MAX(nAge, 0);
if (nAge > 0 && nAge < 200) {
strRet = [NSString stringWithFormat:@"%d", nAge];
if (bWithUnit) {
strRet = [strRet stringByAppendingString:NDSTR(@"歲")];
}
}
return strRet;
}
但隨著開發的深入以及需求的變更,可能就會有一個獲取年齡的需求。這時候就會發現原來getAgeTip()函數中就有獲取年齡的邏輯,粒度太大了,無法實現復用。面對這種問題的時候就需要重新調整函數粒度,通過提取getAge()方法后重構代碼如下:
重構后:
NSString* getAgeTip(int nBornYear, int nBornMonth, int nBornDay)
{
NSString* strRet = (@"");
int nAge = getAge(nBornYear, nBornMonth, nBornDay);
if (nAge > 0 && nAge < 200) {
strRet = [NSString stringWithFormat:@"%d", nAge];
if (bWithUnit) {
strRet = [strRet stringByAppendingString:NDSTR(@"歲")];
}
}
return strRet;
}
int getAge(int nBornYear, int nBornMonth, int nBornDay)
{
int nAge = 0;
int nYear = ServerDate.serverYear;
int nMonth = ServerDate.serverMonth;
int nDay = ServerDate.serverDay;
nAge = nYear - nBornYear - 1;
if ((nMonth > nBornMonth) || (nMonth == nBornMonth && nDay > nBornDay)) {
++nAge;
}
nAge = MAX(nAge, 0);
return nAge;
}
其中,對內getAgeTip()調用了getAge(),對外用戶可以根據需要調用getAgeTip()或者getAge()。粒度細并合理的情況下,代碼的復用性和可讀性就大大提供了。但也不能太細了,這樣函數的數目就會“爆炸”從而影響了代碼維護。粒度的拿捏很重要,但卻很難,這需要在實踐中慢慢體會。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。