Принцип замещения Лискова для исключения - PullRequest
2 голосов
/ 17 марта 2019

Я читаю о LSP в книге «Гибкие принципы, модели и практики».В нем говорится, что:

«Обычное переопределение [в производной] может заменить только исходное предварительное условие на одно равное или более слабое, а исходное постусловие - на одно равное или более сильное».

Термин слабее может сбить с толку.X слабее Y, если X не обеспечивает все ограничения Y. Не имеет значения, сколько новых ограничений X применяет.

Как мы можем понять это в контексте исключений?

1 Ответ

1 голос
/ 18 марта 2019

LSP относится к типам. Так что занятия на большинстве языков ООП. Тогда есть три способа рассмотреть ваш вопрос:

1. Исключение рассматривается как тип

Типы исключений, такие как, например, std::exception в C ++, которые можно преобразовать в более специализированные исключения. Для облегчения обработки ошибок следует применять код LSP.

Исключения, как правило, имеют плохое поведение и просто передают некоторую дополнительную информацию об условиях ошибки, так что это не слишком сложно в целом.

2. Исключения рассматриваются как невыполненное предварительное условие

Исключение должно соответствовать исключительным ситуациям, которые не ожидаются в обычных обстоятельствах. Поэтому повышение исключения означает, что ожидаемые нормальные условия отсутствуют.

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

Давайте возьмем крайний случай. Предположим, что не предусмотрено никаких исключений в базовом классе для данной подпрограммы. Вы ожидаете или даже указываете nothrow. Код, использующий эту подпрограмму, будет считать ее безопасной и не предвидит ловли исключений. Предположим, что вы затем выводите этот класс в класс, который генерирует исключение (т. Е. Предварительные условия более строгие, более ограничительные): код, написанный для базового класса, будет застигнут врасплох, если возникнет исключение, и общий код для базового класса может порвать со специализированным классом. Так что LSP будет сломан.

3. Исключения, рассматриваемые как особый результат / постусловие

Вы можете утверждать, что в некоторых случаях исключение является особым постусловием. Альтернатива возвращаемому значению.

Мне было бы довольно неудобно с этой интерпретацией (так как многие языковые дизайнеры не понимают, см. Обсуждение о nothrow). Но у меня нет дальнейших объективных аргументов, чтобы сделать это недействительным

Поскольку LSP касается контрактов, вы можете принять это проектное решение. В этом случае более специализированный класс может генерировать более специализированное исключение (поэтому в этом случае рассуждение будет относиться к типу исключения). Но должен ли производный класс действительно генерировать как минимум столько же исключений, чем исходный? Это звучит нелогично. Перейти к 2.

...