Sobes.tech
Senior

DCI nədir?

sobes.tech Süni İntellekt

AI-dan cavab

DCI (Data-Context-Interaction) — bu, obyektlərin müəyyən bir kontekstdə qarşılıqlı əlaqədə olduğu və müəyyən bir əməliyyatı yerinə yetirmək üçün istifadə olunduğu memarlıq nümunəsidir. Bu, məlumatları (Data) və davranışları (Interaction) ayıraraq kodun oxunaqlığını və dəstəklənməsini yaxşılaşdırmağa yönəlib, məlumatları (Data) və onları əhatə edən kontekstdə (Context) davranışları ayırır.

  • Data (Məlumatlar): Obyektlərin vəziyyətini təmsil edir. Bu, məlumatları saxlayan adi siniflər və ya strukturlar ola bilər.
  • Context (Kontekst): Obyektlərin qarşılıqlı əlaqədə olduğu konkret vəziyyəti və ya ssenarini təsvir edir. Kontekst iştirakçıları (məlumat obyektləri) rollarla əlaqələndirir.
  • Interaction (Əlaqə): Kontekstdə iştirak edənlərin davranışını və ya məntiqini müəyyən edir. Əlaqə, iştirakçıların bu kontekstdə oynadıqları rollar vasitəsilə həyata keçirilir.

DCI-nin üstünlükləri:

  • Oxunaqlığın yaxşılaşdırılması: Əlaqəni təsvir edən kod, məlumatların təyinatından ayrılır, bu da onu daha anlaşılan edir.
  • Kod təkrarlamasının azaldılması: Konkret ssenari üçün məxsus davranış inkapsulyasiya olunur, bu da məntiqin təkrarlanmasının qarşısını alır.
  • Daha çox elastiklik: Yeni ssenarilərin dəyişdirilməsi və ya əlavə edilməsi daha asan olur, məlumatların təyinatını dəyişmədən.
  • Test ediləbilənlik: Ayrı-ayrı komponentlər (məlumatlar, kontekst, əlaqələr) izolyasiya olunaraq daha asan test edilə bilər.

(Əsasən) nümunə (konseptual):

İki bank hesabı arasında "pul köçürmə" ssenarisini düşünək.

  • Data: BankAccount sinfi, balanceaccountNumber sahələri ilə.
  • Context: MoneyTransferContext, iki BankAccount obyektini "Source" (göndərən) və "Destination" (alan) rolları ilə əlaqələndirir.
  • Interaction: Pul köçürmə məntiqi: göndərənin balansından çıxma və alanın balansına əlavə etmə. Bu məntiq, MoneyTransferContext daxilində "Source" və "Destination" rollarının metodları vasitəsilə həyata keçirilir.
// Konseptual kod nümunəsi (DCI-nin tam implementasiyası deyil)
class BankAccount {
  constructor(public balance: number, public accountNumber: string) {}

  // Məlumatlara xas 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("Yetersiz vəsait");
    }
  }
}

// Kontekst və əlaqə (sadələşdirilmiş şəkildə qarışıqdır)
class MoneyTransferContext {
  constructor(private source: BankAccount, private destination: BankAccount) {}

  transfer(amount: number): void {
    try {
      // Rollar vasitəsilə qarşılıqlı əlaqə (burada qeyri-şəffaf)
      this.source.withdraw(amount);
      this.destination.deposit(amount);
      console.log(`Uğurla ${amount} məbləğində köçürmə edildi ${this.source.accountNumber} -dən ${this.destination.accountNumber} -ə`);
    } catch (error: any) {
      console.error(`Köçürmə uğursuz oldu: ${error.message}`);
    }
  }
}

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

const transferContext = new MoneyTransferContext(account1, account2);
transferContext.transfer(200);
transferContext.transfer(1500); // Yetersiz vəsait səbəbindən xəta

Əsl DCI-də, əlaqə (məsələn, transfer məntiqi) ayrı "rol" metodlarında həyata keçirilərdi və bu metodlar BankAccount obyektlərinə MoneyTransferContext daxilində "injekt edilər" və ya "əlavə edilərdi", bu da BankAccount sinfini dəyişmir. Bu, proqramlaşdırma dilindən asılı olaraq müxtəlif üsullarla həyata keçirilir.