考虑:
if (something) {
// Code...
}
安装 CodeRush 后,建议执行以下操作:
if (!something) {
return;
}
// Code...
有人可以解释一下这更好吗?当然,从来没有什么好处。
考虑:
if (something) {
// Code...
}
安装 CodeRush 后,建议执行以下操作:
if (!something) {
return;
}
// Code...
有人可以解释一下这更好吗?当然,从来没有什么好处。
孤立,正如您所介绍的那样 - 没有任何好处。但是 mark4o 是正确的:它的嵌套更少,如果你看一下,这会变得非常清楚,比如 4 级嵌套:
public void foo() {
if (a)
if (b)
if (c)
if (d)
doSomething();
}
相对
public void foo() {
if (!a)
return;
if (!b)
return;
if (!c)
return;
if (!d)
return;
doSomething();
}
像这样的早期返回提高了可读性。
在某些情况下,在方法开始时验证所有输入并在任何不正确的情况下退出会更干净。您可以进行一系列单级 if 检查,依次检查越来越具体的事物,直到您确信自己的输入是好的。然后,该方法的其余部分将更容易编写,并且往往具有更少的嵌套条件。
少一层嵌套。
这是为了可维护性而进行的传统重构。看:
http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
在一个条件下,这并不是一个很大的改进。但它遵循“快速失败”的原则,当你有很多条件时,你才真正开始注意到它的好处。如果您在“结构化编程”中长大,通常建议函数具有单个退出点,这可能看起来不自然,但如果您曾经尝试调试具有三层或更多嵌套条件的代码,您将开始欣赏它。
它可用于使代码更具可读性(通过减少嵌套)。请参阅此处以获取一个很好的示例,并在此处对优点进行很好的讨论。
这种模式通常用于替换:
void SomeMethod()
{
if (condition_1)
{
if (condition_2)
{
if (condition_3)
{
// code
}
}
}
}
和:
void SomeMethod()
{
if (!condition_1) { return; }
if (!condition_2) { return; }
if (!condition_3) { return; }
// code
}
这对眼睛来说更容易。
好吧,这样看(我以php为例):
您填写表格并转到此页面:validate.php
示例 1:
<?php
if (valid_data($_POST['username'])) {
if (valid_data($_POST['password'])) {
login();
} else {
die();
}
} else {
die();
}
?>
对比
<?php
if (!valid_data($_POST['username'])) {
die();
}
if (!valid_data($_POST['password'])) {
die();
}
login();
?>
哪一个更好更容易维护?请记住,这只是验证两件事。想象一下这是一个注册页面或其他东西。
我不认为 CodeRush 推荐它 --- 而只是提供它作为一个选项。
IMO,这取决于是否something
是!something
例外情况。如果发生大量代码something
,那么使用!something
条件对于易读性和潜在的嵌套减少更有意义。
我清楚地记得在一项大学作业中失分,因为我和
if (!something) {
return;
}
// Code...
格式。我的讲师断言,在一个函数中有多个退出点是不好的做法。我认为那太疯狂了,经过 20 多年的计算机编程,我仍然如此。
公平地说,他生活在一个通用语言是 C 的时代,函数通常是一页长的页面,并且充满了嵌套条件,因此很难跟踪正在发生的事情。
然而,过去和现在,简单才是王道:让函数保持小规模并对其进行良好的注释是使事物可读和可维护的最佳方式。