检查异常是否违反了开放封闭原则?

问题描述 投票:1回答:2

我有两个经过检查的例外:TestException1TestException2以及以下代码:

void p1() throws TestException1{
    p2();
}

void p2() throws TestException1 { 
    p3();
}

void p3() throws TestException1 {}

编辑p3的签名是否违反了开放原则?

void p3() throws TestException1, TestException2 {}
java oop software-design open-closed-principle
2个回答
1
投票

我想我现在理解你的问题是什么意思了。 (第二次尝试)

严格地说,您对类的源代码所做的任何更改都违反了开放封闭原则的“封闭”部分。违规的重要性取决于变更的性质。

在您的示例中,更改由Java中的公共API方法抛出的已检查异常是一个重大违规。在任何使用这些方法的方法中,它都可能导致编译错误...或者如果不重新编译,Error子类异常会导致二进制兼容性问题。实际上,由于p3p2调用并且间接地被p1调用,所以你实际上需要更改更多的类以使其编译。这可能会使API的范围变大。

所以对你的问题:

检查异常是否违反了开放封闭原则?

不完全是。

可以使用经过检查的例外而不违反开放式封闭原则。但是,将已检查的异常添加到已被“冻结”的API方法确实违反了该原则。但是添加异常是违规的行为......不是异常本身,或者是一般的异常检查。


0
投票

不,检查异常不违反OCP,原因很简单,OCP适用于模块,而不适用于方法。

如果您认为已检查的异常只是方法签名的另一部分,则此问题与方法名称或方法参数或方法返回类型是否违反OCP相同。该原则根本不适用于此粒度级别。

在不知道如何实现该方法的情况下,或者更重要的是,如何通过其模块的API公开该方法,我们无需判断。例如,一种方法可能依赖于硬编码常数;但是如果客户端可以覆盖该方法,则它仍然可以进行扩展。没有关于已检查异常的存在的信息通知我们模块是否可扩展。

另一方面,如果检查异常导致方法成为最终方法,并且如果模块将此方法作为其公共API的一部分公开,并且该模块不提供该API的替代方案,那么它将是OCP违规。

© www.soinside.com 2019 - 2024. All rights reserved.