【问题标题】:Multiple return statement in java [closed]java中的多个return语句[关闭]
【发布时间】:2018-05-15 11:39:02
【问题描述】:
private void test() {           
        // Nested if block 
        if (true) { // If condition is true
            if (true) { // If condition is true
                if (true) { // If condition is true
                    if (true) { // If condition is true
                         // statement
                    }
                }
            }
        }

        // Above block breaking in below way
        // Breaking nested if in multiple with return statement
        if (false) { // If condition is false
            return;
        }

        if (false) { // If condition is false
            return;
        }

        if (false) { // If condition is false
            return;
        }

        if (false) { // If condition is false
           return;
        }
    }

OOP 建议使用多个 return 语句是个坏主意。但是如果我使用多个嵌套的 if 那么它看起来非常复杂。 请建议使用嵌套 if 条件的最佳方法

【问题讨论】:

  • 当你嵌套了太多的 if 语句时,这通常是一个非常明显的信号,表明你的函数做得太多了。尝试将您的方法重构为更小的部分(方法),每个部分都有自己的特定功能。
  • "OOPs 建议多个 return 语句是个坏主意。"我个人认为这是被夸大的教条。它可能表明方法做得太多,但它通常是编写没有做得太多的方法的最简单方法。
  • 如果您的方法执行起来可能很昂贵,那么当您的部分验证失败时,尽早return 会很有帮助。因此,在方法中尽早完成时,if(false){return;} 可能会提高代码的性能。

标签: java


【解决方案1】:

另一种选择:

if (condition || condition || condition)
    return;

或两者之一

if (condition && condition && condition) {
    statement's
}

显然,每个条件都可能在自己的行中。这仅取决于条件,具体在做什么,......以及不知何故还取决于您想要“表达”的内容。

【讨论】:

    【解决方案2】:

    多个return 语句本身没有好坏之分。
    早期返回和快速失败原则是不错的编码方式,但它们依赖于多个 return 语句。
    有一点很重要:一致性和代码可读性。

    您的第二种方式使用“提前返回”模式:

    if (false) { // If condition is false
        return;
    }
    
    if (false) { // If condition is false
        return;
    }
    
    if (false) { // If condition is false
        return;
    }
    
    if (false) { // If condition is false
       return;
    }
    

    现在没有什么可以阻止您通过删除重复来改进此代码: if (...) returns ...;
    滥用这些确实会导致产生可读性较差的代码,因为太多的噪音和分散的规则。

    您的示例实在太抽象,无法提供具体答案。
    因此,假设您的多个条件语句依赖于要评估的特定类的对象。

    在这种情况下,您可以将条件语句存储在 List 中并对其进行迭代以应用每个规则。一旦一个无效,你就退出。

    List<Predicate<MyObject>> predicates = Arrays.asList(MyObject::isValid, 
                                                        (m)-> m.getColor()==BLUE);
    

    现在应用规则:

    MyObject myObj = ...;
    for (Predicate<MyObject> predicate : predicates) {
        if (!predicate.test(myObj)) {
          return false;
        }
    }
    

    【讨论】:

      【解决方案3】:

      了解没有一成不变的规则。 (软件)工程总是关于平衡不同的要求/规则。

      在您的情况下:选项 2,使用多个返回语句显然对于人类读者来说更容易理解。

      从这个意义上说:去吧。因为这个解决方案在 single layer of abstraction 原则方面也工作得更好!

      但我也同意 cmets - 冗长的 if/else 检查序列通常是设计不足的症状。不需要完全放弃ifs(请参阅here)-但假设您主要关心的是提高当前代码的质量,您应该花时间研究这个问题为什么会出现该方法中有这么多 if 语句

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 2016-05-17
        • 2023-03-27
        • 2014-02-28
        • 2016-11-29
        • 2021-09-28
        • 2015-08-03
        相关资源
        最近更新 更多