Ошибка порядка наследования в Liskov Substitution | OTUS
🔥 Начинаем BLACK FRIDAY!
Максимальная скидка -25% на всё. Успейте начать обучение по самой выгодной цене.
Выбрать курс

Курсы

Программирование
iOS Developer. Basic
-25%
Python Developer. Professional
-25%
Разработчик на Spring Framework
-25%
Golang Developer. Professional
-25%
Python Developer. Basic
-25%
iOS Developer. Professional
-25%
Highload Architect
-25%
JavaScript Developer. Basic
-25%
Kotlin Backend Developer
-25%
JavaScript Developer. Professional
-25%
Android Developer. Basic
-25%
Unity Game Developer. Basic
-25%
Разработчик C#
-25%
Программист С Web-разработчик на Python Алгоритмы и структуры данных Framework Laravel PostgreSQL Reverse-Engineering. Professional CI/CD Vue.js разработчик VOIP инженер Программист 1С Flutter Mobile Developer Супер - интенсив по Kubernetes Symfony Framework Advanced Fullstack JavaScript developer Супер-интенсив "Azure для разработчиков"
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-25%
DevOps практики и инструменты
-25%
Архитектор сетей
-25%
Инфраструктурная платформа на основе Kubernetes
-25%
Супер-интенсив «ELK»
-16%
Супер-интенсив «IaC Ansible»
-16%
Супер-интенсив "SQL для анализа данных"
-16%
Базы данных Сетевой инженер AWS для разработчиков Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT IoT-разработчик Супер-интенсив «СУБД в высоконагруженных системах»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Ошибка порядка наследования в Liskov Substitution

JavaDeep_19.06_Site.png

Согласно тесту Тьюринга, если что-то плавает как утка, крякает как утка и летает как утка, то это что-то — утка. Но что делать, если при этом она не работает без батареек?

Если в вашем приложении объект пришёл к вам по референсу на базовый класс, но ведёт себя не так, как вы ждёте от базового класса, то у вас в приложении нарушен один из принципов SOLID — Liskov Substitution. Ошибка частая и не сразу заметная.

Ошибка порядка наследования

Например, у вас в приложении есть квадрат и прямоугольник. Что из них базовый класс? Школьная математика нам подсказывает, что квадрат — частный случай прямоугольника. Но в проектировании это не так.

Если прямоугольнику два метода setHeight() и setWidth() вполне подходят, то что они должны делать с квадратом? Например, первый может задавать размер квадрата, а второй… ничего не делать. Или наоборот. Это не так важно.

Важно, что архитектура у вас при наследовании квадратом методов прямоугольника сломана. И если кто-то получит на квадрат референс базового типа, он не сможет с ним работать.

Или другой пример: есть подвижный объект и неподвижный. Кто из них базовый? Ждём ваш ответ в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
3 комментария
0

Получается, что удобство наследования в большем приоритете, нежели точное отражение реальных объектов и их связей?

Почему нельзя в классе квадрата просто переопределить методы установки ширины и высоты?

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

0

Если в классе квадрата есть методы установки ширины и высоты, то это не квадрат. У квадрата только "задать длинну стороны" или "задать диагональ". Нет?

1

у квадрата есть методы установки ширины и высоты. правда на установку ширины бросает UnsupportedOperationException. =)

Для комментирования необходимо авторизоваться
🎁 Максимальная скидка!
Черная пятница уже в OTUS! Скидка -25% на всё!