С последними дополнениями к нашей инфраструктуре инъекций зависимостей (аннотации в spring) предельные затраты на создание компонентов, управляемых DI, по-видимому, достигли некоторого критического нового порога. Хотя ранее были накладные расходы, связанные с spring (тонны XML и дополнительные ссылки), инъекция зависимостей, похоже, начала движение туда, куда идет множество шаблонов; они идут под капотом и "исчезают".
Следствием этого является то, что концептуальные служебные данные, связанные с большим числом, становятся приемлемыми. Можно утверждать, что мы могли бы создать систему, в которой большинство классов один единственный публичный метод и построить всю систему, просто объединив эти штуки, как сумасшедшие. В нашем случае дается несколько вещей; пользовательский интерфейс вашего приложения имеет некоторые функциональные требования, которые формируют самые верхние службы. А задние системы управляют нижней частью. Но между этими двумя, все для захватов.
Наше постоянное обсуждение действительно почему мы группируем вещи в классы и какими должны быть принципы? Несколько вещей уверены; рисунок фасада мертв и похоронен. Любая услуга, содержащая несколько несвязанных функций, также имеет тенденцию делиться. "Несвязанная функция" интерпретируется в гораздо более строгом смысле, чем когда-либо ранее.
В нашей команде есть два преобладающих поезда: здесь зависят ограничения группировки; любая функциональность в одном классе предпочтительно должна быть клиентом всех введенных зависимостей. Мы являемся проектом DDD, а другая часть считает, что домен ограничивает группировку (CustomerService или более мелкозернистый CustomerProductService, CustomerOrderService). Нормализованное использование вложенных зависимостей несущественно.
Итак, в слабосвязанной Вселенной DI, почему мы группируем логику в классы?
edit: duffymo указывает, что это может перейти к функциональному стилю программирования; который поднимает вопрос о государстве. У нас довольно много объектов "State", которые представляют (небольшие) части соответствующего состояния приложения. Мы вводим их в любую службу, которая имеет законную потребность в этом состоянии. (Причина, по которой мы используем объекты "State" вместо обычных объектов домена, заключается в том, что spring построить их в неопределенное время. Я рассматриваю это как небольшое обходное решение или альтернативное решение, позволяющее spring управлять фактическим созданием объектов домена. могут быть лучшими решениями здесь).
Так, например, любая служба, которая нуждается в OrderSystemAccessControlState, может просто вставить это, и объем этих данных не всегда известен потребителю. Некоторое состояние состояния, связанного с безопасностью, обычно используется на множестве разных уровней, но совершенно невидимо на уровнях между ними. Я действительно считаю, что это принципиально нарушает функциональные принципы. Я даже с трудом подстраивался под эту концепцию с точки зрения OO - но пока инъецированное состояние является точным и сильно типом, тогда необходимость законна, так как правильный вариант подходит.