Senior
48
questionbank

Что такое DCI?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

DCI (Data-Context-Interaction) — это шаблон проектирования, предлагающий разделить логику приложения на три взаимодействующие части:

  • Data (Данные): Объекты, представляющие предметную область (например, Account, User). Не содержат бизнес-логики, только данные и базовые операции доступа.
  • Context (Контекст): Объект, описывающий конкретный сценарий использования (use case) или взаимодействие между объектами. Он связывает данные с ролями и координирует выполнение взаимодействия.
  • Interactions (Взаимодействия) / Roles (Роли): Поведение, которое объекты (Data) приобретают в рамках определенного контекста. Роли определяют, как объекты взаимодействуют друг с другом для выполнения задачи.

Основная идея DCI — выделить операционную логику (бизнес-процессы) из объектов данных, делая их более чистыми и повторно используемыми. Логика концентрируется в контекстах и ролях, что облегчает понимание и изменение конкретных сценариев использования.

Преимущества DCI:

  • Улучшенная читаемость: Код, связанный с определенным сценарием, находится в одном месте (контексте).
  • Снижение сложности объектов данных: Объекты данных остаются "тощими", содержащими только состояние.
  • Повторное использование данных: Объекты данных могут использоваться в различных контекстах с разными ролями.
  • Легкость тестирования: Сценарии (контексты) можно тестировать изолированно.

Пример (концептуальный): Перевод денег между счетами.

  • Data: Объекты Account (содержит баланс, методы deposit, withdraw).
  • Context: TransferMoneyContext. Он связывает два объекта Account (источник и получатель) и определяет роли.
  • Roles:
    • SourceAccount (Роль для исходного счета, может withdraw).
    • DestinationAccount (Роль для счета получателя, может deposit).

В TransferMoneyContext будет описана логика: взять деньги с SourceAccount, если возможно, и положить на DestinationAccount.

DCI не привязан к конкретному языку, но его реализация может варьироваться. В объектно-ориентированных языках роли часто реализуются через миксины, трейты, или интерфейсы/классы, которые объекты данных "принимают" в контексте.