当一个声明被称为单入/单出退出时,它不是?

时间:2013-06-25 10:48:00

标签: java

我不确定我是否能很好地使用它,例如,Java中的if语句被称为单入口/单出口语句。 在条件为真的情况下,这被认为是单入口点,如果错误则认为是单出口点吗?

if(someCondition)
   doSomething();

- (单项/单项退出)语句的示例是什么?

4 个答案:

答案 0 :(得分:12)

一个退出点方法(单退出):

public int stringLength(String s) {
  return s.length();
}

两个出口点方法:

public int stringLength(String s) {
  if(s == null) {
    return 0;
  }
  return s.length();
}

以下是Martin Fowler的书 Refactoring 的引用:

  

当我和一个程序员一起工作时,我经常发现我使用Replace Nested Conditional和Guard Clauses,这个程序员被教导只有一个入口点和一个出口点。一个入口点是由现代语言强制执行的,一个出口点实际上并不是一个有用的规则。清晰度是关键原则:如果方法在一个出口点更清晰,则使用一个出口点;否则

以及上述陈述的说明,比较这两种方法的代码:

double getPayAmount() { 
    double result; 
    if (_isDead) result = deadAmount(); 
    else {
        if (_isSeparated) result = separatedAmount(); 
        else {
            if (_isRetired) result = retiredAmount(); 
            else result = normalPayAmount();
        };
    } 
    return result; 
};

并有一些退出点:

double getPayAmount() { 
    if (_isDead) return deadAmount(); 
    if (_isSeparated) return separatedAmount(); 
    if (_isRetired) return retiredAmount();    
    return normalPayAmount();
};
  

嵌套条件代码通常由程序员编写,他们被教导从方法中有一个退出点。我发现这是一个过于简单的规则。 当我对一种方法没有兴趣时,我通过退出表示我缺乏兴趣。指导读者查看空的其他块只会妨碍理解。

答案 1 :(得分:0)

可能是一个例子:

do {


}while()

或者某事:

int someMethod() throws Exception {

  try {
    someInt = someComplexOp();
    return someInt;
   }
   catch(Exception e) {
     log.error(e.getMessage(),e);
     throw e;
   }     
} 

另请阅读this文章。

答案 2 :(得分:0)

很难想象使用现代高级语言的多个入口点,以及面向对象,抽象和封装;但很容易看到一个方法的多个退出。例如:

    public static int CountCommas(string text)
    {
        if (String.IsNullOrEmpty(text))
        {
            return 0;
        }
        if (text.Length == 0)
        {
            return 0;
        }

        int index = 0;
        int result = 0;
        while (index > 0)
        {
            index = text.IndexOf(',', index);
            if (index > 0)
            {
                result++;
            }
        }
        return result;
    }

答案 3 :(得分:0)

并非总是我们应该只在一点上回归。在检查的上下文中 - 在函数的最顶端返回可能更清晰。但是,如果函数在任何地方都有返回语句,那么可能会导致可读性降低。混乱。

如果您看一下上面的答案https://stackoverflow.com/a/17295767/5143994(Adam Siemion)中提供的2个代码示例,我立即可以看到嵌套问题。第一个例子(没有多次返回)可以写得更好(见下文)

double getPayAmount() {

    double result;

    if (_isDead) {
        result = deadAmount();
    } else if (_isSeparated) {
        result = separatedAmount();
    } else if (_isRetired) {
        result = retiredAmount();
    } else {
        result = normalPayAmount();
    } 

    return result; 
}

上面的另一个优点是,如果您希望为结果添加一个共同的影响,您可以轻松添加它。例如。考虑到你现在想要在结束计算中增加20%的额外惩罚。

return result * 1.2; 

但是通过多次回归,它会更难以增加这种共同的影响。