Как использовать принцип единой ответственности - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь понять принципы дизайна в C ++.

В базе данных есть пользователи.

users:
   id
   name
   age
   gender

Я хочу получить своих пользователей тремя способами.

  • Во-первых: я хочу всех своих пользователей.
  • Второе. Я хочу, чтобы все мои пользователи были отфильтрованы по возрасту.
  • В-третьих: я хочу, чтобы все мои пользователи были отфильтрованы по возрасту и полу.

Например, если я использую один и тот же класс для getAllUsers и getFilteredByAge, это означает, что у моего класса есть две обязанности: он отвечает за получение пользователей, а также за их фильтрацию. Я прав или нет? И как работает принцип единой ответственности в этом примере, следует ли мне разделить эти три на разные классы, или есть какой-то лучший способ?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Хорошее определение для SRP:

Модуль должен отвечать за одного и только одного актера.

(Чистая архитектура)

Это означает, что если тот, кто говорит вам, что эти функции делают, один и тот же, вы можете оставить их в одном классе / модуле.

Если, скажем, getAllUsers() запрашивается бухгалтерией, а getUserAtLeastThisOld(int minimumAge) запрашивается HR, то может быть целесообразно иметь их в отдельных классах.

0 голосов
/ 30 августа 2018

Ниже приведены ответы на ваш вопрос

В] Если я использую один и тот же класс для getAllUsers и getFilteredByAge, это означает, что у моего класса есть две обязанности?

A] Нет, поскольку работа вашего класса состоит в том, чтобы привлекать пользователей, скорее, эти функции должны быть перегружены и не должны быть в разных классах.

Q] он отвечает за получение пользователей, а также за их фильтрацию. Я прав или нет?

A] Полагаю, нет! Фильтрация - это не отдельная задача, она должна применяться перед извлечением объектов.

В] Как работает принцип единой ответственности в этом примере, следует ли мне разделить эти три на разные классы, или есть какой-то лучший способ?

A]

В этом случае я предлагаю вам иметь только один класс, который должен иметь следующие перегрузки функций

  1. GetUsers () - получить всех пользователей
  2. GetUsers (AgeFilter) - получить пользователей по возрасту
  3. GetUsers (AgeFilter, sexFilter) - получить пользователей по возрастным фильтрам и гендерный фильтр

Примечание: Теперь предположим, что в будущем вы захотите добавить больше функций в этот класс например, рассчитать зарплату для пользователя или добавить сведения о семье для пользователей тогда в таком случае вы можете пойти на создание другого класса вместо того, чтобы обременять один класс ...

...