Bounded Context Çizmek Kağıt Üzerinde Kolay
User her yerde aynı kişi değil

Atölyede kalem hızlı. Sipariş, kimlik, destek. Üç daire, kesişimde {User}. Herkes rahatlar: ortak dil var. Ertesi sprint kimlik ekibi e-postayı doğrulayınca sipariş fişi bozulur, destek ekibi aynı tabloya {role} ekler, fatura adresi birden zorunlu olur. Ortak dil değil, ortak kilit.
Bağlam sınırı bir daire değil, bir kelime sözleşmesi. Aynı ses, farklı anlam. Müşteri siparişte ödeyen taraftır. Destekte konuşan taraftır. Kimlikte oturum açan taraftır. Üçünü tek satırda tutmak, üç ekibin birbirinin kolonunu bozmasıdır.
Kelimeyi haritada ayırmak
Çizgiyi önce kelimede çekiyorum. Sipariş {BuyerId} görür, adresi bir anlık kopya olarak taşır. Kimlik {AccountId} görür, şifre hash'i orada durur. Destek {RequesterId} görür, belki de bir hesap bile değildir. Eşleme varsa, eşleme bir tablo veya anti-corruption çağrısıdır; paylaşılan entity değil.
{
"identity": { "term": "Account", "writes": ["email", "passwordHash", "locale"] },
"ordering": { "term": "Buyer", "writes": ["buyerId", "snapshotAddress"] },
"support": { "term": "Requester", "writes": ["channel", "ticketState"] },
"sharedKernel": ["AccountId"],
"notShared": ["User", "role", "address"]
}
{User} kelimesini yasaklamak abartı duruyor. Yasakladığım şey, {users} tablosunu her feature'ın evrak çantası yapması. Kimlik tablosu kimlik içindir. Sipariş, ihtiyaç duyduğu alanı kopyalar veya sorar. Sormak da bir sınır: her ekran join atmasın.
Kağıt ile kodun ayrıldığı yer
Kağıtta kesişim güzel durur. Kodda kesişim, foreign key ve ortak enum olur. {UserStatus} hem ban hem de 'fatura bekliyor' anlamını yüklenince, hiç kimse enum'u korkusuz değiştiremez. O korku, bağlamın eridiğinin işareti.
İkinci erime, 'geçici' ortak proje. {Shared.Models} diye bir klasör açılır, içine {UserDto} konur. Üç bağlam aynı DTO'yu şişirir. Bir alan eklemek üç takımı bozar. Shared kernel küçücük olmalı: bir kimlik tipi, belki bir para birimi. DTO değil.
Üçüncü erime, tek {DbContext}. EF, her tabloyu görürse geliştirici de görür. Görmek, yazmak için davetiye. Modülün kendi context'i veya en azından kendi şeması yoksa, kâğıttaki daire bir yorum satırıdır.
Çizgiyi canlı tutmak
Bağlam bir kere çizilmez. Yeni ekran gelince 'şunu da users'a koyalım' teklifi gelir. Teklifi duyunca soruyorum: bu alan kimin iş kuralı? Cevap iki ekipse, alan iki yerde yaşar veya bir olayla akar. Tek satırda yaşamaz.
İsimlendirme burada işe yarar. Sınıf adı {User} ise herkes ona kendi anlamını yükler. {Account}, {Buyer}, {Requester} çirkin durabilir; çirkinlik, yanlış birleşmeyi pahalı yapar. Pahalı birleşme, erken uyarıdır.
Kağıt üzerindeki daireyi sevmiyorum diye çizmiyorum. Daireyi koda geçirmeden bırakmayı sevmiyorum. Geçirmenin yolu, kelimeyi ve yazma yerini ayırmak. Ayıramıyorsanız, o üç daire henüz bir tane.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap