потребитель не должен знать, что абстракция была оформлена, он должен придерживаться договора, который обеспечивает абстракция.
Это правильно.Чтобы придерживаться LSP, обе реализации абстракции должны придерживаться одного и того же контракта.Но теперь возникает вопрос: что именно является контрактом?Что может ожидать потребитель.
В отличие от Java, .NET не вызывает исключения как часть определения метода.И я думаю, что это хорошо.Вы не можете и не должны ограничивать исключения, выбрасываемые в абстракцию.Это, конечно, меняется, когда вы генерируете исключения, которые клиент должен обрабатывать.В этом случае тип исключения должен быть частью контракта.
Большая проблема в этом конкретном примере декоратора, IMO, заключается в том, что исключение не всплывает.Это полностью проглочено.Это, безусловно, можно считать нарушением (неявного) контракта, поскольку разработчик может ожидать, что вызов завершится успешно, если не будет выдано исключение.Так что я согласен с тем, что пример немного наивный и нарушает LSP.
Однако этот пример не является полностью защищенным, на 100% ТВЕРДЫМ решением, а скорее как пример для демонстрацииСила перехвата с использованием декораторов.Также обратите внимание, что в главе 10 мы объясняем, что быть на 100% твердым не возможно и не желательно.Все дело в компромиссах, и, возможно, этот пример декоратора хорошо работает в конкретном клиентском приложении, которое вы создаете, хотя я ожидаю, что потребитель (форма) должен будет знать, успешно ли выполнена операция, потому что вы обычно хотите закрыть форму после ее завершения.,Но в этом случае я ожидаю, что лучшим решением будет дизайн, предусмотренный в главе 10.
Мое предложение будет новым интерфейсом IExceptionHandlingAbstraction
, который реализуется адаптером, который перехватывает исключенияIAbstraction
и преобразует его в блоки оповещений
Создание новой абстракции, позволяющей потребителю получать уведомления или получать информацию о сбоях, является хорошим решением в случае нарушения LSP.