Ի՞նչ է DCI-ն։
sobes.tech AI
Պատասխան AI-ից
DCI (Data-Context-Interaction) մոդելը ճարտարապետական ձևաչափ է, որը կենտրոնացած է այն բանի վրա, թե ինչպես են օբյեկտները փոխազդում կոնտեքստում՝ կատարելու համար որոշակի գործողություն։ Նրա նպատակն է բարելավել կոդի ընթեռնելիությունը և պահպանելիությունը՝ տարբերակելով տվյալները (Data) և վարքագիծը (Interaction) կոնտեքստի (Context) շրջանակում, որը գործում է դրանց վրա:
- Data (Տվյալներ): ներկայացնում է օբյեկտների վիճակը։ Դա կարող է լինել սովորական դասեր կամ կառուցվածքներ, որոնք պարունակում են տվյալներ։
- Context (Կոնտեքստ): նկարագրում է կոնկրետ իրավիճակը կամ սցենարը, որտեղ տեղի է ունենում օբյեկտների փոխազդեցությունը։ Կոնտեքստը կապում է մասնակիցներին (տվյալների օբյեկտներ) դերերով։
- Interaction (Փոխազդեցություն): սահմանում է վարքագիծը կամ տրամաբանությունը, որը կիրառվում է կոնտեքստի մասնակիցների վրա։ Փոխազդեցությունը իրականացնում է դերերի միջոցով, որոնք խաղում են մասնակիցները այս կոնտեքստում։
DCI-ի առավելությունները՝
- Բարելավված ընթեռնելիություն: Փոխազդեցությունը նկարագրող կոդը առանձին է տվյալների սահմանումից, ինչը դարձնում է ավելի հեշտ հասկանալ։
- Կոդի կրկնօրինակում նվազեցում: Սպեցիֆիկ սցենարի վարքագիծը ինկապսուլացված է, ինչը նվազեցնում է տրամաբանության կրկնությունը։
- Ավելին ճկունություն: Ավելի հեշտ է փոխել կամ ավելացնել նոր փոխազդեցության սցենարներ՝ առանց տվյալների սահմանումները փոխելու։
- Թեստավորման հնարավորություն: Անհատական բաղադրիչները (տվյալներ, կոնտեքստ, փոխազդեցություններ) ավելի հեշտ է փորձարկել առանձին։
Օրինակ (կոնցեպտուալ):
Նկատենք "փող փոխանցելու" սցենարը՝ երկու բանկային հաշիվների միջև։
- Data:
BankAccountդասը՝balanceևaccountNumberդաշտերով։ - Context:
MoneyTransferContext, որը կապում է երկուBankAccountօբյեկտներ՝ դերերով "Source" (ուղարկող) և "Destination" (ստացող)։ - Interaction: Փող փոխանցելու տրամաբանությունը՝ դուրսբերում ուղարկողի բալանսից և ավելացում ստացողի բալանսին։ Այս տրամաբանությունը իրականացնում է
MoneyTransferContext-ի մեջ դերերի մեթոդների միջոցով։
// Կոնցեպտուալ կոդի օրինակ (չի ներկայացնում DCI-ի ամբողջական իրականացումը)
class BankAccount {
constructor(public balance: number, public accountNumber: string) {}
// Տվյալների հետ կապված մեթոդներ
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("Անբավարար միջոցներ");
}
}
}
// Կոնտեքստ և փոխազդեցություն (այստեղ շփոթված են պարզության համար)
class MoneyTransferContext {
constructor(private source: BankAccount, private destination: BankAccount) {}
transfer(amount: number): void {
try {
// Փոխազդեցություն դերերի միջոցով (անհայտ է այստեղ)
this.source.withdraw(amount);
this.destination.deposit(amount);
console.log(`Հաջողությամբ փոխանցվեց ${amount}՝ ${this.source.accountNumber}-ից ${this.destination.accountNumber}-ին`);
} catch (error: any) {
console.error(`Փոխանցումը ձախողվեց: ${error.message}`);
}
}
}
// Օգտագործում
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");
const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Ձախողում՝ միջոցների պակասի պատճառով
Իրական DCI-ում, փոխազդեցությունը (transfer) կիրականացվեր առանձին "роль" մեթոդներում, որոնք "ներմուծվում" կամ "ավելացվում" էին BankAccount օբյեկտներին MoneyTransferContext կոնտեքստում, առանց BankAccount դասը փոխելու։ Դա հասանելի է տարբեր տեխնիկաներով՝ կախված ծրագրավորման լեզվից։