Javascript 删除if语句

Javascript 删除if语句,javascript,if-statement,ramda.js,Javascript,If Statement,Ramda.js,如果可以避免声明,则认为这是一种良好的做法 例如,此代码: 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

如果可以避免声明,则认为这是一种良好的做法

例如,此代码:

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,则将其反转并加入,否则返回“阵列为lte 5”

这是一个简单的示例,但比第一个示例更复杂,并且很难删除

数学是如何处理分支的,是否有可能用数学来表达这种逻辑

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

我可以想象,我可以使用Ramdajs中的一些函数,但我没有找到合适的函数,即使我找到了一个,我猜if也会在那里——它只是抽象的

再想象一下这个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语句,但阅读和更改已经是一场噩梦

是否可以使用数学和/或更清楚地表达它,避免分支

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


谢谢

除了三元运算符(这可能不会让事情变得更清晰)之外,您是否考虑过提前返回

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

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

return ...;

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

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

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

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

return ...;

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

一种方法是将您需要操作的东西放在一个“盒子”中,在这个盒子上应用一系列操作(即函数)。这将强制您删除任何嵌套条件

此伪代码:

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=
烟斗(
如果ELSE(文件_存在,文件_读取,始终(“”)),
当(startsWith('config')、始终('config:'))时,
当(endsWith(':app')、始终(':app'))
(档案)
当然,有人可能会说您执行了不必要的检查,但除非发现了性能问题,否则我总是倾向于可读性而不是其他任何东西

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

const-ret=
[文件]
.map(加载文件内容)
.map(当用('config')启动时)
.map(当以(':app')结尾时)
.pop();

const-ret=
烟斗(
加载文件内容,
当_以('config')开头时,
当以(':app')结尾时
(档案)

我发现这是可读的,但其他人可能不是这样一种方法是将需要操作的东西放在一个“盒子”中,在这个盒子上应用一系列操作(即函数)。这将强制您删除任何嵌套条件

此伪代码:

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=
烟斗(
如果ELSE(文件_存在,文件_读取,始终(“”)),
当(startsWith('config')、始终('config:'))时,
当(endsWith(':app')、始终(':app'))
(档案)
当然,有人可能会说您执行了不必要的检查,但除非发现了性能问题,否则我总是倾向于可读性而不是其他任何东西

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

const-ret=
[文件]
.map(加载文件内容)
.map(当用('config')启动时)
.map(当以(':app')结尾时)
.pop();

const-ret=
烟斗(
加载文件内容,
当_以('config')开头时,
当以(':app')结尾时
(档案)

我觉得这是一个可读的问题,但其他人可能不是这样,尽管这是一个有趣的问题——因此我投票支持它——我认为这不是一个好问题,因为除了哲学价值之外,它还可以帮助您编写更好的代码。用最少的if语句编写代码是不争的。你认为
Math.min()
没有分支逻辑吗?此外,您可以始终使用
来获得更简洁的代码:
array=array.length>5?array.reverse().join(“”):“数组是lte 5”谢谢,这是正确的,我不是说“如果”不好,但如果我们能写更多可读性的代码,它会更好。@niry,是的,但在最后一个例子中,它会很难读:a?(b)(c?d:f):f如果有超过1条if语句,那么if的可读性会更高。虽然这是一个有趣的问题,因此我投了赞成票,但我不认为这是一个好问题,因为除了哲学价值之外,它还可以帮助你编写更好的代码。用最少的if编写代码是无可厚非的语句。你认为
Math.min()
没有分支逻辑吗?另外,你可以使用
来获得更简洁的代码:
array=array.length>5?array.reverse().join(“”):'array is lte 5';
谢谢,这是正确的,我不说“如果”是不好的,但如果我们能写出更可读的代码,那就更好了。@niry,是的,但在最后一个例子中,读起来会非常困难:a?(b?(c?d:f):f如果有超过1个if语句,那么if的可读性会更好。这更可读,但有人说多个返回语句被认为是不好的做法,因为每个函数都应该有一个退出点,而其他人则相反。就心智模型能力而言,一个退出点绝对不会给你任何东西。in种语言,在这些语言中,您必须进行资源管理,并且没有像Java的
最终可用的结构,这是另一种情况,在那里我可以粗略地建议使用
do{}while(false)
循环
b