我不确定我是否能很好地使用它,例如,Java中的if语句被称为单入口/单出口语句。 在条件为真的情况下,这被认为是单入口点,如果错误则认为是单出口点吗?
if(someCondition)
doSomething();
非 - (单项/单项退出)语句的示例是什么?
答案 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;
但是通过多次回归,它会更难以增加这种共同的影响。