Флюп движется в правильном направлении. «Принцип единой ответственности» изначально применялся к процедурам. Например, Деннис Ритчи сказал бы, что функция должна делать одну вещь и делать это хорошо. Затем в C ++ Бьярн Страуструп сказал бы, что класс должен делать одну вещь и делать это хорошо.
Обратите внимание, что, за исключением практических правил, эти два формально не имеют ничего общего или ничего общего друг с другом. Они обслуживают только то, что удобно выражать на языке программирования. Ну, это что-то. Но это совсем другая история, чем то, на что ездит флюп.
Современные реализации (т. Е. Agile и DDD) больше ориентированы на то, что важно для бизнеса, чем на то, что может выразить язык программирования. Удивительным моментом является то, что языки программирования еще не догнали. Старые языки, подобные Фортрану, берут на себя обязанности, которые соответствуют основным концептуальным моделям того времени: процессы, применяемые к каждой карточке, когда она проходила через устройство чтения карточек, или (как в С) обработку, сопровождающую каждое прерывание. Затем появились языки ADT, которые созрели для того, чтобы уловить то, что люди DDD позже заново изобрели как важные (хотя Джим Соседы многое из этого выяснили, опубликовали и использовали к 1968 году): то, что сегодня мы называем классами , (Они НЕ модули.)
Этот шаг был не столько эволюцией, сколько колебанием маятника. Когда маятник переключился на данные, мы потеряли моделирование вариантов использования, присущие FORTRAN. Это хорошо, когда ваш основной фокус связан с данными или фигурами на экране. Это отличная модель для таких программ, как PowerPoint, или, по крайней мере, для простых операций.
Что потеряно, так это системные обязанности . Мы не продаем элементы DDD. И мы не очень хорошо относимся к методам классов. Мы продаем системные обязанности. На каком-то уровне вам нужно спроектировать вашу систему на основе принципа единой ответственности.
Поэтому, если вы посмотрите на таких людей, как Ребекка Уирфс-Брок или я, которые раньше говорили о методах класса, мы сейчас поговорим о терминах использования. Это то, что мы продаем. Это системные операции. Вариант использования должен нести единоличную ответственность. Вариант использования редко является архитектурной единицей. Но все пытались сделать вид, что это было. Посмотрите людей SOA, например.
Вот почему я в восторге от архитектуры DCI Trygve Reenskaug, которая описана в книге Lean Architecture выше. Наконец, это дает некоторую реальную оценку тому, что раньше было произвольным и мистическим несоблюдением «единой ответственности» - как можно найти в большинстве рассуждений выше. Этот статус относится к человеческим ментальным моделям: сначала конечные пользователи И вторые программисты. Это относится к бизнесу. И, почти случайно, он заключает в себе изменения, так как флоп бросает нам вызов.
Принцип единоличной ответственности, поскольку мы знаем, что это либо динозавр, оставшийся от его дней происхождения, либо лошадь-хобби, которую мы используем в качестве замены для понимания. Вам нужно оставить несколько этих лошадей-хобби, чтобы сделать отличное программное обеспечение. И это требует нестандартного мышления. Простота и понятность вещей работает только тогда, когда проблема проста и понятна. Меня не очень интересуют эти решения: они не типичные, и проблема не в этом.