Alan Tabanlı Tasarım (DDD) yazılım sistemleri tasarımına yönelik bir yaklaşım olup, konu alanına ve onun mantığına odaklanır. DDD, karmaşık konu alanlarını ilişkili ama bağımsız sınırlı bağlamlara (bounded contexts) böler. Her bağlamda, alan uzmanları ile uyumlu kendi dili (Ubiquitous Language) geliştirilir. DDD'nin temel yapı taşları:
Sınırlı bağlamlar genellikle açık bir şekilde tanımlanmış API'ler veya olaylar aracılığıyla etkileşen ayrı mikro hizmetler olarak temsil edilir.
Java (Spring) örneği:
// Değer Nesnesi örneği @Embeddable public class Address { private String city; private String street; // ... yapıcılar, equals, hashCode } // Agregat Kökü içeren Varlık örneği @Entity public class Order { @Id private Long id; @Embedded private Address deliveryAddress; // ... iş yöntemleri }
Anahtar özellikler:
DDD'deki tüm nesneler Varlık mı olmalıdır?
Hayır, ayrıca Değer Nesneleri de vardır — benzersizlikleri yoktur, durumu kimliğini tamamen belirler.
Address a1 = new Address("Moskova", "Arbat"); Address a2 = new Address("Moskova", "Arbat"); System.out.println(a1.equals(a2)); // true
Mikro hizmetlere ayrılmak DDD uygulamak anlamına mı gelir?
Hayır, DDD'yi monolitik bir uygulama içerisinde de içsel bağlam sınırlarını oluşturarak uygulamak mümkündür.
Her agregat için mutlaka bir depo gerekli mi?
Genellikle evet, ancak bazı durumlarda agregatı başka bir agregatın parçası olarak tamamen saklayabilirsiniz, eğer o ayrı bir iş işlemi kökü değilse.