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 класын өзгөртпөйт. Бул программалоо тилине жараша ар кандай ыкмалар менен ишке ашырылат.