将"if"语句反转以减少嵌套。

26 浏览
0 Comments

将"if"语句反转以减少嵌套。

当我在我的代码上运行ReSharper时,例如:

    if (某个条件)
    {
        一些代码...            
    }

ReSharper给我上面的警告(倒置“if”语句以减少嵌套),并建议以下更正:

   if (!某个条件) return;
   一些代码...

我想了解为什么这样更好。我一直认为在方法中间使用“return”有问题,有点像“goto”。

0
0 Comments

在编写代码时,有一个争议性的讨论,但我同意ReSharper的观点,即应该尽量减少嵌套。我认为这比函数中有多个返回路径的负面影响更重要。

减少嵌套的关键原因是改善代码的可读性和可维护性。记住,许多其他开发人员将来需要阅读你的代码,而缩进较少的代码通常更容易阅读。

"前提条件(Preconditions)"是一个很好的例子,可以在函数的开头提前返回。为什么函数的其余部分的可读性应该受到前提条件检查的影响呢?

至于从一个方法中多次返回的负面影响,调试器现在非常强大,很容易找出特定函数在何时何地返回。

多次返回一个函数不会影响维护程序员的工作。

而代码的可读性差会。

此外,通过使用“反转if”的方式,你可以将错误条件检查和错误处理紧密地放在一起。如果你采用其他方式,将会是if (good) do something; else correct/report。这样一来,人们立即就能看到错误和处理步骤。

在一个函数中有多个返回会影响维护程序员。当调试函数时,寻找错误返回值,维护人员必须在所有可能返回的地方设置断点。

难道你不能在方法的结束大括号上设置断点吗?

:我猜这种方法的问题在于,如果函数中有多个返回,如果你只在结束大括号上设置断点,你就不会知道它通过哪一个返回。

我会在开始大括号上设置断点。如果你逐步执行函数,不仅可以按顺序看到执行的检查,而且很明显可以看到函数在哪个检查点上运行。

我同意John的观点...我不认为只在函数最后设置断点有问题。如果你想知道一个函数返回什么,那么你将逐步执行该函数,看看为什么会返回这个值。如果你只想看它返回了什么,那就把断点放在最后一个大括号上就可以了。

0
0 Comments

在这段代码中,使用了嵌套的if语句来判断条件并返回相应的结果。尽管这种写法可以实现相同的功能,但会导致代码层级嵌套过深,可读性较差。为了提高代码的可读性和可维护性,可以采用反转if语句的方式来重构代码。

重构后的代码使用了多个return语句,通过一系列的条件判断来返回相应的结果。这样可以减少代码的层级嵌套,使代码更加清晰和易读。同时,这种重构方式也符合防御性编程的思想,即尽早发现错误并避免进一步执行无效的代码。

此外,还有人建议将第二个和第三个if语句改为else if,以增加代码的可读性。这样即使忽略了return语句,仍然能够清楚地知道下一个条件只有在前一个条件失败时才会被检查,即条件的顺序很重要。

有人提出了使用switch语句的方式来替代if语句。虽然这种方式也可以实现相同的功能,但在这个例子中可能并不适用,因为条件判断的逻辑并不是简单的相等关系。

总之,通过反转if语句并使用多个return语句来代替嵌套的if语句,可以提高代码的可读性和可维护性。这种重构方式符合防御性编程的思想,并且使代码更加清晰和易读。

0
0 Comments

文章标题:将“if”语句反转以减少嵌套的原因及解决方法

在编写代码时,“if”语句的嵌套是一种常见的现象。当嵌套的层数过多时,不仅影响代码的美观性,还会降低方法的可读性。为了提高代码质量,许多静态分析工具都将嵌套的层数作为评估指标之一。然而,对于是否允许方法有多个退出点,不同的开发者持有不同的观点。

一些人认为,方法应该只有一个退出点,以保持代码的简洁性。然而,另一些人认为,方法可以有多个退出点,并不会影响代码的质量。他们认为,在使用异常处理的语言中,几乎任何语句都可能抛出异常,因此方法中存在多个潜在的退出点是合理的。

从性能的角度来看,无论是使用嵌套的“if”语句还是反转后的“if”语句,理论上它们应该是等效的。在大多数编译器中,代码优化的能力已经非常强大,可以处理更复杂的情况。

关于是否应该使用单个退出点,不同的开发者有不同的观点。一些经验丰富的多线程开发者认为,单个退出点是很重要的。然而,这并不意味着单个退出点是绝对正确的做法,只是许多资深开发者认同的一种有价值的实践。

总之,是否反转“if”语句以减少嵌套的问题没有一个明确的答案。开发者需要根据代码库的实际情况来做出选择。如果一个函数只有几行代码,并且嵌套层数较多也不会影响代码的可读性。然而,如果一个函数有800行代码,那么嵌套应该尽量减少。此外,还有其他因素需要考虑。

参考链接:

- maximum nesting level

- static analysis tools

- ILNestingDepth

- Who needs it?

0