Sobes.tech
Senior

Ի՞նչ է 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 դասը փոխելու։ Դա հասանելի է տարբեր տեխնիկաներով՝ կախված ծրագրավորման լեզվից։