Hexagonal Mimari

Burhan Oğur
Finartz
Published in
4 min readFeb 5, 2021

Hexagonal Mimari, ortak katmanlı mimari tasarımlarında gördüğümüz bir sistemin çekirdeğini oluşturan temel iş mantıklarının bulunduğu modüler parçaların diğer katmanlarla iç içe olacak şekilde tasarlandığı bu yüzden sisteminizi dışarıya açan katmanların ve temel iş mantıklarını yöneten servis katmanlarının birbirine bağımlı şekilde davranmasına yol açan mimarilerin aksine, katmanlar arasındaki bağımlılığı “domain” dediğimiz tamamen iş mantıklarının olduğu en içte bulunan katmana doğru bağımlı olacak şekilde tasarladığımız Domain-Driver Design mimarisinin özelleşmiş bir versiyonudur.

Hexagonal Mimaride Kullanılan Temel Prensipler

S.O.L.I.D prensipleri, Robert Cecil Martin(Uncle Bob) tarafından ortaya atılan, geliştirilen yazılımın esnek, yeniden kullanılabilir, sürdürülebilir ve anlaşılır olmasını sağlayan aynı zamanda kod tekrarını önleyen prensipler bütünüdür.

Hexagonal mimaride SOLİD prensiplerden olan “Dependency Inversion Principle” ve “Single Responsibility Principle” esas alınarak tasarım yapılır.

Bu iki prensibi Hexagonal mimaride incelemeye çalışalım.

1. Dependency Inversion Prensibi

Bu prensipte ki temel amacı ortak katmanlı mimari üzerinden kısaca özetleyecek olursak bir kod bloğunun, sınıfının, metodunun ya da özelliğin onu kullanan diğer alt kod bloklarına karşı bağımlılığını minimize etmektir. Bir başka deyişle sisteminizdeki alt katmanlarınıza olan bağımlılığı azaltıp bağımlılığı üst katmanlara doğru yönlendirmektir.

Peki hexagonal mimaride “Dependency Inversion” prensibini nasıl uygulamaktayız?

Hexagonal mimaride ortak katmanlı mimarinin en üst katmanı olan domain aslında en içerdeki katmandır. Durum böyle olunca sistemin bağımlılıkları dışardan içe doğru olacak şekilde tasarlanır. Aşağıdaki şekil üzerinden bunu açıklamaya çalışalım:

Şekil 1: Database Driven Design & Domain Driven Design

Sol tarafta ortak katmanlı mimari dediğimiz, üst katman olan domainin yani temel iş mantıklarının gerçekleştiği katmanının persistence dediğimiz veritabanı işlemlerinin bulunduğu katmana bağımlı kaldığını görüyoruz.

Sağ taraftaki tasarımda ise ortak katmanlı mimaride iş mantıklarını manipüle eden servis use-case’ lere ayrıştırılmış durumda. İş mantıklarının persistence katmanı ile olan bağımlılığının ortadan kalktığını, bağımlılığın dıştan içe doğru başka bir deyişle domain katmanına doğru uygulandığını ve domain katmanın aslında izole bir şekilde durduğunu görebiliyoruz.

2. Single Responsibility Prensibi

Bu prensipte bir kod bloğunun, sınıfının, metodunun ya da özelliğin değişimi tek bir sebepten dolayı yapılabilir. Bu durumu gene yukarıda Şekil 1' de çizdiğimiz yapı üzerinden açıklamaya çalışalım. Sol taraftaki tasarımda persistence ya da domain katmandaki bir değişiklik beraberinde birden fazla katmanda değişikliğe sebep olurken, sağ taraftaki tasarımda domain ya da persistence katmanındaki değişiklik sadece kendi tarafında değişikliğe sebebiyet vermektedir.

Şekil 2: Hexagonal Mimari

Şimdi de Şekil 2 ‘ de resmettiğimiz Hexagonal Mimari’nin temel bileşenlerini açıklamaya çalışalım:

1. Domain

Domain için sadece iş kurallarından oluşan, bu kuralların entity’ler vasıtasıyla tanımlandığı ve işlendiği, uygulamanın hiçbir katmanı ile bağımlılığı olmayan aslında uygulamanın temel işlevinin ne olduğunu anlamamızı kolaylaştıran saf kod blokları diyebiliriz. ”Single Responsibility” prensibinde yukarıda anlattığımız gibi dış katmanlardaki herhangi bir değişiklik domain’i etkilemez.

Domain veritabanı, web, UI, job vb dış dünyaya açık olan akışlardan izole edilmelidir.

2. Use-Case

İş kurallarını etkileyen, uygulamayı çağıran birincil portların kullandığı senaryoları içeren ve ortak katmanlı mimaride gördüğümüz servis kısmında bulunan senaryoların tek tek ayrıştırılmış hali diyebiliriz.

Hexagonal mimaride bir use-case aşağıdaki 4 temel görevi yerine getirir:

  1. Input adaptörler aracılığıyla dış sistemden veriler alır.
  2. Domainde tanımladığımız iş kurallarının validasyonunu sağlar ve bunu domaindeki entityler ile paylaşır.
  3. Input değerlerine göre domaini manipüle eder.
  4. Domain objesinin durumu güncellendikten sonra çıkış verisini oluşturur.

Bir use-case, domainde olduğu gibi uygulamanın core katmanında bulunur ve dışardaki katmanlarla bağımlılığı bulunmaz.

3. Input & Output Ports

Domain ve use-case ’ler hexagonal mimaride uygulamanın core tarafını oluşturur. Uygulamanın dışarı ile iletişimi input ve output portları üzerinden gerçekleşir.

Bir input port, uygulamadaki use-case tarafından implement edilen basit bir arayüzü ifade eder. Dış katmanda bulunan bir input adaptör tarafından çağrılarak uygulamanın dışarı ile iletişimene olanak sağlar.

Bir output portu, uygulamanın dışarıdan bir şeye ihtiyaç duyması halinde use-case tarafından çağrılabilen basit bir arayüzdür. Örneğin, veritabanı erişimini yapan ve use-case ’in ihtiyacı olan veriyi elde etmemizi sağlayan basit bir arayüzü düşünebiliriz. Output port dış katmanda bulunan bir output adaptör tarafından implement edilir. Böylece use-case ’in dış ortama bağlılığı ortadan kalkmış olur.

Ayrıca input ve output portları sayesinde bir sisteme verinin nerden geldiğini ve sistem tarafından oluşturulan verilerin nasıl dışarıya aktarıldığını rahatlıkla tespit edebiliriz.

4. Input & Output Adapters

Hexagonal mimaride adaptörler en dıştaki katmanları oluşturur. Uygulamanın çekirdeğinin bir parçası değillerdir fakat input ve output portları üzerinden dolaylı olarak uygulama ile iletişime geçerler.

Input adaptörlere bir web arayüzü ya da bir job örnek verilebilir. Bu adaptörler input portlarını çağırarak uygulamanız üzerinde bir istek oluştururlar.

Output adaptörler ise output portlarını implement eder ve bir use-case üzerinden çağrılırlar. Bir veritabanına bağlanıp veriyi kaydetme ya da veriyi okuma işlemi örnek gösterilebilir.

Hexagonal mimari, bir uygulamanın kolay geliştirilebilmesine ve kolay deploy edilebilmesine, bakım maliyeti az olan sistemlerin tasarlanmasına, eğer ekip olarak bir ürün üzerinde çalışıyorsanız aynı perspektif ile ürüne yaklaşmanıza olanak sağlayan bir mimari modeldir.

Bu mimari daha çok gerçek hayatta karşılığı olan kompleks iş gereksinimlerinin ve iş kurallarının olduğu domain ‘ler için tercih edilmektedir. Bir sonraki yazıda hexagonal mimarinin 3D Secure uzman sistemlerinde ve onları besleyen yönetim uygulamalarında pratik anlamda nasıl kullanıldığına değinmeye çalışacağım.

--

--