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: Η λογική μεταφοράς χρημάτων: αφαίρεση από το υπόλοιπο του αποστολέα και προσθήκη στο υπόλοιπο του παραλήπτη. Αυτή η λογική υλοποιείται μέσω των μεθόδων ρόλων "Source" και "Destination" μέσα στο 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. Αυτό επιτυγχάνεται με διάφορες τεχνικές ανάλογα με τη γλώσσα προγραμματισμού.