ВВЕДЕНИЕ В ПРИНЦИПЫ SOLID НА ПРИМЕРЕ С#. ЧАСТЬ 3 - LCP
Принцип подстановки Барбары Лисков
Этот принцип гласит, что объекты в программе должны быть заменяемыми своими наследниками без изменения свойств программы. Выражаясь иначе, дочерний класс может быть заменен на родительский, не вызывая проблем при выполнении программы.
В отличии от прошлых частей, сначала разберем пример правильного кода и только потом начнем нарушать принцип LCP. Возьмем кусочек кода из предыдущей части, а именно код, отвечающий за отправку сообщения клиенту.
Данный код не нарушает принцип Барбары Лисков, так как при использовании upcast логика работы не будет нарушена, дочерние классы содержат в себе только те методы, что и интерфейс, который они реализуют, тоже самое справедливо и для абстрактных классов.
Теперь же изменим наши объекты так, чтобы они нарушили данный принцип. Например добавим в интерфейс метод, который будет отвечать за получение истории сообщений.
Допустим, что данный функционал при отправке по WhatsApp не нужен, тогда код приведет к ошибке при нынешней реализации:
Чтобы код соответствовал третьему принципу необходимо создать новый интерфейс, который будет отвечать за просмотр истории сообщений. Теперь код выглядит следующим образом:
Теперь данный код соответствует принципу Барбары Лисков, так как при использовании upcast не будет возникать ошибок.
Правила контракта
Данные правила справедливы для классов, а не интерфейсов и звучат следующим образом:
- Предусловие не может быть усилено дочерним классом. Например, имеется условие проверки баланса. При переопределении метода пользователь не имеет права вносить новые проверки баланса, например balance < 100, так как это может привести к ошибкам выполнения операции в определенных ситуациях.
- Постусловие не может быть ослаблено дочерним классом. Тоже самое, что и с предусловием, только теперь дочерние классы не имеют права исключать некоторые проверки из методов.
- Инварианты - условия определённые в базовом классе должны остаться в классе наследнике
Заключение
Принцип подстановки Барбары Лисков позволяет переопределить методы родительского объекта таким образом, чтобы при выполнении функционала от родительского объекта не возникало исключений и ошибок.
Список использованных источников
- Принципы SOLID. Принцип единственной обязанности. URL: https://metanit.com/sharp/patterns/5.1.php
- S.O.L.I.D. Principles of Object-Oriented Programming in C#. URL: https://www.educative.io/blog/solid-principles-oop-c-sharp
- Принципы SOLID в C#. URL: https://professorweb.ru/my/it/blog/net/solid.php
- Опасность нарушения принципов SOLID в C#. URL: https://learn.microsoft.com/ru-ru/archive/msdn-magazine/2014/may/csharp-best-practices-dangers-of-violating-solid-principles-in-csharp