либо мы реализуем этот метод дважды (что было бы дублированием кода)
Это похоже на дублирование кода, но это не так.Тот факт, что реализация для calculateRegularHours
, которую используют calculatePay
и reportHours
, является одним и тем же, является просто случайностью.
Поскольку calculatePay
и reportHours
служат различным акторам, они будут меняться для разныхПричины в разное время.Таким образом, вполне вероятно, что один из этих актеров потребует изменения, которые другой актер не хочет.Итак, что касается этого запроса, что бы вы сделали?Я предполагаю, что вы разделите логику calculateRegularHours
на 2 реализации.Один для calculatePay
и один для reportHours
.Но также вероятно, что вы забудете об этом и сломаете систему в месте, которое не имеет ничего общего с изменением, которое вы хотели сделать.Это делает систему хрупкой.
Роберт К. Мартин объясняет это в этом видео (39:26 - 43:00).
Полагаю, лучшим примером нарушения SRP является использование методов, которые обслуживают пользовательский интерфейс в бизнес-объекте, или даже представление SQL в виде.
Независимо от того, что вы делаете, у вас должны быть тесты, потому чтотесты могут показать вам, что вы сломали систему в совершенно другой области.И если это произойдет, вы должны переосмыслить дизайн и вспомнить SRP.