DCI nima?
sobes.tech AI
AIdan javob
DCI (Data-Context-Interaction) — bu arxitektura naqshidir, u qanday qilib obyektlar muayyan kontekstda o'zaro ta'sir qilishini va muayyan harakatni bajarishini ta'kidlaydi. U kodning o'qilishi va saqlanishini yaxshilash uchun mo'ljallangan bo'lib, ma'lumotlar (Data) bilan kontekstda (Interaction) bajariladigan harakatlarni ajratadi, ular muayyan vaziyatda (Context) ustidan ishlaydi.
- Data (Ma'lumotlar): Ob'ektlarning holatini ifodalaydi. Bu oddiy sinflar yoki ma'lumotlarni o'z ichiga olgan tuzilmalar bo'lishi mumkin.
- Context (Kontekst): Ob'ektlarning o'zaro ta'sir qilayotgan muayyan vaziyat yoki scenariyini tavsiflaydi. Kontekst ishtirokchilarni (ma'lumot ob'ektlari) rollar bilan bog'laydi.
- Interaction (O'zaro ta'sir): Kontekstdagi ishtirokchilarga qo'llaniladigan harakat yoki mantiqni belgilaydi. Bu o'zaro ta'sir ishtirokchilar o'ynaydigan rollar orqali amalga oshiriladi.
DCI ning afzalliklari:
- Yaxshiroq o'qilishi: O'zaro ta'sirni tavsiflovchi kod ma'lumotlar ta'rifi bilan ajratilgan, bu uni tushunarli qiladi.
- Kod takrorlanishini kamaytirish: Muayyan scenariy uchun xususiy harakatlar kapsüllangan, bu logikani takrorlash ehtiyojini kamaytiradi.
- Ko'proq moslashuvchanlik: Yangi o'zaro ta'sir scenariylarini o'zgartirish yoki qo'shish, ma'lumotlar ta'rifini o'zgartirmasdan osonroq.
- Test qilish imkoniyati: Ajratilgan komponentlar (ma'lumotlar, kontekst, o'zaro ta'sirlar) izolyatsiya qilinib, test qilish oson.
Misol (konseptual):
Ikki bank hisob o'rtasida "pul o'tkazish" scenariysi tasavvur qilaylik.
- Data:
BankAccountsinfi,balancevaaccountNumbermaydonlari bilan. - Kontekst:
MoneyTransferContext, u ikkiBankAccountob'ektini "Source" (jo'natuvchi) va "Destination" (qabul qiluvchi) rollari bilan bog'laydi. - O'zaro ta'sir: Pul o'tkazish mantiqi: jo'natuvchining balansidan chiqarish va qabul qiluvchining balansiga qo'shish. Bu mantiq
MoneyTransferContextichidagi "Source" va "Destination" rollaridagi metodlar orqali amalga oshiriladi.
// Konseptual kod misoli (to'liq DCI amalga oshirilmagan)
class BankAccount {
constructor(public balance: number, public accountNumber: string) {}
// Ma'lumotlarga xos metodlar
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("Yetarli mablag' yo'q");
}
}
}
// Kontekst va o'zaro ta'sir (bu yerda soddalashtirilgan)
class MoneyTransferContext {
constructor(private source: BankAccount, private destination: BankAccount) {}
transfer(amount: number): void {
try {
// Rollar orqali o'zaro ta'sir (bu yerda noaniq)
this.source.withdraw(amount);
this.destination.deposit(amount);
console.log(`Muvaffaqiyatli ${amount} miqdorda pul transfer qilindi`);
} catch (error: any) {
console.error(`Pul o'tkazishda xato: ${error.message}`);
}
}
}
// Foydalanish
const account1 = new BankAccount(1000, "123");
const account2 = new BankAccount(500, "456");
const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Yetarli mablag' yo'qligi xatosi
Haqiqiy DCI da, o'zaro ta'sir (masalan, transfer mantiqi) alohida "roll" metodlarida amalga oshiriladi, ular BankAccount ob'ektlariga MoneyTransferContext kontekstida "inject" yoki "qo'shiladi", BankAccount sinfini o'zgartirmasdan. Bu turli texnikalar yordamida, dasturlash tiliga qarab amalga oshiriladi.