現在開始,請嘗試盡量避免使用if語句來實現我們的業務
你可能會疑問不使用if有什麼好處?額~,可能也沒啥很明顯的好處,就是換個思考方式來解決問題。 if-else並沒有錯,但在某些情況下大量的if-else可能會降低程式碼可讀性。以下會列舉一些實例帶你感受其中的奧妙。
Coding Tip: Try to Code Without If-statements
已知一個整數型別數組,統計該數組中奇數的個數
const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];
if實作
let counter = 0; arrayOfIntegers.forEach((integer) => { const remainder = Math.abs(integer % 2); if (remainder === 1) { counter++; } }); console.log(counter);
非if實作
let counter = 0; arrayOfIntegers.forEach((integer) => { const remainder = Math.abs(integer % 2); // 偶数除2的余数为零,奇数的余数为一 counter += remainder; }); console.log(counter);
記:上述兩個例子,forEach是會改變原數組的,方法是可變的
,違背了當下所提倡的函數式程式設計immutable
理念,不用在意,不是本文關注點。兩個例子比較而言,if語句
的實作可能更具相容性,可以適應陣列元素是小數
的情況。若數組元素為浮點類型,第二個例子就無法正常使用。
實作函數,日期物件 new Date()
作為輸入,依照不同日期回傳當天是工作日
還是週末
。
if實作
const weekendOrWeekday = inputDate => { const day = inputDate.getDay(); if (day === 0 || day === 6) { return 'weekend'; } return 'weekday'; // Or, for ternary fans: // return (day === 0 || day === 6) ? 'weekend' : 'weekday'; }; console.log(weekendOrWeekday(new Date()));
非if實作
const weekendOrWeekday = (inputDate) => { const day = inputDate.getDay(); return weekendOrWeekday.labels[day] || weekendOrWeekday.labels['default']; }; weekendOrWeekday.labels = { 0: 'weekend', 6: 'weekend', default: 'weekday' }; console.log(weekendOrWeekday(new Date()));
有沒有註意到,if語句
中的數字代表哪天是週末,判定條件分佈的較為零散,我們需要做的是將數字和週末或工作日
類型對應起來,如範例2,可以使用一個物件或map來儲存對應關係。
上述兩個例子對比,可以明顯看出非if程式碼
實作具有更好的可讀性和擴展性
number 類型,做翻倍處理(5 => 10, -10 => -20)
string類型,重複每個字元('hello' => 'hheelloo')
function類型,呼叫執行兩次函數
array類型,對陣列的每個元素做
doubler處理
object類型,對物件的每個屬性做
doubler處理
#switch實作
const doubler = (input) => { switch (typeof input) { case 'number': return input + input; case 'string': return input .split('') .map(letter => letter + letter) .join(''); case 'object': Object.keys(input) .map(key => (input[key] = doubler(input[key]))); return input; case 'function': input(); input(); } }; console.log(doubler(-10)); console.log(doubler('hey')); console.log(doubler([5, 'hello'])); console.log(doubler({ a: 5, b: 'hello' })); console.log( doubler(function() { console.log('call-me'); }), );非
switch實作
const doubler = (input) => { return doubler.operationsByType[typeof input](input); }; doubler.operationsByType = { number: (input) => input + input, string: (input) => input .split('') .map((letter) => letter + letter) .join(''), function: (input) => { input(); input(); }, object: (input) => { Object.keys(input) .map((key) => (input[key] = doubler(input[key]))); return input; }, }; console.log(doubler(-10)); console.log(doubler('hey')); console.log(doubler([5, 'hello'])); console.log(doubler({ a: 5, b: 'hello' })); console.log( doubler(function() { console.log('call-me'); }), );和Challenge #2類似,將條件值聚合在一起做統一處理。 總結當
if-else的判斷條件較多時,將條件做集中處理(用object儲存其對應關係--條件做key,處理做value )。好處是增刪某個條件變得容易,程式碼更可讀,提倡使用
key-value對應來取代一部分的
if-else的條件判斷。
以上是不用 If 語句的程式設計實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!