php编程代码简单的if语句,不用 If 语句的编程实例

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

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

Coding Tip: Try to Code Without If-statements

1790b5d6032e9f22ce4632344c19fc74.png

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函数,根据输入不同,做如下处理:若输入是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的条件判断。

相关推荐:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值