Sobes.tech
Senior

Ports ve adaptörler mimarisi hakkında ne biliyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Hexagonal Mimari olarak da bilinen portlar ve adaptörler mimarisi, uygulamanın iş mantığını (Core) dış bağımlılıklardan (kullanıcı arayüzleri, veritabanları, dış servisler) ayırır.

Ana kavramlar:

  • Portlar: Core'un dış dünya ile etkileşime geçtiği arayüzleri tanımlar. Portlar iki türe ayrılır:
    • Gelen (Driving Ports): Core'un işlevselliğini dış varlıkların çağırması için kullanılır (örneğin, API arayüzü).
    • Giden (Driven Ports): Core'un dış varlıkların işlevselliğini çağırması için kullanılır (örneğin, veri erişimi için depo arayüzü).
  • Adaptörler: Portları uygular ve Core'u belirli dış teknolojilere veya framework'lere bağlar.
    • Gelen (Driving Adapters): Gelen portları uygular ve dış ortamdan gelen istekleri Core çağrılarına dönüştürür (örneğin, REST denetleyici).
    • Giden (Driven Adapters): Giden portları uygular ve Core'dan gelen çağrıları dış ortamla etkileşim kuracak şekilde dönüştürür (örneğin, belirli bir veritabanı ile çalışma için depo uygulaması).
  • Core (İş alanı): Uygulamanın iş mantığını içerir. Tamamen dış detaylardan izoledir ve onlarla sadece portlar aracılığıyla etkileşir.

Avantajlar:

  • Test edilebilirlik: Core'un izolasyonu, karmaşık dış bağımlılıkların taklit edilmesine gerek kalmadan iş mantığının birim testlerini kolaylaştırır.
  • Esneklik: Core'u değiştirmeden veya yeni teknolojiler eklemeden (veritabanları, framework'ler) kolayca değiştirmeye veya eklemeye olanak tanır. Var olan bir porta yeni bir adaptör yazmak yeterlidir.
  • Temiz kod: Daha temiz ve sürdürülebilir kod oluşturmayı teşvik eder, sadece iş kurallarına odaklanır.
  • Sorumlulukların ayrılması: Sorumluluk alanlarını net bir şekilde ayırır.

Frontend ile ilişkisi:

Frontend'te, portlar ve adaptörler mimarisi şu amaçlarla uygulanır:

  • Bileşenin iş mantığını veri kaynaklarından ayırmak: Bileşen, farklı "adaptörler" (API'den veri alanlar, Yerel Depolama, test mock'ları vb.) tarafından uygulanabilen bir "port" ile etkileşir.
  • Dış olayların işlenmesi: Gelen portlar, UI olay işleyicilerini temsil edebilir ve adaptörler bu olayları iç mantık çağrılarına dönüştürür.
  • Dış kütüphanelerle etkileşimin kapsüllenmesi: Adaptörler, harici kütüphanelere yapılan çağrıları kapsüller (örneğin, harita ile çalışma kütüphanesi), Core'a basit ve kararlı bir arayüz sağlar.

JavaScript'te örnek (şema):

// Dışa aktarılan port örneği (veri alma arayüzü)
class DataGateway {
  getData() {
    throw new Error("getData yöntemi uygulanmalı");
  }
}

// API için dışa aktarılan adaptör örneği
class ApiDataGateway extends DataGateway {
  async getData() {
    const response = await fetch('/api/data');
    return response.json();
  }
}

// İş mantığı için giriş portu örneği
class BusinessLogicPort {
  constructor(dataGateway) {
    this.dataGateway = dataGateway;
  }

  async processData() {
    throw new Error("processData yöntemi uygulanmalı");
  }
}

// İş mantığı (Core) örneği
class MyBusinessLogic extends BusinessLogicPort {
  async processData() {
    const data = await this.dataGateway.getData();
    // Veri işleme mantığı
    console.log("İşlenmiş veriler:", data);
    return data;
  }
}

// UI'da kullanım için giriş adaptörü örneği
async function initApp() {
  const apiGateway = new ApiDataGateway(); // Somut adaptör
  const businessLogic = new MyBusinessLogic(apiGateway); // Core portu kullanır
  await businessLogic.processData(); // Giriş adaptörü Core'u çağırır
}

initApp();