Sobes.tech
Senior

Kas ir DCI?

sobes.tech AI

Atbilde no AI

DCI (Dati-Kontexts-Interakcija) ir arhitektūras modelis, kas koncentrējas uz to, kā objekti sadarbojas konkrētā kontekstā, lai veiktu noteiktu darbību. Tas ir paredzēts, lai uzlabotu koda lasāmību un uzturēšanu, atdalot datus (Data) no uzvedības kontekstā (Interaction), kas darbojas ar tiem noteiktā situācijā (Context).

  • Dati (Data): pārstāv objektu stāvokli. Tie var būt parasti klases vai struktūras, kas satur datus.
  • Konteksts (Context): apraksta konkrētu situāciju vai scenāriju, kurā notiek objektu sadarbība. Konteksts sasaista dalībniekus (datu objektus) ar lomām.
  • Interakcija (Interaction): nosaka uzvedību vai loģiku, kas tiek piemērota konteksta dalībniekiem. Sadarbība tiek īstenota caur lomām, kuras spēlē dalībnieki šajā kontekstā.

DCI priekšrocības:

  • Uzlabota lasāmība: sadarbības apraksts ir atdalīts no datu definīcijas, padarot to skaidrāku.
  • Koda dublēšanās samazināšana: specifiska scenārija uzvedība tiek inkapsulēta, kas samazina loģikas dublēšanos.
  • Lielāka elastība: vieglāk mainīt vai pievienot jaunus sadarbības scenārijus, nemainot datu definīciju.
  • Testējamība: atsevišķas sastāvdaļas (dati, konteksts, sadarbības) ir vieglāk testējamas izolēti.

Piemērs scenārijam:

Iedomāsimies scenāriju "naudas pārskaitījums" starp divām bankas kontiem.

  • Dati: BankAccount klase ar laukiem balance un accountNumber.
  • Konteksts: MoneyTransferContext, kas sasaista divus BankAccount objektus ar lomām "Avots" (sūtītājs) un "Saņēmējs" (saņēmējs).
  • Interakcija: naudas pārskaitījuma loģika: izņemšana no sūtītāja bilances un pievienošana saņēmēja bilancei. Šī loģika tiek īstenota caur lomām MoneyTransferContext.
// Piemērs koncepcijas kodam (ne pilna DCI īstenošana)
class BankAccount {
  constructor(public balance: number, public accountNumber: string) {}

  // Datu metodes
  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("Nepieciešamie līdzekļi nav pieejami");
    }
  }
}

// Konteksts un sadarbība (vienkāršības labad sajaukts)
class MoneyTransferContext {
  constructor(private source: BankAccount, private destination: BankAccount) {}

  transfer(amount: number): void {
    try {
      // Sadarbība caur lomām
      this.source.withdraw(amount);
      this.destination.deposit(amount);
      console.log(`Veiksmīgi pārskaitīts ${amount} no ${this.source.accountNumber} uz ${this.destination.accountNumber}`);
    } catch (error: any) {
      console.error(`Pārskaitījuma neveiksme: ${error.message}`);
    }
  }
}

// Piemērs izmantošanai
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");

const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // kļūda, ja nav pietiekami līdzekļu

Reālajā DCI, sadarbība (transfer loģika) būtu realizēta atsevišķās "lomu" metodēs, kas "injektējas" vai "pievienojas" BankAccount objektiem MoneyTransferContext kontekstā, nemainot pašu BankAccount klasi. Tas tiek panākts dažādi, atkarībā no programmēšanas valodas.