重载方法而不抛出反模式的异常?

时间:2014-09-16 12:55:35

标签: oop anti-patterns

我们目前正在设计用于存储设置的API,我们正在考虑使用这两种方法:

public Object getSetting(String key) {
    // return null if key does not exist
}

public Object getSettingExc(String key) {
    // throw a runtime exception if key does not exist
}

不知怎的,我觉得这不对,但我想不出任何缺点,除了加倍API中的函数数量,可能会降低代码的可读性(如果我知道设置必须存在,我想我应该显式抛出异常而不是依赖于get方法。

您对此有何看法?

3 个答案:

答案 0 :(得分:2)

当代码无法根据其公布的功能继续运行时,异常出现的例外情况。

请求未设置的设置几乎不值得例外。如果“你”(即调用代码)“知道”设置“必须”存在,请调用getSetting(),检查null的返回值,然后然后你应该在那里知道自己抛出异常。添加有关未找到上下文的设置的有意义消息。 (这只是来电者知道的事情。)

不要将异常的抛出委托给知道查询的上下文的代码,该设置 >那里,需要明确告知(通过以不同的名称进行调用)。另外,getSettingExc()很可能只是getSetting()周围的空检查和抛出包装器,所以为什么不在可以使异常消息更有帮助的地方进行呢? / p>

IMHO。 (这就是我意识到我应该投票而不是写一个答案的地方......)

答案 1 :(得分:1)

这引入了对象结构和潜在错误条件之间的奇怪耦合。关于你的评论:

  

我只是试图收集论据来说服我团队中的其他人。

责任应该在这个设计的支持者上,以证明它是合理的,而不是你的理由反对它。在我见过的任何设计中,没有其他人使用它。

确实但是让我想起了另一种可能的设计是你的团队的意图吗?考虑以下两种方法:

public Object getSetting(String key) {
    // return the setting or throw an exception
}

public Object getSettingOrDefault(String key) {
    // return the setting or a pre-determined default
}

这使方法更多地与功能对齐而不是与错误条件对齐。 getSetting()可以宣传它可能会抛出异常,而getSettingOrDefault()可以宣告如果在设置中找不到任何异常,它将默认为特定值。

如果Java具有可选参数或类似的参数,getSettingOrDefault()甚至可以接受默认值作为参数,以便在没有此类设置的情况下使用。虽然这可能会让消费代码变得有点麻烦,只是在那个问题上大声思考。

无论哪种方式,API都应该反映功能而不是错误条件理想情况下应该只有一种方法,但是如果明显需要区分抛出的方法和不具备的方法(我当然可以看到这种情况)在具有已检查异常的语言中,这两者应与功能对齐,而不是与例外对齐。

答案 2 :(得分:0)

恕我直言,有两种方法可以完全相同的操作,这表明你作为API设计师没有完成“设计”你的API的工作。选择这种或那种方式,通过API(javadocs)进行宣传,然后消费者的使用方式(一种或另一种)保持一致。