Hexagonal Architecture ya da Ports and Adapters Architecture olarak da bilinen, portlar ve adaptörler aracılığıyla yazılım ortamlarına kolayca bağlanabilen loosely coupled uygulama componentleri (bileşenleri) oluşturmayı amaçlayan bir mimari modeldir. Bu, componentleri (bileşenleri) herhangi bir seviyede değiştirilebilir hale getirir ve test otomasyonunu kolaylaştırır.
Hexagonal’in konsepti, input ve outputları tasarımın çevresine yerleştirmektir. İş mantığı (business logic), REST veya GraphQL API sunmamızdan bağımsız olarak ve veri kaynaklarımızdan bağımsız olarak – ister bir veritabanı, ister gRPC veya REST aracılığıyla ortaya çıkan bir mikro hizmet API’si olsun – etkilenmeden kalmalıdır.
Nedir bu ports ve adapters?
Port
Port (bağlantı noktası), belirli bir protokol kullanarak bir uygulama ile harici bir sistem arasındaki iletişimi kolaylaştıran bir arabirimdir. Gelen (harici sistemden istek veya olay alan) veya giden (harici sisteme komut veya sorgu gönderen) olabilir.
Bir port (bağlantı noktası), her biri iletişim protokolünü farklı şekilde uygulayan birden fazla bağdaştırıcıyı destekleyebilir. Örneğin, gelen bir bağlantı noktası GUI, CLI veya bir web hizmeti için bağdaştırıcılara sahip olabilirken, giden bir bağlantı noktası çeşitli DBMS veya depolar için bağdaştırıcılara sahip olabilir.
Adapters
Adapter(adaptör), bir portu harici bir sisteme bağlayan, portun protokolünü kullanarak uygulama ile harici sistem arasında veri ve mesajları çeviren bir bileşendir. Ayrıca hata işleme (debugging), günlük kaydı (logging), güvenlik (security) ve önbelleğe alma (caching) gibi teknik hususları da yönetir.
Harici sistemin rolüne bağlı olarak, bir adaptör birincil (iletişimi başlatan bir aktöre bağlanma) veya ikincil (iletişime yanıt veren bir aktöre bağlanma) olabilir. Birincil aktörler kullanıcıları veya diğer uygulamaları içerirken, ikincil aktörler veritabanlarını veya servisleri içerir.
Hexagonal Design Pattern’i diğerlerinden ayıran nedir?
MVC ve Hexagonal tasarım deseni arasındaki temel farklar nelerdir?
Hexagonal mimarinin ayırt edici özellikleri arasında, test edilebilirlik, reusability, sustainability, scalability gibi özellikleri sıralayabiliriz. Ancak tasarımın netliği ve anlaşılır olması, tüm bunları iyi bir şekilde uygulamasıyla birlikte uygulamamıza sürdürülebilirlik sağlamasıyla diğer design patternlerden ayrılmaktadır.
Yaşanan Sık Sorunlar
Overengineering: Yapının karışık hale getirilmesi, basit uygulamalar için gereksiz yük oluşturabilir. Her bir işlev için ayrı portlar ve adaptörler oluşturmak, kaynak kodun gereksiz yere şişmesine ve yönetilmesinin zorlaşmasına neden olabilir.
Yanlış Uygulama: Mimarinin yanlış anlaşılması ve yanlış uygulanması sonucunda katmanların ve sorumlulukların karışmasına yol açabilir. Bu durum codebase’in kalitesinde önemli bir düşüşe hatta refactor edilmesine kadar ilerleyebilir.
Performans Sorunları: Yanlış uygulamanın sonucunda ortaya çıkan başka bir sorun da performans sorunlarıdır. Ekstra katman ve soyutlamalarla sistemin performansı olumsuz etkilenebilir. Özellikle verimsiz port ve adaptör kullanımında sıklıkla karşılaşılır.
Zaman maliyeti nedir?
Günümüzde yazılım geliştirmede müşteri istekleri ve beklentileri sebebiyle zaman maliyeti önem kazandı. Bu durumda Hexagonal Design Pattern’in bize getireceği zaman maliyeti ne olacak hesaplamak durumundayız.
Eğer ekibiniz hexagonal mimarisine aşina değilse, modelin prensipleri ve uygulama detaylarını öğrenmek için zaman harcamaları gerekecek. Uzun vadede sistem üzerinde daha hızlı ve güvenli bir şekilde çalışmalarını sağlasa da, başlangıç için zaman alıcı olacaktır.
Başta da belirttiğim gibi; hızlıca teslim etmemiz gereken bir proje içerisindeysek Hexagonal Design Pattern kullanmamız çok sağlıklı olmayacaktır. Bunun sebebiyse; acele işe şeytan karışır olarak özetlenebilir.
Yanlış uygulama ve overengineering problemlerinden bahsetmiştik. Hexagonal mimariyi projemiz içerisinde inşa ederken acele etmek; uygulamanın bileşenlerini birbirinden ayırma ve bu bileşenlerin sorumluluğunu belirleme sırasında hızlı davranmak, projenin büyümesiyle ortaya çıkacak problemlere bir zemin hazırlayacaktır.
NodeJS ile hazırlanmış bir örnek içeren başka bir yazı: Hexagonal architecture – overview and best practices
Not: Bunlar yapmış olduğum araştırmalarımdan anladığım ve anladıklarımı özetlediğim bir yazıdır. Bilimsel bir yanı bulunmayan bu önermelerde birçok hata bulunabilir. Lütfen hatalı gördüğünüz durumları bildirmekten çekinmeyin; araştırma notlarımızı doğru tutmak bizi aradığımız şeye daha hızlı ulaştıracaktır.