编程技能:尝试不必 If 语句编程

Coding Tip: Try to Code Without If-statements

《编程技能:尝试不必 If 语句编程》

如今最先,请尝试只管防止运用if语句来完成我们的营业

你能够会疑问不运用if有什么优点?额~,能够也没啥很显著的优点,就是换种思索体式格局来解决问题。if-else并没有错,但在某些状况下大批的if-else能够会下降代码可读性。下面会枚举一些实例带你感觉个中的玄妙。

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),翻译不出来~尬~

完成一个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的前提推断。

【开辟环境引荐】
Cloud Studio 是基于浏览器的集成式开辟环境,支撑绝大部分编程言语,包含 HTML5、PHP、Python、Java、Ruby、C/C++、.NET 小顺序等等,无需下载安装顺序,一键切换开辟环境。 Cloud Studio供应了完全的 Linux 环境,而且支撑自定义域名指向,动态盘算资本调解,能够完成种种运用的开辟编译与布置。

    原文作者:一歩
    原文地址: https://segmentfault.com/a/1190000013036227
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞