все сводится к контексту того, что вы моделируете. Я подробно писал и представлял принципы SOLID, и я специально обращаюсь к вашему вопросу в своих обсуждениях единой ответственности.
Принцип единой ответственности гласит, что у класса должна быть одна и только одна причина для изменений.
Поначалу это может показаться нелогичным. Не было бы проще сказать, что у класса должна быть только одна причина для существования? На самом деле, ни одна причина для существования легко может быть доведена до крайности, которая принесет больше вреда, чем пользы. Если вы доведете его до такой крайности и создадите классы, у которых есть одна причина для существования, вы можете получить только один метод для каждого класса. Это привело бы к большому разрастанию классов даже для самых простых процессов, что сделало бы систему трудной для понимания и сложной для изменения.
Причина, по которой у класса должна быть одна причина для изменения, а не одна причина для существования, - это бизнес-контекст, в котором вы строите систему. Даже если две концепции логически различны, бизнес-контекст, в котором они нужны, может потребовать их объединения. Ключевой момент при принятии решения о том, когда следует изменить класс, основан не на чисто логическом разделении концепций, а, скорее, на восприятии концепции бизнесом. Когда бизнес-восприятие и контекст изменились, у вас есть причина сменить класс. Чтобы понять, какие обязанности должен иметь один класс, вам нужно сначала понять, какая концепция должна быть инкапсулирована этим классом и где вы ожидаете изменения деталей реализации этой концепции.
Возьмем, к примеру, двигатель автомобиля. Вы заботитесь о внутренней работе двигателя? Вы заботитесь о том, чтобы у вас были поршень, распределительный вал, топливная форсунка и т. Д. Определенного размера? Или вас волнует только то, что двигатель работает должным образом, когда вы садитесь в машину? Ответ, конечно, полностью зависит от контекста, в котором вам нужно использовать движок.
Если вы механик, работающий в автомастерской, вы, вероятно, заботитесь о внутренней работе двигателя. Вам необходимо знать конкретную модель, различные размеры деталей и другие характеристики двигателя. Если у вас нет этой информации, вы, скорее всего, не сможете обслуживать двигатель должным образом. Однако, если вы обычный человек, которому нужен только транспорт из пункта А в пункт Б, вам, скорее всего, не понадобится такая информация. Понятие отдельных поршней, свечей зажигания, шкивов, ремней и т. Д. Для вас почти бессмысленно. Вам важно только, чтобы у вашего автомобиля был двигатель и он работал правильно.
Пример двигателя напрямую затрагивает суть принципа единой ответственности. Контексты вождения автомобиля и обслуживания двигателя дают два разных представления о том, что должно, а что не должно быть единой концепцией - причиной для изменений. В контексте обслуживания двигателя каждая отдельная часть должна быть отдельной. Вам нужно закодировать их как отдельные классы и убедиться, что все они соответствуют их индивидуальным спецификациям. Однако в контексте вождения автомобиля двигатель - это единое понятие, которое не требует дальнейшего разбора. В этом случае у вас, скорее всего, будет один класс с именем Engine. В любом случае контекст определил, каково соответствующее разделение ответственности.