Недавно я сделал опрос, который показал, что на вопрос, можно ли наследовать класс Пингвин от класса Птица, большая часть людей ответили вполне определённо "да" или "нет". Удивился такому раскладу, поэтому решил написать короткую статью.
На самом деле, если вам зададут такой вопрос на собеседовании, знайте: тут есть подвох. Даже два.
Если вы ответили "нет", то наверно заподозрили неладное, а именно: если сказать "да", то тут же потребуют реализовать птичий метод "лети()", а пингвины летать не умеют.
Но и это, к сожалению, тоже нельзя назвать правильным ответом.
Дело в том, что когда мы пишем программу, мы не оперируем настоящими животными, мы лишь моделируем их, т.е. строим модель для решения определенных задач бизнеса, а не для всего на свете.
Пингвин и птица в разных бизнес-контекстах могут быть описаны совершенно по-разному.
Для учета количества кала на квадратный километр территории — можно наследовать, без проблем. Или, например, для исследования зависимости яйценоскости от географии.
Для учета перемещений животных в пространстве возможно так не получится, потому что метод "летать" вызовет проблемы и костыли.
Более того, в одном и том же софте могут присутствовать сразу оба варианта. В различных bounded context могут быть разные модели.
Другой пример: пользователь, использующийся для проверки логина и пароля, и пользователь, для которого считают зарплату — это совершенно разные сущности, даже если у них id один и тот же. Их свойства могут храниться в разных таблицах или базах данных. Наследоваться от чего-то или нет — решается в каждом конкретном случае.
Ну и второй маленький подвох: даже в самом классе Птица делать метод "лети" не совсем корректно, так как это странное предположение, что все птицы летают. Помимо пингвинов, тысячи их: страусы, эму, киви и т.д. Тут модель сразу дала сбой.
Вообще, если говорить серьёзно, то в реальном программировании таких проблем как пингвин-птица не будет, если не заниматься сферическим оверинжинирингом с продумыванием несуществующих вещей наперед (вот хорошая статья про это). Так что это скорее кейс для собеседований, о котором лучше знать.
Upd. Попросили в саму статью приложить результаты опроса:
ссылка на оригинал статьи https://habr.com/ru/post/545902/
Добавить комментарий