首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Remove if语句

Remove if语句
EN

Stack Overflow用户
提问于 2019-12-21 15:41:42
回答 2查看 706关注 0票数 1

如果可以避免If语句,这被认为是一个很好的实践。

例如下面的代码:

代码语言:javascript
复制
if (a > 80) {
  a = 80;
}

可以变成这样:

代码语言:javascript
复制
a = Math.min(80, a);

这样,代码就被认为是更干净的,因为没有分支逻辑。

但是,对于像这样更复杂的问题,有什么方法可以避免:

代码语言:javascript
复制
if (array.length > 5) {
   array = array.reverse().join('');
} else {
   array = 'array is lte 5';
}

如果数组长度大于5,则反转它并连接它,否则返回"array is lte 5“。

这是一个简单的例子,但比第一个例子更复杂,而且很难删除if。

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

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

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

还可以想象一下下面的sudo代码:

代码语言:javascript
复制
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语句,但读起来和修改起来已经是一场噩梦了。

有没有可能使用数学和/或更清晰地表达它,避免分支。

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

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-12-21 16:20:11

除了三元运算符(这可能不会让事情变得更清晰),你考虑过提前返回吗?

代码语言:javascript
复制
if (!file_exists(file)) {
    return '';
}

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

return ...;

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

票数 2
EN

Stack Overflow用户

发布于 2019-12-21 18:06:38

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

这个伪代码:

代码语言:javascript
复制
if (file_exists(file)) {
   content = file_read(file);
   if (content.startsWith('config')) {
       ret = 'config:'; 
   } else if (content.endsWith(':app')) {
       ret = ':app';
   }  
} else {  
   ret = '';
}

可以替换为:

代码语言:javascript
复制
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();

请注意,上面的代码可以使用函数组合进行转换:

代码语言:javascript
复制
const ret =
  pipe(
    ifElse(file_exists, file_read, always('')),
    when(startsWith('config'), always('config:')),
    when(endsWith(':app'), always(':app')))
      (file)

当然,有人可能会说你执行了不必要的检查,但除非发现了性能问题,否则我总是更喜欢可读性而不是其他任何东西。

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

代码语言:javascript
复制
const ret =
  [file]
    .map(load_file_content)
    .map(when_starts_with('config'))
    .map(when_ends_with(':app'))
    .pop();

代码语言:javascript
复制
const ret =
  pipe(
    load_file_content,
    when_starts_with('config'),
    when_ends_with(':app'))
      (file)

我发现这是可读的,但其他人可能不是这样的?‍♂️

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59434398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档