Нарушают ли проверенные исключения принцип открытого закрытого типа?

У меня есть два проверенных исключения: TestException1 а также TestException2 и следующий код:

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

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

void p3() throws TestException1 {}

Не нарушает ли редактирование сигнатуры p3 принцип Open-Closed следующим образом?

void p3() throws TestException1, TestException2 {}

2 ответа

Решение

Я думаю, я понимаю, что вы подразумеваете под своим вопросом сейчас. (2-я попытка)

Строго говоря, любое изменение, которое вы вносите в исходный код класса, нарушает "закрытую" часть открытого закрытого принципа. Значимость нарушения зависит от характера изменения.

В вашем примере изменение проверенных исключений, генерируемых методом открытого API в Java, является существенным нарушением. Это может привести к ошибкам компиляции в любом методе, который использует методы... или Error исключения подкласса вызывают проблемы двоичной совместимости, если вы не перекомпилируете. Действительно, так как p3 называется p2 и косвенно p1вам нужно изменить класс, чтобы он скомпилировался. Это может увеличить область изменения API.

Итак, на ваш вопрос:

Нарушают ли проверенные исключения принцип открытого закрытого типа?

Не совсем.

Проверенные исключения могут быть использованы без нарушения принципа открытого закрытого типа. Однако добавление проверенного исключения в метод API, который был "заморожен", нарушает этот принцип. Но именно акт добавления исключения является нарушением... а не самим исключением или проверенными исключениями в целом.

Нет, проверенные исключения не нарушают OCP по той простой причине, что OCP применяется к модулям, а не к методам.

Если вы считаете, что проверенное исключение - это просто еще одна часть сигнатуры метода, этот вопрос такой же, как и то, нарушают ли OCP имена методов, параметры методов или возвращаемые методы. Принцип просто не применим на этом гранулярном уровне.

Не зная, как реализован метод или, что более важно, как метод предоставляется через API его модуля, нам нечего судить. Например, метод может опираться на жестко закодированную константу; но если метод может быть переопределен клиентами, он все еще открыт для расширения. Ничто о существовании проверенного исключения не сообщает нам, является ли модуль расширяемым.

С другой стороны, если проверенные исключения приводят к тому, что метод становится окончательным, и если такой метод предоставляется модулем как часть его открытого API, и если этот модуль не предоставляет альтернативы этому API, то это будет нарушением OCP.

Другие вопросы по тегам