git mergetool
OOPs建议多个return语句是个坏主意。但是,如果我使用多个嵌套,那么它看起来非常复杂。 请建议使用嵌套条件
的最佳方法是什么答案 0 :(得分:5)
多个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;
}
}
答案 1 :(得分:2)
明白没有任何规则是一成不变的。 (软件)工程总是关于平衡不同的要求/规则。
在您的情况下:选项2,使用多个返回语句明确更容易理解为人类读者。
从这个意义上说:为此而努力。由于此解决方案在 single layer of abstraction 原则方面也有更好的效果!
但我同意评论 - if / else检查的冗长序列通常是设计不足的症状。一个人不需要完全放弃if
(参见here) - 但假设您主要关注的是提高当前代码的质量,那么您应该花时间研究这个问题为什么在该方法中有如此多的if语句。
答案 2 :(得分:0)
另一种选择:
if (condition || condition || condition)
return;
或
if (condition && condition && condition) {
statement's
}
显然,每种情况都可能是独立的。它只取决于条件,究竟是做了什么,......以及某种方式也取决于你想要“表达”的内容。