Sobes.tech
Senior

DCI nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

DCI (Data-Context-Interaction), belirli bir bağlamda nesnelerin nasıl etkileşime girdiğine odaklanan bir mimari desenidir ve belirli bir eylemi gerçekleştirmek için tasarlanmıştır. Kodun okunabilirliğini ve sürdürülebilirliğini artırmayı amaçlar, verileri (Data) bağlamdaki davranıştan (Interaction) ayırarak, bu bağlamda belirli bir durumda (Context) üzerinde işlem gören yapar.

  • Data (Veri): Nesnelerin durumunu temsil eder. Bu, genellikle veri içeren sınıflar veya yapılar olabilir.
  • Context (Bağlam): Nesnelerin etkileşime girdiği belirli bir durumu veya senaryoyu tanımlar. Bağlam, katılımcıları (veri nesneleri) rollerle bağlar.
  • Interaction (Etkileşim): Bağlamdaki katılımcılara uygulanan davranış veya mantığı tanımlar. Etkileşim, katılımcıların bu bağlamda oynadıkları roller aracılığıyla gerçekleştirilir.

DCI'nin avantajları:

  • Daha iyi okunabilirlik: Etkileşimi tanımlayan kod, veri tanımından ayrılmıştır, bu da onu daha anlaşılır kılar.
  • Kod tekrarını azaltma: Belirli bir senaryoya özgü davranış kapsüllenmiş olup, mantığın tekrar edilme ihtiyacını azaltır.
  • Daha fazla esneklik: Yeni etkileşim senaryolarını değiştirmek veya eklemek, veri tanımını değiştirmeden daha kolaydır.
  • Test edilebilirlik: Ayrılmış bileşenler (veriler, bağlam, etkileşimler) izole edilerek test edilmesi daha kolaydır.

Örnek (kavramsal):

İki banka hesabı arasında "para transferi" senaryosunu düşünelim.

  • Data: BankAccount sınıfı, balance ve accountNumber alanlarıyla.
  • Context: MoneyTransferContext, iki BankAccount nesnesini "Source" (gönderen) ve "Destination" (alıcı) rolleriyle bağlar.
  • Etkileşim: Para transferi mantığı: gönderenin bakiyesinden düşme ve alıcının bakiyesine ekleme. Bu mantık, MoneyTransferContext içindeki "Source" ve "Destination" rollerine ait metodlar aracılığıyla uygulanır.
// Kavramsal kod örneği (tam DCI uygulaması değildir)
class BankAccount {
  constructor(public balance: number, public accountNumber: string) {}

  // Veriyle ilgili 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 bakiye");
    }
  }
}

// Bağlam ve etkileşim (burada basitleştirilmiş)
class MoneyTransferContext {
  constructor(private source: BankAccount, private destination: BankAccount) {}

  transfer(amount: number): void {
    try {
      // Rollere göre etkileşim (burada dolaylı)
      this.source.withdraw(amount);
      this.destination.deposit(amount);
      console.log(`${amount} tutarında para başarıyla transfer edildi`);
    } catch (error: any) {
      console.error(`Para transferi başarısız: ${error.message}`);
    }
  }
}

// Kullanım
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 bakiye hatası

Gerçek bir DCI'de, transfer mantığı gibi etkileşimler, BankAccount nesnelerine "rol" metodları olarak enjekte edilir veya eklenir, BankAccount sınıfını değiştirmeden. Bu, programlama diline bağlı çeşitli tekniklerle başarılır.