Sobes.tech
Senior

What is DCI and how is it used in development?

sobes.tech AI

Answer from AI

DCI (Data-Context-Interaction) is an architectural pattern aimed at improving object-oriented design by making behavior more understandable and aligned with users' mental models of the real world.

Main elements of DCI:

  • Data: Passive objects representing data and their structures (e.g., Account, Transaction). They do not contain business logic.
  • Context: An object that links data and roles to perform a specific use case. It orchestrates interactions.
  • Interactions: Behavior associated with roles in a specific context. It is implemented through methods that can be mixed into or added to data objects during runtime or through composition.

How it is used in development:

DCI is used for modeling use scenarios (user stories). Instead of placing all logic in "thick" data objects, it is distributed among roles within a specific interaction context.

Advantages of DCI:

  • Clarity: Code better reflects real business processes.
  • Resilience: Changes in one scenario have less impact on others.
  • Testability: Roles and contexts are easier to test in isolation.
  • Reusability: Behavior (roles) can be used in different contexts.

Example (pseudo-code):

// Data
class Account {
  balance: number;

  constructor(balance: number) {
    this.balance = balance;
  }
}

// Roles (defined within the context, can be implemented via mixins, interfaces, or delegation)
// Role FromAccountMixin {
//   withdraw(amount) { ... }
// }
// Role ToAccountMixin {
//   deposit(amount) { ... }
// }

// Context (money transfer)
class TransferContext {
  from: Account; // Data object playing the role of FromAccount
  to: Account;   // Data object playing the role of ToAccount
  amount: number;

  constructor(from: Account, to: Account, amount: number) {
    this.from = from;
    this.to = to;
    this.amount = amount;
  }

  execute() {
    // Role interactions
    if (this.from.balance >= this.amount) {
      // Demonstrates the concept of calling behavior through a role
      // Implementation may vary (mixins, delegation, etc.)
      this.from.withdraw(this.amount);
      this.to.deposit(this.amount);
      console.log(`Transferred ${this.amount} from ${this.from} to ${this.to}`);
    } else {
      console.log("Insufficient funds");
    }
  }
}

// Usage example
const account1 = new Account(100);
const account2 = new Account(50);

// Important: Behavior of roles withdraw/deposit is implicitly (or explicitly via mixins/delegates) added to Account objects upon entering the context.

const transfer = new TransferContext(account1, account2, 30);
transfer.execute();

DCI is useful in domain-driven design (DDD), helping to model complex business processes.