方法返回类型

4
在我的公司里,我们设计了一个三层系统。第一层负责处理业务逻辑,第三层调用后端系统。第二层位于两个层之间,这样第一层就不需要知道后端系统的存在。为了传递来自第三层的信息,第二层需要定义与第一层的接口。
例如,第一层想要检查用户的PIN是否正确。它调用第二层的checkPin()方法,然后第二层调用相关的后端系统。checkPin()的结果可能是:correctPin、inCorrectPin和internalError。目前,我们定义了返回类型为“int”。因此,如果第二层返回0,则表示正确的PIN;如果返回1,则表示不正确的PIN;如果返回9,则表示内部错误。
这种方法可以工作。但是我对此感到有些不安。有更好的方法吗?例如,定义一个枚举CheckPinResult {CORRECT_PIN,INCORRECT_PIN,INTERNAL_ERROR},并返回CheckPinResult类型?
谢谢, Sarah

3
在每一层上使用异常处理。如果某一层出现故障,你可以捕获该异常。这样你就知道哪一层出了问题。这只是一个建议,所以我没有把它发布为答案。 - Buhake Sindi
是的,我明白你的意思。目前我们所做的是在出现内部错误时记录错误。如果有异常,我们会捕获它并在第一层中记录它。第二层和第三层将其升级到更高的层次。 - sarahTheButterFly
我认为Elite所说的是要从每个层面创建一个自定义异常。这些是业务异常,这就是我们所做的。当您将这些层用作API时,它也有助于外部开发人员处理错误。 - Kapil D
4个回答

1

枚举类型绝对是整数返回类型的改进,也是一种完全有效的方法。另一个选择是使用第二层签名,例如:

public boolean isPINValid() throws InternalErrorException();

既然我假设内部错误是例外情况,为什么不将它们视为这样呢?


1
这是一个关于风格的问题。你描述的方式是一种实现目标的C语言风格。Java风格如下:checkPin(pin)应该返回一个布尔值。True表示PIN正确,false表示不正确。如果发生错误,则抛出异常。在Java中,异常是处理错误的标准方式。异常很有用,因为它们可以具有类型和错误消息以帮助调试。
我认为你所描述的机制是C语言风格,因为在C语言中,处理错误的标准方式是返回映射到定义的整数,然后通过引用传递你要查找的值(在本例中是布尔值)。因此,在C语言中,你会有以下代码:
int checkPin(int pin, bool &ans); //returns an error value.

无论如何,我强烈建议不要在返回布尔值的同一位置返回错误值。这会导致混淆,因为单个值(返回值)实际上只应该代表一件事情。错误状态和问题的答案是两个不同的事情,因此应该通过不同的渠道返回。
希望这有所帮助。

哈哈..你懂了。C风格。定义接口的同事背景是C语言。很难说服来自C语言背景的人使用枚举类型。 - sarahTheButterFly

1

你是否经常遇到内部错误?如果不是,我会让checkPin返回一个布尔值,并在出现内部错误时抛出异常(但这时我可能会将该方法命名为pinIsValid或类似的名称)。

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


1

我喜欢枚举方法。它具有自我说明性和易于扩展性。您可以设置每个返回值以匹配您所使用的0、1、9约定。

抛出异常当然是一种可辩解的方法,但抛出异常可能是一件昂贵的事情。我一直认为它们应该用于指示真正异常的情况。拥有一个坏引脚可能是非常特殊的,也可能不是,这取决于您的业务问题。如果您的过程允许引脚具有“五个九”的可靠性,那么我认为异常是一个好的选择。

但是,如果故障率在1%左右,我认为返回值可能更好。您可能希望循环遍历大量值,并将具有失败引脚的零件号作为大批量累积。这取决于您如何使用错误代码。


我们的架构师肯定会同意你的看法。他非常不喜欢Java的异常机制。 - sarahTheButterFly
很遗憾,我无法说服我的同事使用枚举。他们说这需要太多的重构工作。:( - sarahTheButterFly
我们在谈论更改单个方法的签名,对吧?如果是这样,像IntelliJ这样的工具就很容易实现。你调用这个方法多少次?我不会接受“太多”的说法,除非有可量化的证据支持它。 - duffymo
大约有15个方法,比如checkPin(),它返回一个整数。这就是为什么他们说这是太多的重构工作。从我所看到的情况来看,如果使用枚举类型,对于维护来说将会非常有益。 - sarahTheButterFly
一个好的重构IDE可以做到这一点。在我看来,这个论点并不是那么强有力。 - duffymo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接