Senior
Mis on DCI?
sobes.tech AI
Vastus AI-lt
DCI (Andmed-Kontext-Interaktsioon) on arhitektuurimuster, mis keskendub sellele, kuidas objektid suhtlevad konkreetses kontekstis, et täita teatud tegevust. Selle eesmärk on parandada koodi loetavust ja hooldatavust, eraldades andmed (Data) käitumisest kontekstis (Interaction), mis toimib nende üle kindlas olukorras (Context).
- Andmed (Data): esindavad objektide olekut. Need võivad olla tavalised klassid või struktuurid, mis sisaldavad andmeid.
- Kontekst (Context): kirjeldab konkreetset olukorda või stsenaariumi, kus toimub objektide vaheline suhtlus. Kontekst ühendab osalejad (andmeobjektid) rollidega.
- Interaktsioon (Interaction): määratleb käitumise või loogika, mida rakendatakse konteksti osalejatele. Interaktsioon realiseeritakse rollide kaudu, mida osalejad mängivad selles kontekstis.
DCI eelised:
- Paranenud loetavus: suhtluse kirjeldus on eraldatud andmete määratlusest, muutes selle selgemaks.
- Koodi dubleerimise vähendamine: konkreetse stsenaariumi käitumine inkapsuleeritakse, mis vähendab loogika dubleerimist.
- Suurenenud paindlikkus: on lihtsam muuta või lisada uusi suhtlusstsenaariumeid, mitte muuta andmete määratlust.
- Testitavus: eraldi komponendid (andmed, kontekst, suhtlused) on lihtsamini testitavad isoleeritult.
Näide stsenaariumi jaoks:
Kujutame ette stsenaariumi "rahaülekanne" kahe panga konto vahel.
- Andmed:
BankAccountklass koos väljadegabalancejaaccountNumber. - Kontekst:
MoneyTransferContext, mis ühendab kaksBankAccountobjekti rollidega "Allikas" (saaja) ja "Saaja" (saaja). - Interaktsioon: rahaülekande loogika: väljamakse saatja bilansist ja lisamine saaja bilansile. Seda loogikat rakendatakse rollide meetodite kaudu
MoneyTransferContext.
// Näide kontseptuaalsest koodist (mitte täielik DCI rakendus)
class BankAccount {
constructor(public balance: number, public accountNumber: string) {}
// Andmetele spetsiifilised meetodid
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("Piisavalt vahendeid ei ole");
}
}
}
// Kontekst ja suhtlus (lihtsuse huvides segatud)
class MoneyTransferContext {
constructor(private source: BankAccount, private destination: BankAccount) {}
transfer(amount: number): void {
try {
// Suhtlus rollide kaudu
this.source.withdraw(amount);
this.destination.deposit(amount);
console.log(`Edukas ${amount} ülekandmine ${this.source.accountNumber}-st ${this.destination.accountNumber}-le`);
} catch (error: any) {
console.error(`Ülekande ebaõnnestus: ${error.message}`);
}
}
}
// Kasutus
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");
const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Viga, kuna vahendid puuduvad
Reaalses DCI-s oleks suhtlus (transfer) realiseeritud eraldi "roll" meetodites, mis "injektitakse" või "lisatakse" BankAccount objektidele MoneyTransferContext kontekstis, mitte muutes BankAccount klassi ennast. See saavutatakse erinevate meetoditega, sõltuvalt programmeerimiskeelest.