Sobes.tech
Senior

Kas yra DCI?

sobes.tech AI

Atsakymas iš AI

DCI (Duomenys-Kontextas-Interakcija) yra architektūros modelis, kuris sutelkia dėmesį į tai, kaip objektai sąveikauja konkrečiame kontekste, kad atliktų tam tikrą veiksmą. Jis siekia pagerinti kodo skaitomumą ir palaikymą, atskiriant duomenis (Data) nuo elgesio kontekste (Interaction), kuris veikia su jais tam tikroje situacijoje (Context).

  • Data (Duomenys): atstovauja objektų būseną. Tai gali būti įprasti klasės ar struktūros, turinčios duomenis.
  • Context (Kontekstas): apibūdina konkrečią situaciją ar scenarijų, kuriame vyksta objektų sąveika. Kontekstas susieja dalyvius (duomenų objektus) su vaidmenimis.
  • Interaction (Sąveika): apibrėžia elgesį ar logiką, taikomą konteksto dalyviams. Sąveika įgyvendinama per vaidmenis, kuriuos atlieka dalyviai šiame kontekste.

DCI privalumai:

  • Pagerintas skaitomumas: sąveikos aprašymas yra atskirtas nuo duomenų apibrėžimo, todėl jis yra aiškesnis.
  • Kodo dubliavimosi mažinimas: specifinis scenarijaus elgesys inkapsuliuojamas, kas sumažina logikos dubliavimą.
  • Didesnė lankstumas: lengviau keisti ar pridėti naujus sąveikos scenarijus, nekeičiant duomenų apibrėžimo.
  • Testuojamumas: atskiri komponentai (duomenys, kontekstas, sąveikos) yra lengviau testuojami izoliuotai.

Pavyzdinis scenarijus:

Įsivaizduokime scenarijų "pinigų pervedimas" tarp dviejų banko sąskaitų.

  • Data: BankAccount klasė su laukais balance ir accountNumber.
  • Context: MoneyTransferContext, kuris susieja du BankAccount objektus vaidmenimis "Šaltinis" (siuntėjas) ir "Gavėjas" (gavėjas).
  • Interaction: pinigų pervedimo logika: išskaičiavimas iš siuntėjo balanso ir pridėjimas prie gavėjo balanso. Ši logika įgyvendinama per vaidmenų metodus MoneyTransferContext.
// Pavyzdinis koncepcijos kodas (ne pilnas DCI įgyvendinimas)
class BankAccount {
  constructor(public balance: number, public accountNumber: string) {}

  // Duomenims būdingi metodai
  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("Nepakankamai lėšų");
    }
  }
}

// Kontekstas ir sąveika (paprastumo dėlei sumaišyta)
class MoneyTransferContext {
  constructor(private source: BankAccount, private destination: BankAccount) {}

  transfer(amount: number): void {
    try {
      // Sąveika per vaidmenis
      this.source.withdraw(amount);
      this.destination.deposit(amount);
      console.log(`Sėkmingai pervestas ${amount}${this.source.accountNumber} į ${this.destination.accountNumber}`);
    } catch (error: any) {
      console.error(`Pervedimo nepavyko: ${error.message}`);
    }
  }
}

// Naudojimas
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");

const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Klaida dėl nepakankamų lėšų

Tikrame DCI sąveika (transfer logika) būtų įgyvendinta atskiruose "vaidmenų" metoduose, kurie "injektuojami" arba "pridedami" prie BankAccount objektų MoneyTransferContext kontekste, nekeičiant paties BankAccount klasės. Tai pasiekiama įvairiais būdais, priklausomai nuo programavimo kalbos.