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

Do checked exceptions violate the open closed principle?

我有两个已检查的异常:TestException1TestException2 以及以下代码:

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

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

void p3() throws TestException1 {}

p3的签名编辑如下是否违反了Open-Closed原则?

void p3() throws TestException1, TestException2 {}

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

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

在您的示例中,更改 Java 中 public API 方法抛出的已检查异常是 重大 违规。如果不重新编译,很容易导致任何使用 methods ... 或二进制兼容性问题导致的 Error subclass 异常的编译错误。实际上,由于 p3p2 调用并由 p1 间接调用,您实际上需要更改更多 class 才能使其编译。这可能会使 API 变化的范围更大。

所以对于你的问题:

Do checked exceptions violate the open closed principle?

不完全是。

在不违反开闭原则的情况下,可以使用Checked exceptions。但是,给一个已经被“冻结”的API方法添加checked exception确实违反了1的原则。但是 添加异常的行为 是违规的……不是异常本身,也不是一般的已检查异常。


1 - 即使这是值得商榷的。反驳的是修复设计缺陷和bug并不违反开放封闭原则

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

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

不知道该方法是如何实现的,或者更重要的是,不知道该方法是如何通过其模块的 API 公开的,我们无法判断。例如,一个方法可能依赖于一个硬编码常量;但如果该方法可以被客户端覆盖,它仍然可以扩展。已检查异常的存在并不能告诉我们模块是否可扩展。

另一方面,如果检查的异常导致方法成为最终方法,并且如果模块公开了这样的方法作为其 public API 的一部分,并且如果该模块没有提供替代那个 API,那么它将违反 OCP。