@cybernoob

Почему нельзя наследоваться от класса БД?

Представим себе что у нас есть класс DB, который работает с базой данных. Он имеет простые и понятные методы CRUD.
Почему бы от него не унаследовать остальные классы? Например класс юзеров или класс статей.
Это же очень удобно, я просто могу сделать parent::saveUser();

Можете объяснить почему это плохая практика (только не так что "это нарушает принцип единственной обязанности" - это я и сам знаю).

И как правильно определить какой клас можно от какого наследовать, и по каким признакам можно определить что нельзя и это плохая идея?
  • Вопрос задан
  • 192 просмотра
Решения вопроса 6
qonand
@qonand
Software Engineer
Уж извините, никого не хочу обидеть, но подобное желание наследоваться от всего подряд и отсутствие понимая почему так нельзя делать говорит о полном не понимании концепции ООП. Полноценно ответить на Ваши вопросы не возможно - не хватит поста, тут целую лекцию можно написать. Да и ответы породят только дополнительные вопросы. Поэтому лучше уделите недельку другую - и прочтите пару книг по ООП, и сразу все станет на свои места..
Ответ написан
gobananas
@gobananas
botbot.ru
В этом случае можно применить dependency injection, что бы передать объект базы в нужный класс. Наследоваться стоит когда сущности с которыми работают родитель и наследник одинаковые.
Ответ написан
И как правильно определить какой клас можно от какого наследовать, и по каким признакам можно определить что нельзя и это плохая идея?

мне на эту тему понравилась глава 32 из книги Скотта Майерса "Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ", можете погуглить.

глава называется "Используйте открытое наследование для моделирования отношения «является»"
и общая суть там ворочается вокруг
"Если вы пишете класс D (derived – «производный») открыто наследует классу B («base» – «базовый»), то тем самым сообщаете компилятору C++ (а заодно и людям, читающим ваш код), что каждый объект типа D является также объектом типа B, но не наоборот. Вы говорите, что B представляет собой более общую концепцию, чем D, а D – более конкретную концепцию, чем B. Вы утверждаете, что везде, где может быть использован объект B, можно использовать также объект D, потому что D является объектом типа B. С другой стороны, если вам нужен объект типа D, то объект B не подойдет, поскольку каждый D «является разновидностью» B, но не наоборот."(с)

В вашем же случае наследование юзера от DB можно интерпретировать как "пользователь является базой данных" - чувствуете что здесь что-то не то?
Ответ написан
@synapse_people
посмотрите шаблон репозитория, в вашем случае подходит..
Сегодня-завтра вдруг появится необходимость поменять способ хранения и что...?
Ответ написан
@oxidmod
В пыхе нет множественного наследования. Что вы будете делать, когда понадобиться отнаследоваться от другого класса? Будете делать OtherClass extends Db \ MyClass extends OtherClass ?

Вы только что добавиликлассу функциональность работы с бд, только для того чтобы нормально наследоваться.
Лучше в этом случае заменить наследование композицией и передавать вашим юзерам объект базы в конструктор.
Хотя конечно репозитории здесь будут куда уместней
Ответ написан
@dmitriylanets
Потому что нельзя наследовать человека от стула лишь потому что там есть спинка и ножки
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Duotek Москва
До 120 000 руб.
Zaymigo Нижний Новгород
До 60 000 руб.
от 130 000 руб.
20 авг. 2018, в 21:21
30000 руб./за проект
20 авг. 2018, в 20:46
5000 руб./за проект
20 авг. 2018, в 20:38
700 руб./в час