Yazılım mimarisinde, karmaşık iş mantığını yönetmek kadar caydırıcı birkaç meydan var mıdır? Geleneksel katmanlı mimariler, iş kurallarının denetleyiciler ve hizmetler arasında dağılmasına neden olan "soluk alan alan modellerine" yol açarak kod tabanını kırılgan ve bakımı zor hale getirebilir. İşte burada Alan Odaklı Tasarım (DDD) parlar. Çekirdek alana ve alan mantığına odaklanarak DDD, karmaşılıkla başa çıkmak için yapılandırılmış bir yaklaşım sağlar. Bu yazıda, DDD'nin temel öğelerini keşfedeceğiz; yüksek seviyeli stratejik kalıplardan taktiksel uygulama detaylarına doğru ilerleyeceğiz.
Stratejik Katman: Sınırlı Bağlamlar
DDD'deki ilk adım,
Sınırlı Bağlamlar'ı tanımlamaktır. Bir sınırlı bağlam, belirli bir alan modelinin tanımlandığı ve geçerli olduğu açık bir sınırdır. Herhangi bir önemsiz olmayan sistemde, aynı terim (örneğin "Müşteri" veya "Ürün") organizasyonun farklı bölümlerinde farklı anlamlara sahip olabilir.
Örneğin, bir
Satış Bağlamı'nda, bir Müşteri kredi notu ve satın alma geçmişi ile tanımlanabilir. Bir
Lojistik Bağlamı'nda ise aynı varlık, gönderim adresleri ve teslimat tercihleri ile tanımlanır. Bunları ayrı ayrı modelleyerek, bir alanın karmaşılığının diğerini kirletmesini önleriz. Bu sorumluluk ayrımı, ekiplerin sistemin farklı kısımları üzerinde bağımsız çalışmasını sağlar, net bir sahiplik güvence altına alır ve gevşek bağımlılığı azaltır.
Taktiksel Katman: Çekirdek Kavramlar
Her sınırlı bağlam içinde, alanı doğru şekilde modellemek için taktiksel kalıplar kullanırız.
Varlıklar ile Değer Nesneleri Arasındaki Fark
Varlıklar ve Değer Nesneleri arasındaki farkı anlamak hayati önem taşır.
Varlıklar, özellikleri değişse bile benzersiz kimlikleri ve yaşam döngüleri ile tanımlanır.
Değer Nesneleri ise tam tersine, özellikleri ile tanımlanır ve değişmezdir (immutable).
Bir banka hesabını düşünün. Hesap kendisi benzersiz bir kimliğe sahip bir Varlıktır. Ancak hesap bakiyesi, bir kimlikten ziyade bir durumu temsil ettiği için bir Değer Nesnesi olarak modellenebilir. Bakiyeyi değiştirmeniz gerekirse, mevcut olanı değiştirmek yerine yeni bir Değer Nesnesi örneği oluşturursunuz.
class Money {
constructor(amount, currency) {
this.amount = amount;
this.currency = currency;
// Değer Nesneleri değişmezdir
}
add(otherMoney) {
if (this.currency !== otherMoney.currency) {
throw new Error("Para birimi uyuşmazlığı");
}
return new Money(this.amount + otherMoney.amount, this.currency);
}
}
Agregalar ve Tutarlılık Sınırları
Bir Agrega, veri değişiklikleri için birim olarak ele aldığımız ilişkili nesnelerden oluşan bir kümedir. İçinde tutarlılık kurallarının (invariants) uygulanabileceği bir sınır tanımlar. Örneğin, bir e-ticaret sisteminde bir
Sipariş Agregası,
Sipariş varlığını ve birden fazla
SiparişKalemi varlığını içerebilir. Bir kalemi silmeden siparişi silemezsiniz, ancak kalemlere dokunmadan siparişi güncelleyebilirsiniz. Agregalar, iş kurallarının tutarlı kalmasını sağlar ve harici erişimin yalnızca Agrega Köküne kısıtlanmasını güvence altına alır.
Alan Olayları
Agregaları gevşetmek ve farklı sınırlı bağlamlar arasında eylemleri tetiklemek için Alan Olayları kullanırız. Bunlar, alanda gerçekleşen önemli bir şeyin kayıtlarıdır; örneğin
SiparisOlusturuldu veya
OdemeIslendi.
class OrderService {
createOrder(items) {
const order = new Order(items);
// Bir alan olayını tetikle
this.eventBus.publish(new OrderCreatedEvent(order.id));
return order;
}
}
Diğer hizmetler, Sipariş servisine sıkı bir şekilde bağlanmadan, gönderim kayıtlarını güncellemek veya onay e-postaları göndermek için bu olaylara abone olabilir.
Evrensel Dilin Gücü
Belki de DDD'nin en felsefi ancak en pratik yönü
Evrensel Dil'dir. Bu, geliştiriciler ile alan uzmanları arasındaki işbirliğiyle geliştirilen paylaşılan bir dildir. Kodda kullanılan terimler, iş tartışmalarında kullanılan terimlerle eşleşmelidir. İş birimi "Fatura" derse, kodda "FaturaKaydi" adında bir sınıf olmamalıdır. Bu hizalama, çeviri hatalarını ortadan kaldırır ve yazılımın iş gerçekliğini gerçekten yansıttığını güvence altına alır.
Sonuç
Alan Odaklı Tasarım sihirli bir değnek değildir, ancak karmaşılığı yönetmek için güçlü bir araç setidir. Sınırlı bağlamları dikkatlice tanımlayarak, varlıkları ve değer nesnelerini doğru şekilde modelleyerek, agregalar aracılığıyla tutarlılığı sağlayarak ve alan olaylarından yararlanarak, dayanıklı, anlaşılır ve iş hedefleriyle uyumlu sistemler inşa edebilirsiniz. Küçük başlayın, evrensel dilinizi tanımlayın ve mimarinizi alanın yönlendirmesine izin verin.