Опрос на telegram-канале Cross Join "Можно ли наследовать класс Пингвин от класса Птица?" удивил. Большая часть людей ответили вполне определённо "да" или "нет" (результаты опроса приложены в конце статьи). Не ожидал такого расклада, поэтому решил написать короткую заметку.
На самом деле, если вам зададут такой вопрос на собеседовании, знайте: тут есть подвох. Даже два.
Если вы ответили "нет", то наверно заподозрили неладное, а именно: если сказать "да", то тут же потребуют реализовать птичий метод "лети()", а пингвины летать не умеют.
Но и это, к сожалению, тоже нельзя назвать правильным ответом.
Дело в том, что когда мы пишем программу, мы не оперируем настоящими животными, мы лишь моделируем их, т.е. строим модель для решения определенных задач бизнеса, а не для всего на свете.
Пингвин и птица в разных бизнес-контекстах могут быть описаны совершенно по-разному.
Для учета количества кала на квадратный километр территории — можно наследовать, без проблем. Если это для чего-то нужно и упрощает программу. Или, например, для исследования зависимости яйценоскости от географии — тоже ОК.
Для учета перемещений животных в пространстве возможно так не получится, потому что метод "лети" с большой вероятностью вызовет проблемы и костыли.
Более того, в одном и том же софте могут присутствовать сразу оба варианта. В различных bounded context могут быть разные модели.
Другой пример: пользователь, использующийся для проверки логина и пароля, и пользователь, для которого считают зарплату — это совершенно разные сущности, даже если у них id один и тот же. Их свойства могут храниться в разных таблицах или базах данных. Наследоваться от чего-то или нет — решается в каждом конкретном случае.
Ну и второй маленький подвох: даже в самом классе Птица делать метод "лети" не совсем корректно, так как это странное предположение, что все птицы летают. Помимо пингвинов, тысячи их: страусы, эму, киви и т.д. Тут модель сразу дала сбой.
Вообще, если говорить серьёзно, то в реальном программировании таких проблем как пингвин-птица не будет, если не заниматься сферическим оверинжинирингом с продумыванием несуществующих вещей наперед (вот хорошая статья про это). Так что это скорее кейс для собеседований, о котором лучше знать.
Upd. Попросили в саму статью приложить результаты опроса: