删除if语句

问题描述 投票:1回答:2

如果可以避免使用陈述,则认为是一种好习惯。

例如此代码:

if (a > 80) {
  a = 80;
}

可以成为这个:

a = Math.min(80, a);

那样,由于没有分支逻辑,因此该代码被认为更干净。

但是有什么方法可以避免类似这样的更复杂的问题:

if (array.length > 5) {
   array = array.reverse().join('');
} else {
   array = 'array is lte 5';
}

如果数组长度为> 5,则将其反转并加入,否则返回“ array is lte 5”。

这是简单的示例,但比第一个示例复杂,如果删除,则很难删除。

数学如何处理分支,是否有可能在数学中表达这种逻辑。

我可以将其提取到单独的方法中,但是它只会在方法本身中移动if语句,而不会将其删除。

我可以想象我可以使用Ramdajs中的某些函数,但是我没有找到合适的函数,即使我找到了一个,我也猜想它是否会存在-它只会被抽象。

也想像一下这个sudo代码:

if (file_exists(file)) {
   content = file_read(file);
   if (content.startsWith('config')) {
       ret = 'config:'; 
   } else if (content.endsWith(':app')) {
       ret = ':app';
   }  
} else {  
   ret = '';
}

此代码只有2个if语句,但已经成为阅读和更改的噩梦。

是否有可能使用数学和/或更明确地表达它以避免分支。

我知道数学上没有“读取文件”,但这只是一个例子。

谢谢

javascript if-statement ramda.js
2个回答
2
投票

除了三元运算符(可能不会使事情更清晰),您是否考虑过提前回报?

if (!file_exists(file)) {
    return '';
}

content = file_read(file);
if (content.startsWith('config')) {
    return 'config:'; 
}
if (content.endsWith(':app')) {
    return ':app';
}

return ...;

幕后仍然会有同样多的分支逻辑,但是通过这种方式,您可以在逻辑上彼此解开语义上不同的代码块。


0
投票

一种方法是将需要操作的东西放在一个“盒子”中,在该盒子上应用一系列操作(即功能)。这迫使您删除所有嵌套条件。

此伪代码:

if (file_exists(file)) {
   content = file_read(file);
   if (content.startsWith('config')) {
       ret = 'config:'; 
   } else if (content.endsWith(':app')) {
       ret = ':app';
   }  
} else {  
   ret = '';
}

可以替换为:

const ret =
  [file]
    .map(x => file_exists(x) ? file_read(x) : '')
    .map(x => x.startsWith('config') ? 'config:' : x)
    .map(x => x.endsWith(':app') ? ':app' : x)
    .pop();

注意,以上内容可以使用函数组合进行转换:

const ret =
  pipe(
    ifElse(file_exists, file_read, always('')),
    when(startsWith('config'), always('config:')),
    when(endsWith(':app'), always(':app')))
      (file)

当然可以说您执行了不必要的检查,但是除非发现了性能问题,否则我总是会优先考虑可读性。

我们可以在这里提高可读性吗?我们当然可以尝试:

const ret =
  [file]
    .map(load_file_content)
    .map(when_starts_with('config'))
    .map(when_ends_with(':app'))
    .pop();

const ret =
  pipe(
    load_file_content,
    when_starts_with('config'),
    when_ends_with(':app'))
      (file)

[我觉得这可读,但其他人可能不懂

© www.soinside.com 2019 - 2024. All rights reserved.