Что такое DCI?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
DCI (Data-Context-Interaction) — это архитектурный паттерн, который фокусируется на том, как объекты взаимодействуют в конкретном контексте, чтобы выполнить определенное действие. Он призван улучшить читабельность и поддерживаемость кода, отделяя данные (Data) от поведения в контексте (Interaction), действующего над ними в определенной ситуации (Context).
- Data (Данные): Представляет собой состояние объектов. Это может быть обычные классы或структуры, содержащие данные.
- Context (Контекст): Описывает конкретную ситуацию или сценарий, в котором происходит взаимодействие объектов. Контекст связывает участников (объекты данных) с ролями.
- Interaction (Взаимодействие): Определяет поведение или логику, применяемую к участникам контекста. Взаимодействие реализуется через роли, которые участники играют в данном контексте.
Преимущества DCI:
- Улучшенная читабельность: Код, описывающий взаимодействие, отделен от определения данных, что делает его более понятным.
- Сокращение дублирования кода: Поведение, специфичное для конкретного сценария, инкапсулируется, что уменьшает необходимость дублировать логику.
- Повышенная гибкость: Легче изменять или добавлять новые сценарии взаимодействия, не затрагивая определения данных.
- Тестируемость: Отдельные компоненты (данные, контекст, взаимодействия) легче тестировать изолированно.
Пример (концептуальный):
Представим сценарий "перевод денег" между двумя банковскими счетами.
- Data: Класс
BankAccountс полямиbalanceиaccountNumber. - Context:
MoneyTransferContextкоторый связывает два объектаBankAccountс ролями "Source" (отправитель) и "Destination" (получатель). - Interaction: Логика перевода денег: вычитание с баланса отправителя и добавление на баланс получателя. Эта логика реализуется через методы ролей "Source" и "Destination" внутри
MoneyTransferContext.
// Пример концептуального кода (не полноценная реализация DCI)
class BankAccount {
constructor(public balance: number, public accountNumber: string) {}
// Методы, специфичные для данных
getBalance(): number {
return this.balance;
}
deposit(amount: number): void {
this.balance += amount;
}
withdraw(amount: number): void {
if (this.balance >= amount) {
this.balance -= amount;
} else {
throw new Error("Insufficient funds");
}
}
}
// Контекст и взаимодействие (здесь смешано для простоты)
class MoneyTransferContext {
constructor(private source: BankAccount, private destination: BankAccount) {}
transfer(amount: number): void {
try {
// Взаимодействие через роли (неявно здесь)
this.source.withdraw(amount);
this.destination.deposit(amount);
console.log(`Successfully transferred ${amount} from ${this.source.accountNumber} to ${this.destination.accountNumber}`);
} catch (error: any) {
console.error(`Failed to transfer money: ${error.message}`);
}
}
}
// Использование
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");
const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Ошибка из-за недостатка средств
В реальном DCI, взаимодействие (логика transfer) была бы реализована в отдельных "ролевых" методах, которые "инжектируются"或"добавляются" к объектам BankAccount в контексте MoneyTransferContext, не меняя сам класс BankAccount. Это достигается различными приемами в зависимости от языка программирования.