首頁  >  文章  >  後端開發  >  不用 If 語句的程式設計實例

不用 If 語句的程式設計實例

小云云
小云云原創
2018-02-01 14:27:442085瀏覽

現在開始,請嘗試盡量避免使用if語句來實現我們的業務

你可能會疑問不使用if有什麼好處?額~,可能也沒啥很明顯的好處,就是換個思考方式來解決問題。 if-else並沒有錯,但在某些情況下大量的if-else可能會降低程式碼可讀性。以下會列舉一些實例帶你感受其中的奧妙。

   Coding Tip: Try to Code Without If-statements

不用 If 語句的程式設計實例

Challenge #1: 統計數值陣列中共有多少個奇數

已知一個整數型別數組,統計該數組中奇數的個數

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語句的實作可能更具相容性,可以適應陣列元素是小數的情況。若數組元素為浮點類型,第二個例子就無法正常使用。

Challenge #2: 判斷日期是週末還是工作日

實作函數,日期物件 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程式碼實作具有更好的可讀性和擴展性

Challenge #3: The doubler function ( here be dragons),翻譯不出來~Mont~

##實現一個doubler函數,根據輸入不同,做如下處理:

  1. 若輸入是

    number 類型,做翻倍處理(5 => 10, -10 => -20)

  2. 若輸入是

    string類型,重複每個字元('hello' => 'hheelloo')

  3. 若輸入是

    function類型,呼叫執行兩次函數

  4. 若輸入是

    array類型,對陣列的每個元素做doubler處理

  5. 若輸入是

    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基礎之elseif語句的程式碼實例總結

sql中的if語句詳解#

以上是不用 If 語句的程式設計實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn