Single Responsibility Principle considered harmful
January 7, 2021
Наткнулся тут на эту статью и чёт меня малёха бомбануло.
Теоретически, принцип (Single Responsibility Principle ) возможно хороший и правильный, ток с ним есть одна проблема - анкл Боб 20 (двадцать) лет его объясняет и ни как объяснить не может.
Мне удалось отследить следующую историю формулировок этого принципа самим Мартином:
- 2003: "A class should have only one reason to change" - Agile Software Development, Principles, Patterns, and Practices
- 2008: "The Single Responsibility Principle (SRP) states that a class or module should have one, and only one, reason to change" - Clean Code
- 2014: "Gather together the things that change for the same reasons. Separate those things that change for different reasons." - The Single Responsibility Principle
- 2018: "A module should be responsible to one, and only one, actor" - Clean Architecture
И тем не менее, в статье с которой меня бомбануло написано: "That class itself should do one thing". По моим ощущениям "one thing" - это самая распространённая интерпретация SRP.
Всё бы ничего, но "thing" - понятие растяжимое. Сортировка, например - одна вещь? А если один метод в зависимости от размера входных данных использует разные алгоритмы? Это всё ещё одна вещь или несколько? А если код поддерживает сортировку массивов превышающих размер памяти и работает с диском соотвественно?
О размере вещей можно спорить бесконечно. На небесах программисты только и говорят о том, сколько вещей делает тот или иной кусок кода.
Но даже чёрт с ней с вещью. Сам анкл Боб путается в показаниях. В одной из статей
We do not mix business rules with GUI code
Так-то всё правильно пишет - действительно не мешаем и это хорошо. Только изменения в требованиях от одного источника зачастую требует изменений и в гуе, и в правилах и в БД. Т.е. эти штуки (для одной фичи) должны быть в одном месте.
В общем имхо, SRP - это хороший лозунг, который полезно знать и о котором стоит вспоминать, в третью очередь при анализе дизайна, но никак не основополагающий принцип дизайна.
И ещё не много хейта SOLID-а в целом:
- The SOLID Design Principles Deconstructed - доклад от крутого во всех смыслах мужика. Этого мужика можно его прям по имени по ютубить и смотреть всё подряд. Настоятельно рекомендую;
- Deconstructing SOLID design principles - пост от другого крутого мужика, который начал (и не осилил, похоже :( ) писать книгу примерно о том же, о чём пишу я:) Но он осилил сильно больше чем я (пока что), так что настоятельно рекомендую:)
- CUPID – the back story - неизвестный мне консультант.
И ответа Мартина на слайды из п. 3: Solid Relevance