Hexagonal Architecture
Altıgen Mimari
- Okunuşu
- heksegınıl arkitekçır
Kısaca
Hexagonal architecture, çekirdek iş mantığının dış dünyayla yalnızca portlar ve değiştirilebilir adaptörlerle konuştuğu bir yazılım yapılandırma yöntemidir.
Hexagonal architecture nedir?
Ports and adapters olarak da bilinen hexagonal architecture, Alistair Cockburn tarafından 2005'te tanımlanmıştır. Uygulamanın çekirdeğini, yani iş kurallarını merkeze koyar ve veritabanları, web framework'leri, mesaj kuyrukları ve üçüncü taraf API'ler gibi diğer her şeyi dış ayrıntı olarak ele alır. Çekirdek bu ayrıntılara asla doğrudan bağımlı değildir; onlar çekirdeğe takılır.
Çekirdek, neye ihtiyaç duyduğunu ya da neyi sunduğunu tanımlayan arayüzler olan portları belirler; örneğin save metodu olan bir OrderRepository ya da charge metodu olan bir PaymentGateway. Adaptörler ise bir portu belirli bir teknolojiye bağlayan somut uygulamalardır: bir SQL veritabanı adaptörü, testler için bellek içi bir adaptör, bir REST controller ya da komut satırı arayüzü. HTTP controller gibi sürücü (driving) adaptörler çekirdeği çağırır; veritabanı repository'si gibi sürülen (driven) adaptörleri ise çekirdek çağırır.
USB-C ve HDMI gibi standart portları olan bir dizüstü bilgisayar düşünün. Cihaz porta uyduğu sürece bilgisayar hangi monitörü ya da klavyeyi taktığınızı umursamaz. Aynı şekilde, birim testlerde gerçek bir veritabanını bellek içi sahte bir sürümle veya bir e-posta sağlayıcısını başka biriyle iş mantığına dokunmadan değiştirebilirsiniz.
Hexagonal architecture sıklıkla katmanlı mimari ve clean architecture ile karıştırılır. Klasik katmanlı tasarım sunum, iş ve veri katmanlarını üst üste yığar ve iş katmanı çoğunlukla doğrudan veri katmanına bağımlıdır; hexagonal architecture ise bu bağımlılığı arayüzlerle tersine çevirir, böylece tüm bağımlılıklar içeriye, çekirdeğe doğru işaret eder. Clean architecture ve onion architecture aynı fikri daha fazla adlandırılmış halkayla geliştirir; dolayısıyla rakip değil, yakın akrabadırlar. Altıgen şeklin kendisinin özel bir anlamı yoktur; yalnızca birkaç port çizmek için yer bırakır.
Önemli noktalar
- İş mantığı merkezde durur ve framework'ler ile veritabanları hakkında hiçbir şey bilmez.
- Portlar çekirdeğin tanımladığı arayüzlerdir; adaptörler bunları belirli teknolojiler için uygular.
- Tüm bağımlılıklar içeriye, çekirdeğe doğru işaret eder.
- Adaptörleri değiştirmek, sahtelerle test etmeyi ve teknolojileri değiştirmeyi kolaylaştırır.
- Clean architecture ile yakından ilişkilidir ve dependency inversion'a dayanır.
Örnek
type Order = { id: string; total: number };
// Port: defined by the core, knows nothing about databases
interface OrderRepository { save(order: Order): Promise<void>; }
// Core logic depends only on the port
async function placeOrder(repo: OrderRepository, order: Order) {
if (order.total <= 0) throw new Error("Order total must be positive");
await repo.save(order);
}
// Adapter: one concrete implementation, easy to swap for a SQL version
class InMemoryOrderRepository implements OrderRepository {
orders: Order[] = [];
async save(order: Order) { this.orders.push(order); }
}Sık sorulan sorular
Neden hexagonal architecture deniyor?
Ad, Alistair Cockburn'ün kullandığı diyagramdan gelir: uygulama bir altıgen olarak, portlar ise kenarlarında çizilmiştir. Altı sayısının bir anlamı yoktur; şekil yalnızca birkaç port ve adaptör için yer bırakır.
Hexagonal architecture ile clean architecture arasındaki fark nedir?
İkisi de iş mantığını framework'lerden bağımsız tutar ve bağımlılıkları içeriye doğru işaret ettirir. Hexagonal architecture çekirdeğe ve portlar ile adaptörlere odaklanırken, clean architecture çekirdeğin içine entity ve use case gibi daha fazla adlandırılmış katman ekler.
Hexagonal architecture ne zaman değerlidir?
Belirli framework'lerden, veritabanlarından ya da entegrasyonlardan daha uzun ömürlü olması gereken anlamlı iş mantığına sahip ve güçlü otomatik testlere ihtiyaç duyan uygulamalarda karşılığını verir. Küçük bir betik ya da basit bir CRUD uygulaması için ek arayüzler değerinden fazla tören ekleyebilir.
İlgili sayfalar
- Clean ArchitectureYazılım Mimarisi, s. 5Clean architecture, temel iş kuralları framework'e, veritabanına ya da kullanıcı arayüzüne asla bağımlı olmasın diye yazılımı katmanlara ayırma yöntemidir.
- Dependency InjectionYazılım Mimarisi, s. 10Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.
- İlgilerin AyrılmasıYazılım Mimarisi, s. 19İlgilerin ayrılması, bir programı her biri davranışının açıkça tanımlanmış tek bir yönünden sorumlu ayrı parçalara bölen bir tasarım ilkesidir.
- Domain-Driven DesignYazılım Mimarisi, s. 12Domain-driven design, kodu iş alanına yakından modelleyen ve alan uzmanlarıyla aynı dili kullanan bir yazılım geliştirme yaklaşımıdır.
- Gevşek BağlılıkYazılım Mimarisi, s. 16Gevşek bağlılık, bileşenlerin birbirine olabildiğince az bağımlı olduğu, böylece birinin diğerlerini bozmadan değişebildiği bir tasarım ilkesidir.
- InterfaceProgramlamanın Temelleri, s. 26Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin