Mi az a DCI?
sobes.tech MI
Válasz az MI-től
A DCI (Data-Context-Interaction) egy architekturális mintázat, amely arra összpontosít, hogyan lépnek kölcsönhatásba az objektumok egy adott kontextusban, hogy végrehajtsanak egy meghatározott műveletet. Célja a kód olvashatóságának és karbantarthatóságának javítása, az adatok (Data) és a viselkedés (Interaction) elkülönítésével a kontextusban (Context), amely azokon belül működik.
- Data (Adatok): Az objektumok állapotát képviseli. Lehetnek egyszerű osztályok vagy struktúrák, amelyek adatokat tartalmaznak.
- Context (Környezet): Leírja az adott helyzetet vagy szcenáriót, amelyben az objektumok kölcsönhatásba lépnek. A környezet összekapcsolja a résztvevőket (adatobjektumokat) szerepekkel.
- Interaction (Kölcsönhatás): Meghatározza a viselkedést vagy a logikát, amely alkalmazva van a környezet résztvevőire. A kölcsönhatás a szerepek révén valósul meg, amelyeket a résztvevők játszanak ebben a kontextusban.
A DCI előnyei:
- Javított olvashatóság: A kölcsönhatást leíró kód elkülönül az adatok meghatározásától, így könnyebben érthető.
- Kódismétlés csökkentése: A konkrét szcenárióhoz tartozó viselkedés inkapszulálva van, csökkentve a logika ismétlését.
- Nagyobb rugalmasság: Könnyebb módosítani vagy új kölcsönhatási szcenáriókat hozzáadni anélkül, hogy az adatok meghatározását érintenénk.
- Tesztelhetőség: Az egyes komponensek (adatok, környezet, kölcsönhatások) izoláltan könnyebben tesztelhetők.
Példa (koncepcionális):
Képzeljük el a "pénz átutalása" szcenáriót két banki számla között.
- Data: A
BankAccountosztálybalanceésaccountNumbermezőkkel. - Context:
MoneyTransferContext, amely kétBankAccountobjektumot köt össze "Source" (küldő) és "Destination" (fogadó) szerepekkel. - Interaction: A pénz átutalás logikája: a küldő egyenlegéből levonás és a fogadó egyenlegéhez hozzáadás. Ez a logika a
MoneyTransferContextbelsejében a "Source" és "Destination" szerepek metódusain keresztül valósul meg.
// Koncepcionális kód példa (nem teljes DCI megvalósítás)
class BankAccount {
constructor(public balance: number, public accountNumber: string) {}
// Adatokhoz kapcsolódó metódusok
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("Elégtelen fedezet");
}
}
}
// Környezet és kölcsönhatás (egyszerűsített példában keverednek)
class MoneyTransferContext {
constructor(private source: BankAccount, private destination: BankAccount) {}
transfer(amount: number): void {
try {
// Kölcsönhatás szerepek révén (itt nem nyilvánvaló)
this.source.withdraw(amount);
this.destination.deposit(amount);
console.log(`Sikeresen átutalt ${amount} a ${this.source.accountNumber} -ról a ${this.destination.accountNumber} -ra`);
} catch (error: any) {
console.error(`Az átutalás nem sikerült: ${error.message}`);
}
}
}
// Használat
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");
const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Hiba az elégtelen fedezet miatt
A valódi DCI-ben a kölcsönhatás (pl. transfer logika) külön "szerep" metódusokban valósulna meg, amelyeket "injektálnának" vagy "hozzáadnának" a BankAccount objektumokhoz a MoneyTransferContext kontextusában, anélkül, hogy módosítanák a BankAccount osztályt. Ez különböző technikákkal érhető el a programozási nyelvtől függően.