Нарушают ли проверенные исключения принцип открытого закрытого типа? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть два проверенных исключения: 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 ]

0 голосов
/ 02 марта 2019

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

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

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

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

0 голосов
/ 27 февраля 2019

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

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

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

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

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

Неименно так.

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

...