Когда стоит наследоваться от класса?

165
26 августа 2017, 01:33

Ведь можно сделать просто:

class DB {
    // все методы работы с БД
}
class Logger extends DB {
    // все методы логирования в БД и файлы
}
class Valirator extends Logger {
    // все методы проверки форм
}
class User extends Valirator {
    // все методы работы с юзером
}

И всё, я победитель по жизни, у меня в User досупны все методы всех родителей, хочу в базу пишу, логирую, проверяю. Но что-то посказывает что это неправильно.

  1. Почему так как написано в коде выше это плохо?
  2. По какому принципу в приложении выбирают кто и от кого должен наследоваться?
Answer 1

Плохого в это то, что нарушается принцип единственной ответственности. Например тут "у меня в User досупны все методы всех родителей". Зачем вашему User уметь, да и вообще знать, про какое-то там логирование?

Наследоваться имеет смысл если и родитель и потомок действительно являются "родственниками".

Т.е. например "Авторизованный пользователь" вполне логично отнаследовать от "Пользователь", а вот наследовать "Пользователя" от "Базы данных" - это какой-то оксюморон.

Вот так норм:

AuthorizedUser extends User
PrivilegedUser extends AuthorizedUser

А вот так нет

Table extends User
User extends Autobus
Autobus extends Database

UPD

С точки зрения объектного подхода к проектированию, User у вас - это отражение актора "Пользователь", который в принципе не должен знать о том, как устроена логика вашего приложения. Validator, Logger и Database- это, по хорошему, интерфейсы, а не объекты, с которыми, опять же по хорошему, User взаимодействовать не должен.

Рассмотрим use case - пользователь заходит в систему и по этому факту происходит его проверка и логирование.

  1. Пользователь вводит логин и пароль
  2. Подсистема авторизации передает в объект класса, реализующий интерфейс Validator введенные данные.
  3. Validator проверяет корректность и передает объекту класса, реализующего интерфейс Logger, данные для логирования
  4. Конкретный Logger, наследующий от DatabaseSource или FileSource (соответственно DbLogger или FileLogger) совершает логирование
  5. Подсистеме авторизации возвращается соответствующий объект User, PriveledgedUser, ReadOnlyUser, etc... Либо ошибка авторизации (Exception например)
READ ALSO
Call to undefined function mysql_connect() [дубликат]

Call to undefined function mysql_connect() [дубликат]

На данный вопрос уже ответили:

198
Помогите фиксануть ошибки [требует правки]

Помогите фиксануть ошибки [требует правки]

https://pastebincom/yEk6d7JU вот тут код, и такие ошибки if (Hacks

177
qt c++ ошибка undefined reference to

qt c++ ошибка undefined reference to

В отдельном заголовочном файле описываю класс сцены

416