Sobes.tech
Senior

Hekzagonal mimari ve kökeni hakkında bilgi veriniz.

sobes.tech yapay zeka

AI'dan gelen yanıt

Altıgen mimari (Ports and Adapters), Alistair Cockburn tarafından önerilen bir mimari şablondur. Uygulamanın iş mantığının çekirdeğini dış bağımlılıklardan (UI, veritabanları, üçüncü taraf servisler) izole etmek amacıyla tasarlanmıştır.

Köken:

Alistair Cockburn, bu kavramı 2005 yılında tanıttı. Temel fikir, geleneksel çok katmanlı mimarilere bir tepki olarak ortaya çıktı; bu mimarilerde iş mantığı sıklıkla altyapı katmanıyla güçlü bir şekilde bağlıydı. Cockburn, iş mantığını geliştirmeye ve test etmeye olanak tanıyan, dış dünya ile nasıl etkileşime geçildiğinden bağımsız olarak çalışabilen bir mimari oluşturmayı amaçladı. "Altıgen" ismi, uygulamanın "port"lar aracılığıyla çeşitli "dış" adaptörlerle etkileşime geçebilme yeteneğini simgeler. Bu şekil, farklı sistemlerle etkileşim kurmak için yeterli "yüz" (port) içeren soyut bir şekil olarak seçildi.

Temel ilkeler:

  • Çekirdek (Core / Domain): Temiz iş mantığını ve alan nesnelerini içerir. Dış teknolojilere bağlı değildir.
  • Portlar (Ports): Çekirdek ile dış dünya arasındaki etkileşimi tanımlayan arayüzlerdir. İki tür port vardır:
    • Giriş Portları (Driving Ports): Dış ajanların (örneğin, kullanıcı arayüzü veya API) çekirdek fonksiyonlarını nasıl çağırabileceğini tanımlar.
    • Çıkış Portları (Driven Ports): Çekirdeğin dış servislerle (örneğin, veritabanı veya üçüncü taraf API) nasıl etkileşime geçebileceğini tanımlar. Çekirdek bu arayüzleri tanımlar, ancak uygulamaz.
  • Adaptörler (Adapters): Portları uygular ve çekirdek ile dış unsurlar arasında köprü görevi görür. Ayrıca iki tür adaptör vardır:
    • Giriş Adaptörleri (Driving Adapters): Dış ajanların isteklerini, çekirdeğin anlayacağı formata dönüştürür (örneğin, UI adaptörü).
    • Çıkış Adaptörleri (Driven Adapters): Çekirdek çağrılarını, dış servislerin anlayacağı formata dönüştürür (örneğin, veritabanı adaptörü).

Avantajlar:

  • İzolasyon: İş mantığının çekirdeği, dış teknolojilere bağlı değildir.
  • Test Edilebilirlik: Çekirdek, bağımsız olarak test edilebilir, tüm yığını çalıştırmaya gerek olmadan.
  • Esneklik: Bir adaptörü diğerine kolayca değiştirebilirsiniz (örneğin, bir veritabanından diğerine geçmek gibi).
  • Bakım Kolaylığı: Uygulamanın farklı bölümleri (çekirdek ve adaptörler) bağımsız olarak geliştirilebilir ve evrimleşebilir.

Ön uçta uygulama:

Altıgen mimari, genellikle backend ile ilişkilendirilse de, ilkeleri frontendde de kullanılabilir ve müşteri uygulamasını yapılandırmak için kullanılabilir:

  • Çekirdek: İş mantığını ve uygulama durumunu içeren modüller (örneğin, Redux reducer'ları, Zustand store, DOM ile bağlantısı olmayan saf mantık bileşenleri).
  • Portlar: UI'nın iş mantığıyla nasıl etkileşime geçtiğini (giriş) ve mantığın dış API'ler veya yerel depolama ile nasıl etkileşime geçtiğini (çıkış) tanımlar.
  • Adaptörler: Kullanıcı girişini işleyen ve portları çağıran UI bileşenleri (giriş adaptörleri) ve HTTP istekleri yapan veya tarayıcı API'leriyle (örneğin, localStorage) çalışan servisler (çıkış adaptörleri).

Soyut yapı örneği:

📦 app
 ┣ 📂 core
 ┃ ┣ 📂 domain
 ┃ ┃ ┗ 📜 todos.ts  // Todo varlığının tanımı
 ┃ ┣ 📂 application
 ┃ ┃ ┗ 📜 todoService.ts // Todo ile ilgili iş mantığı
 ┃ ┗ 📂 ports
 ┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Giriş portu (UI için arayüz)
 ┃ ┃ ┗ 📜 out/ITodoRepository.ts // Çıkış portu (veri erişimi için arayüz)
 ┣ 📂 infra
 ┃ ┣ 📂 adapters
 ┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Giriş adaptörü (React bileşeni)
 ┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Çıkış adaptörü (API erişimi uygulaması)