Domain-Driven Design
Alan Odaklı Tasarım
- Türkçe karşılığı
- etki alanı odaklı tasarım
- Okunuşu
- domeyn drivın dizayn
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Domain-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.
Domain-driven design nedir?
Domain-driven design ya da kısaca DDD, Eric Evans'ın aynı adlı 2003 tarihli kitabında ortaya koyduğu bir yaklaşımdır. Çoğu yazılımda en zor kısmın, alan (domain) denen iş problemini anlamak olduğunu savunur; bu yüzden geliştiricilerin alan uzmanlarıyla yakın çalışması ve kodu işin gerçekte nasıl yürüdüğüne göre şekillendirmesi gerekir. Alan; nakliye lojistiği, sigorta hasarları ya da çevrimiçi bankacılık olabilir.
Temel uygulamalardan biri ubiquitous language'dir (ortak dil): geliştiricilerin ve uzmanların toplantılarda, belgelerde ve kodun kendisinde kullandığı ortak bir söz dağarcığı. İş tarafı bir sevkiyatın gönderilmesinden söz ediyorsa kodda genel bir updateStatus fonksiyonu değil, dispatch() metodu olan bir Shipment sınıfı bulunur. Büyük alanlar, kendi tutarlı modeli ve diline sahip bölgeler olan bounded context'lere (sınırlı bağlam) bölünür; örneğin müşteri, satış ekibi için destek ekibinden farklı bir anlama gelir.
DDD modele yönelik yapı taşları da sunar. Entity'ler, ID'li bir sipariş gibi zaman içinde kalıcı bir kimliği olan nesnelerdir; value object'ler, bir para tutarı gibi yalnızca değerleriyle tanımlanır; aggregate'ler ise birlikte tutarlı kalması gereken ve yalnızca tek bir kök nesne aracılığıyla değiştirilen nesne kümeleridir. Domain event'ler OrderShipped gibi olan önemli şeyleri kaydeder.
Bir mimarın binayı tasarlamadan önce hastanenin doktor ve hemşireleriyle vakit geçirmesi, yerleşimin onların gerçek çalışma biçimine uyması için iyi bir benzetmedir. DDD sıklıkla mikroservislerle karıştırılır: bounded context'ler servis sınırlarının nereye çizileceğine karar vermek için yararlı bir yoldur, ancak DDD modelleme ile ilgilidir ve monolitte de aynı ölçüde iyi çalışır. Karmaşık iş mantığında karşılığını verir; basit CRUD uygulamaları için genellikle fazla ağırdır.
Önemli noktalar
- DDD kodu iş alanına ve uzmanlarının bilgisine göre şekillendirir.
- Ortak dil, iş terimlerini ve kod adlarını aynı tutar.
- Bounded context'ler büyük bir alanı kendi modeli olan bölgelere ayırır.
- Entity'ler, value object'ler ve aggregate'ler temel yapı taşlarıdır.
- Karmaşık iş mantığında işe yarar, basit CRUD uygulamalarında değil.
Örnek
// Value object: defined only by its values and never changed after creation
class Money {
constructor(readonly amount: number, readonly currency: string) {}
}
// Entity and aggregate root: has an identity and protects its own rules
class Order {
private status: "draft" | "placed" | "shipped" = "draft";
constructor(readonly id: string, readonly total: Money) {}
ship() {
if (this.status !== "placed") throw new Error("Only placed orders can ship");
this.status = "shipped"; // named in the business's own language
}
}Sık sorulan sorular
DDD'de bounded context nedir?
Bounded context, belirli bir alan modelinin ve terimlerinin tek bir tutarlı anlama sahip olduğu net bir sınırdır. Faturalama ve nakliye gibi farklı bağlamların her biri, müşteri gibi aynı gerçek dünya kavramının kendi modeline sahip olabilir.
Domain-driven design ile mikroservisler aynı şey mi?
Hayır. DDD iş mantığını modelleme yaklaşımıdır; mikroservisler ise bir sistemi ayrı servisler olarak dağıtma yoludur. Bounded context'ler mikroservis sınırlarına karar vermek için sık kullanılır, ancak DDD bir monolitin içinde de aynı ölçüde iyi çalışır.
Domain-driven design ne zaman kullanılmalı?
DDD en çok finans, lojistik ya da sağlık gibi iş kurallarının karmaşık olduğu ve sık değiştiği durumlarda değerlidir. Çoğunlukla veri okuyup yazan basit CRUD uygulamalarında ise uygulamaları genellikle sağladığı faydadan fazla yük getirir.
İlgili sayfalar
- MikroservislerYazılım Mimarisi, s. 24Mikroservisler, bir uygulamanın ağ üzerinden iletişim kuran, küçük ve bağımsız olarak dağıtılabilen servislere bölündüğü bir mimari tarzdır.
- MonolitYazılım Mimarisi, s. 25Monolit, tek parça olarak derlenip dağıtılan, tüm özelliklerin tek kod tabanını, tek süreci ve çoğunlukla tek veritabanını paylaştığı yazılım uygulamasıdır.
- 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.
- CQRSYazılım Mimarisi, s. 7CQRS, veriyi değiştiren kodu (komutlar) veriyi okuyan koddan (sorgular) ayırarak iki ayrı modele bölen bir mimari desendir.
- Olay Güdümlü MimariYazılım Mimarisi, s. 29Olay güdümlü mimari, servislerin bir siparişin verilmesi gibi olaylar üreterek ve bunlara tepki vererek iletişim kurduğu bir yazılım tasarım tarzıdır.
- OOPProgramlamanın Temelleri, s. 41OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin