【问题标题】:Java Style with-respect-to Multiple Returns, Used as "Guards"Java 风格相对于多个返回,用作“守卫”
【发布时间】:2016-06-22 19:28:19
【问题描述】:

Java 社区中是否存在一种思想流派,即在一个方法中使用多个返回,如下所示:

public SomeClass someMethod(int someValue) {
    if (someValue < SOME_CONSTANT) {
        return null;
    }

    SomeClass someClass = null;
    // and now, the body of the method that performs
    //   the heavy lifting
    return someClass;
}

我在“单入口点,单出口点”的口头禅下“长大”,但我可以看到使用简单的守卫如何使代码更具可读性/可维护性(即消除嵌套级别)。 “单出口”版本看起来像......

public SomeClass someMethod(int someValue) {
    SomeClass someClass = null;

    if (someValue < SOME_CONSTANT) {
        // and now, the body of the method that performs
        //   the heavy lifting
    }
    return someClass;
}

诚然,这是一个微不足道的例子,但我可以看到更多的先决条件可能会导致更大的嵌套。就个人而言,我仍然会坚持“不要在整个方法中添加返回”以用于其他目的(即,仅“返回”作为守卫的结果,或在方法结束时),但我想知道如何Java 社区的其他人都觉得。

添加了“苹果示例”...

public Pie makeApplePie(Apple apple) {
    if (apple == null) {
        return null;
    }

    // do cool stuff with apple
    return new Pie();
}

【问题讨论】:

  • someMethod 在您描述的示例中似乎执行 两个 角色,而不是一个。通常,我会在一个方法中执行someValidation,如果它通过,则someMethod 否则继续工作直到someValidation 通过。如果你有一个方法cutApple 接受不是苹果的对象,但对非苹果不做任何事情,为什么不在要求切割它之前验证对象是苹果呢?
  • 你有点错过了我的问题的重点。如果我想要“苹果”,那么我会输入参数(做一个单独的验证)。但是,使用你的例子。我在原始问题中添加了一个“苹果示例”。但是我最初关于使用返回作为保护 a 方法的主要实现的问题仍然存在。
  • 我从来没有理解过单一退出规则。就我而言,这与良好的风格完全相反。早退好,晚退差。这是人们为了自己的利益而遵循的规则。有一个单独的 return 语句没有任何价值。就像在您的示例中一样,扭曲自己以获得一个返回值会导致创建不必要的返回值变量。老实说,我从来没有发现自己对函数从哪里返回感到困惑。这不是需要缓解的混淆点。

标签: java coding-style


【解决方案1】:

除非您的逻辑迫使您这样做,否则我绝对更喜欢单次退出。有时可能有一个 for 循环,您在其中计算结果并因此想要中断。 然后在 for 循环之后可能会有更多语句,您不想执行但立即返回,那么您别无选择,只能拥有多个 return 语句

以下代码:

public  SomeClass myMethod()
{
   SomeClass sc = null;

   for ( int i = 0; i < (someCondition); i++ )
   {
      //computed result
      sc = result;
      return sc; //result is SomeClass
   }

   //Some more machinery to assign a value to sc

   return sc;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多