【问题标题】:Is there a name for the difference of these two code styles?这两种代码风格的区别有名称吗?
【发布时间】:2021-04-25 13:20:17
【问题描述】:

当我看到别人的代码时,我主要看到两种方法样式。

一个看起来像这样,有许多嵌套的 if:

void doSomething(Thing thing) {
  if (thing.hasOwner()) {
    Entity owner = thing.getOwner();
    if (owner instanceof Human) {
      Human humanOwner = (Human) owner;
      if (humanOwner.getAge() > 20) {
        //...
      }
    }
  }
}

而另一种风格,看起来像这样:

void doSomething(Thing thing) {
  if (!thing.hasOwner()) {
    return;
  }
  Entity owner = thing.getOwner();
  if (!(owner instanceof Human)) {
    return;
  }
  Human humanOwner = (Human) owner;
  if (humanOwner.getAge() <= 20) {
    return;
  }
  //...
}

我的问题是,这两种代码样式有名称吗?如果,它们叫什么。

【问题讨论】:

  • 我不知道名字,但之前已经注意到了区别。有(是?)一种经典的反感,反对在一个方法中使用多个返回语句(并且某些语言不允许这样做)。我个人认为这两种风格都没有问题,所以我同意你的描述,这完全是——风格的问题。

标签: java


【解决方案1】:

我会说这是关于可读性。我更喜欢的第二种风格,让您有机会向用户/程序发送例如消息,以进行任何应该停止程序的检查。

【讨论】:

    【解决方案2】:

    可以称其为“多次退货”和“单次退货”。但我不会将其称为一种风格,您可能希望同时使用这两种方法,具体取决于任何特定情况下的可读性。

    一般来说,单次返回被认为是一种更好的做法,因为它允许您编写更具可读性的代码,而不会让读者感到意外。在一个复杂的方法中,要理解程序将在什么时候退出任何特定的参数,以及可能会发生什么副作用可能是相当复杂的。

    但是,如果在任何特定情况下您觉得多次返回提高了代码的可读性,那么使用它们并没有错。

    【讨论】:

    • “一般来说,单次退货被认为是更好的做法” - 谁考虑过?这是老派“结构化编程”支持者的建议,但实际上有研究表明人们发现多返回样式更容易理解。当您考虑到许多算法必须使用额外的布尔标志来指示算法是否应该已经返回时,这是有道理的。
    • @kaya3 我想你已经回答了你自己的问题。我会说这取决于具体情况。与应用程序编程相比,过程算法是一种特殊的,坦率地说,是一种非常狭窄的极端情况。
    • 我个人更喜欢秒样式,主要是因为我想摆脱所有我不需要在我的逻辑代码中处理的情况和可读性。我认为,如果每次我需要检查一些无论如何都不会在逻辑上处理的东西时,它不向右走一个制表符空间,那么它更容易阅读代码。
    • @Sergei 我的意思是,“结构化编程”支持者认为的良好做法与“通常”认为的良好做法不同。明确地说,我指的是最广泛意义上的“算法”。
    【解决方案3】:

    我不知道这两种样式是否有公认的名称,但在structured programming 术语中,它们可以描述为“单出口”与“多出口”控制结构。 (这也包括循环结构中的continuebreak 语句。)

    经典的结构化编程范式提倡单次退出而不是多次退出,但如今大多数程序员都对这两种风格都很满意,具体取决于上下文。即使是经典的,当生成的代码更具可读性时,放宽“单一退出”规则也是可以接受的。

    (需要记住,结构化编程被视为“意大利面条”编程的解毒剂,尤其是在汇编语言中,其中唯一的控制结构是条件分支和非条件分支。)

    【讨论】:

      【解决方案4】:

      第二个例子中的提前返回被称为保护子句

      在方法实际要做的事情之前,检查一些先决条件,如果它们失败,方法立即返回。这是一种快速失败的机制。

      围绕这些退货声明存在很多争论。有些人认为在一个方法中有多个 return 语句是不好的。其他人认为它避免了将代码包装在一堆 if 语句中,就像在第一个示例中一样。

      我自己的谦虚选择与this post 一致:尽量减少退货数量,但如果它们提高可读性,请使用它们。

      相关:

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2010-11-03
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2010-09-09
      • 2020-06-28
      相关资源
      最近更新 更多