中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iPhone開發重構:提取方法以調整函數粒度

發布時間:2020-06-21 00:04:49 來源:網絡 閱讀:577 作者:benjielin 欄目:開發技術

 

 

    無論在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 &gt; 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 &gt; nBornDay)) {
        ++nAge;
    }
    nAge = MAX(nAge, 0);

    return nAge;
}

 

   其中,對內getAgeTip()調用了getAge(),對外用戶可以根據需要調用getAgeTip()或者getAge()。粒度細并合理的情況下,代碼的復用性和可讀性就大大提供了。但也不能太細了,這樣函數的數目就會“爆炸”從而影響了代碼維護。粒度的拿捏很重要,但卻很難,這需要在實踐中慢慢體會。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁都县| 马公市| 峨眉山市| 洮南市| 临洮县| 渭源县| 工布江达县| 名山县| 广宁县| 邵武市| 玛多县| 扎囊县| 五指山市| 泰来县| 昌江| 晋江市| 沙雅县| 胶州市| 陕西省| 通道| 平潭县| 涪陵区| 囊谦县| 枣强县| 东山县| 沅江市| 东乡县| 鹰潭市| 义乌市| 旅游| 焉耆| 新龙县| 永宁县| 新郑市| 乡宁县| 锡林郭勒盟| 镇赉县| 邯郸市| 商河县| 额济纳旗| 黄陵县|