当前位置:Gxlcms > PHP教程 > 不用If语句的编程实例

不用If语句的编程实例

时间:2021-07-01 10:21:17 帮助过:36人阅读

现在开始,请尝试尽量避免使用if语句来实现我们的业务

你可能会疑问不使用if有什么好处?额~,可能也没啥很明显的好处,就是换种思考方式来解决问题。if-else并没有错,但在某些情况下大量的if-else可能会降低代码可读性。下面会列举一些实例带你感受其中的奥妙。

Coding Tip: Try to Code Without If-statements

Challenge #1: 统计数值数组中共有多少个奇数

已知一个整数类型数组,统计该数组中奇数的个数

  1. const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];

if实现

  1. let counter = 0;
  2. arrayOfIntegers.forEach((integer) => {
  3. const remainder = Math.abs(integer % 2);
  4. if (remainder === 1) {
  5. counter++;
  6. }
  7. });
  8. console.log(counter);

非if实现

  1. let counter = 0;
  2. arrayOfIntegers.forEach((integer) => {
  3. const remainder = Math.abs(integer % 2);
  4. // 偶数除2的余数为零,奇数的余数为一
  5. counter += remainder;
  6. });
  7. console.log(counter);

记: 上述两个例子,forEach是会改变原数组的,方法是可变的,违背了当下所提倡的函数式编程immutable理念,不用在意,不是本文关注点。两个例子比较而言,if语句的实现可能更具兼容性,可以适应于数组元素是小数的情况。若数组元素为浮点类型,第二个例子就无法正常使用。

Challenge #2: 判断一个日期是周末还是工作日

实现一个函数,日期对象 new Date()作为输入,根据不同日期返回当天是工作日还是周末

if实现

  1. const weekendOrWeekday = inputDate => {
  2. const day = inputDate.getDay();
  3. if (day === 0 || day === 6) {
  4. return 'weekend';
  5. }
  6. return 'weekday';
  7. // Or, for ternary fans:
  8. // return (day === 0 || day === 6) ? 'weekend' : 'weekday';
  9. };
  10. console.log(weekendOrWeekday(new Date()));

非if实现

  1. const weekendOrWeekday = (inputDate) => {
  2. const day = inputDate.getDay();
  3. return weekendOrWeekday.labels[day] ||
  4. weekendOrWeekday.labels['default'];
  5. };
  6. weekendOrWeekday.labels = {
  7. 0: 'weekend',
  8. 6: 'weekend',
  9. default: 'weekday'
  10. };
  11. 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实现

  1. const doubler = (input) => {
  2. switch (typeof input) {
  3. case 'number':
  4. return input + input;
  5. case 'string':
  6. return input
  7. .split('')
  8. .map(letter => letter + letter)
  9. .join('');
  10. case 'object':
  11. Object.keys(input)
  12. .map(key => (input[key] = doubler(input[key])));
  13. return input;
  14. case 'function':
  15. input();
  16. input();
  17. }
  18. };
  19. console.log(doubler(-10));
  20. console.log(doubler('hey'));
  21. console.log(doubler([5, 'hello']));
  22. console.log(doubler({ a: 5, b: 'hello' }));
  23. console.log(
  24. doubler(function() {
  25. console.log('call-me');
  26. }),
  27. );

switch实现

  1. const doubler = (input) => {
  2. return doubler.operationsByType[typeof input](input);
  3. };
  4. doubler.operationsByType = {
  5. number: (input) => input + input,
  6. string: (input) =>
  7. input
  8. .split('')
  9. .map((letter) => letter + letter)
  10. .join(''),
  11. function: (input) => {
  12. input();
  13. input();
  14. },
  15. object: (input) => {
  16. Object.keys(input)
  17. .map((key) => (input[key] = doubler(input[key])));
  18. return input;
  19. },
  20. };
  21. console.log(doubler(-10));
  22. console.log(doubler('hey'));
  23. console.log(doubler([5, 'hello']));
  24. console.log(doubler({ a: 5, b: 'hello' }));
  25. console.log(
  26. doubler(function() {
  27. console.log('call-me');
  28. }),
  29. );

和Challenge #2类似,将条件值聚合在一起做统一处理。

总结

if-else的判断条件较多时,将条件做集中处理(用object存储其对应关系--条件做key,处理做value)。好处是增删某个条件变得容易,代码更加可读,提倡使用key-value对应来取代一部分的if-else的条件判断。

相关推荐:

谈谈if语句的现状、前景与机遇

php基础之elseif语句的代码实例汇总

sql中的if语句详解

以上就是不用 If 语句的编程实例的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行