1. 程式人生 > >一而再,再而三(二)

一而再,再而三(二)

就是 com const 區間 整體 表達 clas 應該 完成

之前有整理過一些關於代碼重構的心得的文字:http://www.cnblogs.com/x3d/p/5797606.html , 其中主要想表達的意思是要做好一件事,需要這樣一而再、再而三的過程才行。

重構有整體和局部兩種情況,前次是講整體,這次主要講局部。

局部的重構,主要針對小範圍的代碼,可能是一個類、一個方法/函數,甚至只是函數中的一段代碼。局部的重構,往往具備更高的可操作性,大家在編程實踐過程中,也更有可能會意識到這點。

這裏先摘取一段業務代碼:

    if (code >= 16 && code <= 30) {
        termCode = '30d'
} ........ if (code >= 331 && code <= 365) { termCode = '365d' }

大致可以看出來這是關於根據時間範圍構造最終條件的判斷邏輯,分了12個區間。

這樣的代碼,在一個經過比較專業訓練的程序員看來,肯定是會覺得不行的,語句明顯不夠精煉,而且邏輯上有漏洞。

首先他確實完成了這個邏輯,是能夠交差了的。但過不了誰那一關?

我們知道一個目標,不要重復你自己,代碼應該越寫越少。越寫越少,有兩種解讀:一是經過不斷的代碼庫積累,可重用代碼越來越多,需要從頭寫的代碼是越來越少的;二是實現同一個功能所需的代碼應該越來越簡練、行數越來越少。

先按第二種解讀,這段代碼本身看看有沒有可以縮短的可能,答案是肯定有!

將邏輯提煉為數據結構,減少字面量,就接近真相了,比如像下面這樣改寫(代碼僅供演示,未執行測試):

    const dayRanges = [15, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 365];
    if (code < dayRanges[0] || code > dayRanges[dayRanges.length - 1]) {
        throw new Error('請選擇正確的時間範圍' );
    }
    for (let
i = 0; i < dayRanges.length; i++) { if ((code >= (dayRanges[i] + 1)) && (code <= dayRanges[i + 1])) { termCode = dayRanges[i + 1] + 'd'; break; } }

再按第一種解讀,就是要註重代碼的積累和重用,對這段代碼進行封裝,讓它盡量可以被重復使用,這樣總體代碼量肯定是變少的,而且可以預期的維護工作量變小。

exports.termCode = function(dayRanges, code) {
    if (code < dayRanges[0] || code > dayRanges[dayRanges.length - 1]) {
        throw new Error('請選擇正確的時間範圍' );
    }
    for (let i = 0; i < dayRanges.length; i++) {
        if ((code >= (dayRanges[i] + 1)) && (code <= dayRanges[i + 1])) {
            termCode = dayRanges[i + 1] + 'd';
            break;
        }
    }
};
module.exports = exports;
const lib = require('./lib');

const dayRanges = [15, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 365];
const code = 28;
const termCode = lib. termCode(dayRanges, code);

通過反復的主動的練習、實踐,把最單調的日常開發工作變得讓自己更有使命感、成就感。

一而再,再而三(二)