EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Правильно ли я понял принцип одной обязанности в классе?

Читая книгу Фриман и Фриман. Паттерны проектирования увидел прикольный принцип: «Класс должен иметь только одну причину для изменения» это стр. 361 в книге.

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

Возьмем к примеру простейший класс:
class CustomFormat
{
public:
  Header1 getHeader1();
  std::vector<Header2> getHeader2Array();
  void load();
  void save();  
};


Мне кажется что основной задачей класса является предоставление методов для работы со значениями заголовков. Но он также имеет и дополнительную задачу: класс имеет методы по чтению\записи.

Вопрос: Я правильно понимаю, что если следовать этому принципу, то мы должны методы load\save вынести в другой класс к примеру в какой-нить CustomFormatSerializer?

Меня не интересуют слова вида: «Вы знаете на практике… ». Меня очень волнует именно вопрос следования этому принципу, а не возможные компромиссы для достижения задач на практичеке.
  • Вопрос задан
  • 2852 просмотра
Решения вопроса 1
ixSci
@ixSci
Мне кажется что основной задачей класса является предоставление методов для работы со значениями заголовков. Но он также имеет и дополнительную задачу: класс имеет методы по чтению\записи.

Если следовать этой логике дол конца, то методы load и save полностью отвечают данной семантике, т.к. load изменяет(загружает) заголовки, а save их сохраняет. Т.е. при данной постановке задачи load/save являются методами CustomFormat заслуженно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@kaladhara
Мне кажется что основной задачей класса является предоставление методов для работы со значениями заголовков

Вам не должно казаться, класс создаётся для решения конкретной задачи, и разработчик должен понимать а не догадываться.

Меня очень волнует именно вопрос следования этому принципу

Прям-таки «очень»? Эта, извините за мой французский, херня Вас волнует?

Если по сути вопроса — то ответ «да», для следования указанному принципу нужно сериализацию выводить за пределы класса.
Если же следовать другому принципу , то сериализацию следует рассматривать как вспомогательную функцию для решения основной задачи, потому выносить не нужно.
Ответ написан
ertaquo
@ertaquo
Насколько я понимаю, это зависит от глубины разбиения задач. Например, стоит задача — сделать простую рисовалку. Вы можете засунуть все в класс типа CPaintBox. Но можно разбить эту большую задачу на несколько более мелких — работу с кистью, загрузку, сохранение, наложение фильтров. Работу с кистью тоже можно разбить — на работу с формой кисти и на работу с ее цветом.
Ответ написан
Комментировать
@Seter17
Если несколько форматов — то да, стоит вынести в другой класс. И работать на абстрактном уровне через интерфейсы.
По идее класс должен работать только со совими полями(свойствами). Так что во многом зависит от цели методов save/load
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы