Single Responsibility Principle considered harmful

January 7, 2021

Наткнулся тут на эту статью и чёт меня малёха бомбануло.

Теоретически, принцип (Single Responsibility Principle ) возможно хороший и правильный, ток с ним есть одна проблема - анкл Боб 20 (двадцать) лет его объясняет и ни как объяснить не может.

Мне удалось отследить следующую историю формулировок этого принципа самим Мартином:

И тем не менее, в статье с которой меня бомбануло написано: "That class itself should do one thing". По моим ощущениям "one thing" - это самая распространённая интерпретация SRP.

Всё бы ничего, но "thing" - понятие растяжимое. Сортировка, например - одна вещь? А если один метод в зависимости от размера входных данных использует разные алгоритмы? Это всё ещё одна вещь или несколько? А если код поддерживает сортировку массивов превышающих размер памяти и работает с диском соотвественно?

О размере вещей можно спорить бесконечно. На небесах программисты только и говорят о том, сколько вещей делает тот или иной кусок кода.

Но даже чёрт с ней с вещью. Сам анкл Боб путается в показаниях. В одной из статей

We do not mix business rules with GUI code

Uncle Bob, https://blog.cleancoder.com/uncle-bob/2020/10/18/Solid-Relevance.html

Так-то всё правильно пишет - действительно не мешаем и это хорошо. Только изменения в требованиях от одного источника зачастую требует изменений и в гуе, и в правилах и в БД. Т.е. эти штуки (для одной фичи) должны быть в одном месте.

В общем имхо, SRP - это хороший лозунг, который полезно знать и о котором стоит вспоминать, в третью очередь при анализе дизайна, но никак не основополагающий принцип дизайна.

И ещё не много хейта SOLID-а в целом:

  • The SOLID Design Principles Deconstructed - доклад от крутого во всех смыслах мужика. Этого мужика можно его прям по имени по ютубить и смотреть всё подряд. Настоятельно рекомендую;
  • Deconstructing SOLID design principles - пост от другого крутого мужика, который начал (и не осилил, похоже :( ) писать книгу примерно о том же, о чём пишу я:) Но он осилил сильно больше чем я (пока что), так что настоятельно рекомендую:)
  • CUPID – the back story - неизвестный мне консультант.

И ответа Мартина на слайды из п. 3: Solid Relevance