SRP обычно обозначается как «Каждый класс должен иметь одну ответственность», но это неточно.Лучшее утверждение: «Модуль должен иметь одну-единственную причину для изменения».Как я опишу в Принцип единой ответственности: это фундаментальная ошибка? Я могу представить себе две возможные оси изменений:
- Изменение бизнеса
- Технологические изменения
Сокращение бизнес-изменений до "одной причины для изменения" означает, что в бизнесе должен быть только один человек, который попросит вас изменить конкретный модуль.Например, некоторые люди, которые могут попросить об изменении, являются главой продукта или руководителем дизайна.Таким образом, это означает, что мы должны отделить, как вещь ведет себя от того, как она выглядит.
Примером технологических изменений является изменение способа хранения вещи.«Нам нужно перейти от базы данных SQL к плоскому хранилищу NoSQL».
Итак, что он делает, как он выглядит, от инфраструктуры, от которой он зависит - это то, что нужно отделить.Не твой пёс.Принцип разделения интерфейсов приводит к тонким слоям интерфейсов, таким как лай и питание.Это позволяет вызывающим абонентам зависеть от этих тонких кусочков, а не от какого-то огромного интерфейса, такого как Animal, который имеет множество вещей, в которых он не нуждается.
Так что я бы сказал
class Dog: Barking & Eating & Sleeping
не обязательно нарушать SRP, особенно когда каждый интерфейс тонкий.
Тем не менее, я видел, как люди соединяют несвязанные интерфейсы вместе, чтобы создать чудовищности.Это в основном результат ленивого использования существующего класса в качестве свалки.Пока вы продолжаете спрашивать: «Можно ли это отделить?»и, видя, можете ли вы взять на себя ответственность, вы справляетесь лучше, чем большинство людей.