Принцип єдиної відповідальності
("кожен клас повинен мати лише одну відповідальність; іншими словами, кожен клас повинен мати одну, і лише одну, причину для зміни")
Я не погоджуюсь. Я думаю, що метод повинен мати лише одну причину для зміни, і всі методи в класі повинні мати логічне відношення один до одного , але сам клас може насправді зробити кілька (пов'язаних) речей.
На мій досвід, цей принцип занадто часто застосовується надто ревно, і ви закінчуєте багато крихітних однометодних класів. Обидва спритні магазини, в яких я працював, зробили це.
Уявіть, якби у творців API .Net був такий менталітет: а не List.Sort (), List.Reverse (), List.Find () тощо, ми мали б класи ListSorter, ListReverser та ListSearcher!
Замість того, щоб більше сперечатися проти СРП (що само по собі не є страшним в теорії) , я поділюся кількома моїми довгими анекдотичними переживаннями:
В одному місці, де я працював, я написав дуже простий вирішувач максимального потоку, який складався з п’яти класів: вузол, графік, графік-творець, графік-вирішувач і клас, щоб використовувати графік-творець / розв'язувачі для вирішення реальна проблема. Жоден не був особливо складним або довгим (вирішувач був на сьогодні найдовшим на ~ 150 рядків). Однак було вирішено, що в класах було занадто багато "обов'язків", тому мої колеги взялися за рефакторинг коду. Коли вони закінчилися, мої 5 класів були розширені до 25 класів, загальна кількість кодових рядків яких була більш ніж втричі вище, ніж вони були спочатку. Потік коду вже не був очевидним, а також не було метою нових одиничних тестів; Мені зараз важко було зрозуміти, що робив мій власний код.
Там же майже кожен клас мав лише єдиний метод (його єдина «відповідальність»). Слідкувати за потоком програми було майже неможливо, і більшість одиничних тестів складалися з тестування, яке цей клас називав кодом з іншого класу , обидва цілі якого для мене були однаково загадкою. Було буквально сотні занять, де мали бути (ІМО) лише десятки. Кожен клас робив лише одну "річ" , але навіть з умовами іменування типу "AdminUserCreationAttemptorFactory" було складно сказати взаємозв'язок між класами.
В іншому місці (у якому також були менталітети класів "повинен-мати-лише-один метод" ) ми намагалися оптимізувати метод, який займав 95% часу під час певної операції. Після (досить тупо) її оптимізації трохи я звернув свою увагу на те, чому його називали байліоном разів. Його називали в циклі в класі ... метод якого викликався в циклі в іншому класі .. який також викликався в циклі ..
Все, що було сказано, було п'ять рівнів петель, розповсюджених на 13 класах (серйозно). Що насправді робив будь-який клас, неможливо було визначити, лише подивившись на це - ви мусили намалювати ментальний графік того, які методи він викликав, і які методи називали ці методи тощо. Якби все це було об'єднано в один метод, то це було б близько 70 рядків, коли наш проблемний метод вклався в п’ять відразу очевидних рівнів циклів.
У моєму проханні відновити ці 13 класи в один клас було відхилено.