Domain-Driven Design (Alan Odaklı Tasarım) Nedir?
Domain-Driven Design (DDD) nedir, ortak dil ve bounded context ne anlama gelir? Entity, aggregate gibi temel kavramlar, örnek ve ne zaman kullanılır.
Domain-Driven Design nedir?
Domain-Driven Design (DDD), Türkçesiyle alan odaklı tasarım, karmaşık yazılımın merkezine iş alanını (domain) ve alan uzmanlarının bilgisini koyan bir tasarım yaklaşımıdır. Yaklaşımı Eric Evans'ın aynı adlı kitabı yaygınlaştırmıştır. Temel fikir şudur: yazılım teknik bir yapı olmadan önce, işin kendisinin bir modelidir. İş kuralları ve kavramlar doğru anlaşılıp kodda aynen yansıtılırsa yazılım hem doğru çalışır hem de iş değiştikçe uyum sağlayabilir.
DDD bir kütüphane ya da araç değil, düşünme ve işbirliği biçimidir. Yazılımcılar ile iş birimleri aynı modeli birlikte kurar.
Ortak dil (ubiquitous language)
DDD'nin en pratik katkısı ortak dildir. İş birimi ile yazılım ekibi aynı terimleri aynı anlamda kullanır ve bu terimler kodda, belgede ve konuşmada aynen geçer. İş tarafı 'poliçe iptali' derken kodda 'record deactivate' gibi farklı bir kavram varsa, iletişim kopar ve hatalar doğar.
Ortak dil, alan uzmanlarıyla yapılan sürekli görüşmelerle, yani bilgi damıtmayla (knowledge crunching) oluşur. Dil değiştikçe model, model değiştikçe kod güncellenir.
Bounded context (sınırlı bağlam)
Büyük sistemlerde tek bir kavramın her yerde aynı anlama gelmesi mümkün değildir. Bir e-ticaret şirketinde 'müşteri' satış biriminde ödeme geçmişi olan kişiyi, kargo biriminde ise teslimat adresi olan alıcıyı ifade edebilir. DDD bu çelişkiyi tek bir devasa model kurarak değil, her birinin kendi içinde tutarlı olduğu sınırlı bağlamlara bölerek çözer.
Her bağlamın kendi modeli ve dili vardır. Bağlamlar arası ilişkiler bir bağlam haritasıyla (context map) belgelenir; hangi bağlamın hangisine nasıl veri verdiği ve çeviri gerekip gerekmediği orada görünür. Bu bölünme mikroservis sınırlarını belirlemede de başlangıç noktası olarak kullanılır.
Temel yapı taşları (taktik tasarım)
Bağlamın içinde modeli kurmak için birkaç desen kullanılır:
- Varlık (entity): Kimliğiyle ayırt edilen ve zamanla değişen nesne; örneğin sipariş.
- Değer nesnesi (value object): Kimliği olmayan, yalnızca değeriyle tanımlanan nesne; örneğin adres ya da para tutarı.
- Küme (aggregate): Birlikte tutarlı kalması gereken nesnelerin kümesi; dışarıyla tek bir kök varlık üzerinden konuşur. Örneğin sipariş ile sipariş kalemleri.
- Alan olayı (domain event): İş alanında anlamlı bir gelişmenin kaydı; örneğin sipariş onaylandı.
- Alan servisi: Tek bir varlığa ait olmayan iş kuralını taşıyan işlem.
Örnek: sipariş ve kargo
Örneğin bir e-ticaret sisteminde Sipariş bağlamı sepet, fiyat ve ödeme kurallarını yönetir. Burada sipariş bir küme, sipariş kalemleri ise bu kümenin parçalarıdır; kümeye dışarıdan yalnızca sipariş üzerinden dokunulur. Sipariş onaylandığında 'sipariş onaylandı' alan olayı yayınlanır. Kargo bağlamı bu olayı alır ve kendi modelinde bir gönderi oluşturur. Kargo biriminin dili farklıdır; orada alıcı, paket ve rota vardır.
İki bağlam ayrı modellere sahiptir ve aralarında kontrollü bir çeviri vardır. Böylece birinin kuralı değişince diğeri bozulmaz.
DDD ne zaman kullanılır, ne zaman gerekmez?
DDD, iş kuralları karmaşık, alan bilgisi derin ve zamanla değişecek sistemlerde değer üretir: finans, sigorta, lojistik ve büyük kurumsal uygulamalar gibi. Basit veri giriş ve listeleme ekranlarından oluşan uygulamalarda ise ek yük getirir; orada daha sade yaklaşımlar yeterlidir.
Yaygın hatalar şunlardır: yalnızca desen adlarını (entity, aggregate) kullanıp alan uzmanıyla konuşmamak, bağlam sınırlarını teknik katmanlara göre çizmek, her şeye aynı derinlikte DDD uygulamak. Olay güdümlü mimari ile DDD sıkça birlikte kullanılır; alan olayları, bağlamlar arası haberleşmenin doğal yoludur.
Mindset programlarında nerede çalışılır?
Domain-Driven Design (DDD) Temelleri eğitimi Ubiquitous Language ve Knowledge Crunching, Bounded Context ve Stratejik Tasarım, Taktik Desenler: Entity, Value Object, Aggregate ve Domain Events ve Eventual Consistency modüllerini içerir. Domain-Driven Design İleri Seviye: Bounded Context ve Event Storming eğitimi ise Event Storming Atölyesi Yürütme, Bağlam Haritası ve Entegrasyon Kalıpları ve Modelin Kod ile Hizalanması ve Evrimi modüllerine odaklanır.
İlgili Mindset programı
Domain-Driven Design (DDD) Temelleri
Sık sorulan sorular
DDD ile mikroservis mimarisi aynı şey mi?
Hayır. DDD işin nasıl modelleneceğini, mikroservis ise yazılımın nasıl bağımsız servislere bölüneceğini anlatır. Birbirleriyle iyi çalışırlar: bounded context sınırları, servis sınırlarını belirlemede yol gösterici olur. Ancak DDD'yi tek parça (monolitik) bir uygulamada da uygulayabilirsiniz. Bir sistemde ikisini birlikte kullanmak yaygındır, ama biri olmadan diğeri de çalışır.
Event Storming nedir?
Event Storming, alan uzmanları ve yazılımcıların bir araya gelip iş akışını alan olayları üzerinden duvarda ya da tahtada birlikte haritaladığı bir atölye tekniğidir. Olaylar, komutlar ve kümeler yapışkan notlarla çıkarılır. Amaç, ortak anlayış kurmak ve bounded context sınırlarını ortaya çıkarmaktır.
Entity ile value object farkı nedir?
Varlık (entity) kimliğiyle tanımlanır; özellikleri değişse bile aynı varlıktır, örneğin bir sipariş. Değer nesnesi ise yalnızca değerleriyle tanımlanır ve aynı değerlere sahip iki nesne birbirinin yerine kullanılabilir, örneğin para tutarı ya da adres. Değer nesneleri tipik olarak değiştirilmez. Bu ayrım modeli sade tutar ve hataya açık kimlik yönetimini yalnızca gerçekten gerekli nesnelerde yapmayı sağlar.
DDD öğrenmek için önce ne bilmek gerekir?
Nesne yönelimli programlama ve temel yazılım tasarımı bilgisi yardımcı olur. Ama DDD'nin ilk basamakları teknik olmaktan çok iletişimle ilgilidir: alan uzmanıyla konuşmak, ortak dil kurmak. Stratejik tasarımı kavramak için kod yazmak şart değil, taktik desenler için ise bir programlama dili bilgisi gerekir.
Küçük projelerde DDD kullanılmalı mı?
Alan karmaşık değilse tam DDD uygulaması gereksiz yük olabilir. Yine de ortak dil kurmak ve kavramları net adlandırmak gibi hafif pratikler her projede fayda sağlar. Karmaşıklığa göre derinlik ayarlanır: temel kavramlarla başlayıp ihtiyaç doğdukça taktik desenler eklenebilir. Bu yaklaşım gereksiz karmaşıklığı önler ve kavramsal netliği korur.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme