【问题标题】:Method return type方法返回类型
【发布时间】:2010-03-22 23:19:32
【问题描述】:

在我的公司中,系统设计为具有 3 层。 Layer1 负责业务逻辑处理。 Layer3 调用后端系统。 Layer2 位于两层之间,因此 layer1 不需要了解后端系统。为了从 layer3 传递信息,layer2 需要定义到 layer1 的接口。

例如,layer1 想要检查来自用户的 PIN 是否正确。它调用 layer2 checkPin() 方法,然后 layer2 调用相关的后端系统。 checkPin() 结果可能是:correctPin、inCorrectPin 和 internalError。目前,我们定义了返回类型“int”。所以如果layer2返回0,则表示正确的Pin;如果返回 1,则表示 inCorrectPin;如果返回 9,则表示内部错误。

它有效。但是,我对这种方法感到有些不安。有更好的方法吗?例如定义一个枚举 CheckPinResult{CORRECT_PIN,INCORRECT_PIN,INTERNAL_ERROR},并返回 CheckPinResult 类型?

谢谢, 莎拉

【问题讨论】:

  • 在每一层上使用例外。如果某个层失败,您将捕获该异常。这样,您就知道哪一层失败了。这是一个建议,因此我没有将其发布为答案。
  • 是的,我明白你的意思。我们目前正在做的是在内部错误时记录错误。如果有异常,我们会捕获它并将其记录在 layer1 中。 Layer2 和 Layer3 将其升级到更高层。
  • 我认为Elite所说的是从每一层创建一个自定义异常。这些是业务例外,这就是我们所做的。当您将层用作 API 时,它也有帮助,外部开发人员将能够处理错误。

标签: java int


【解决方案1】:

我喜欢枚举方法。它是自记录的并且易于扩展。您可以设置每个返回的值以匹配您已有的 0、1、9 约定。

抛出异常当然是一种防御方法,但抛出异常可能是一件昂贵的事情。我一直认为应该用它们来表示真正的特殊情况。根据您的业务问题,有一个坏的别针可能会也可能不会那么特殊。如果您的流程允许引脚的“五个九”可靠性,那么我会说例外将是一个好方法。

但如果失败率更高,大约为 1%,我会说返回值可能会更好。您可能希望遍历大量值,并简单地将带有故障引脚的部件#s 累积为大批量。这取决于您如何使用错误代码。

【讨论】:

  • 我们的建筑师一定会同意你的。他根本不喜欢java异常机制。
  • 遗憾的是我无法说服我的同事使用枚举。他们说重构工作太多了。 :(
  • 我们说的是改变单个方法的签名,对吧?如果是这样的话,像 IntelliJ 这样的工具就很容易了。你调用这个方法多少次?如果没有可量化的证据支持,我不会接受“太多”。
  • 有大约 15 种方法,如 checkPin(),它返回整数。这就是为什么他们说重构工作太多了。据我所知,如果使用 enum 对维护非常有益。
  • 一个好的重构 IDE 可以做到。论据不是那么强烈,IMO。
【解决方案2】:

您收到内部错误是合理的常见情况吗?如果没有,我会让checkPin 返回一个布尔值并在出现内部错误时抛出异常(但我可能会调用方法pinIsValid 或类似的方法)。

如果它(由于某种原因)是遇到内部错误的预期结果,那么三态枚举可能会很好地工作(我当前的项目中有类似的情况)。

【讨论】:

    【解决方案3】:

    Enum 无疑是对整数返回类型的改进,也是一种完全有效的方法。另一种选择是使用第 2 层签名,例如:

    public boolean isPINValid() throws InternalErrorException();
    

    既然我认为内部错误是例外,为什么不这样对待它们呢?

    【讨论】:

      【解决方案4】:

      这是风格问题。您描述的方式是一种实现目标的 C 风格。 Java 风格如下: checkPin(pin) 应该返回一个布尔值。真正的意思是引脚可以,错误的意思是不正确。如果发生错误,则抛出异常。异常是Java中处理错误的标准方法。异常很有用,因为它们可以有类型和错误消息来帮助调试。

      我说您所描述的机制是 C 风格,因为在 C 中处理错误的标准方法是返回一个映射到定义的整数,然后通过引用传入您要查找的值(在这种情况下一个布尔值)。所以在c中你会有

      int checkPin(int pin, bool &ans); //returns an error value.
      

      无论哪种方式,我强烈建议不要在返回布尔值的地方返回错误值。这会造成混乱,因为单个值(返回值)实际上应该只代表一件事。错误状态和问题的答案是两个不同的东西,应该通过不同的渠道返回。

      希望对你有所帮助。

      【讨论】:

      • 哈哈..你明白了。 C 风格。我定义接口的同事来自C背景。说服 C 背景的人使用 say enum 非常困难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2011-01-13
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多