一而再,再而三(二)
阿新 • • 發佈:2018-05-06
就是 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);
通過反復的主動的練習、實踐,把最單調的日常開發工作變得讓自己更有使命感、成就感。
一而再,再而三(二)