DDD Sınırlı Bağlamlar ve Etki Alanları?


16

Ben 10 'lerin veritabanı tabloları (Toplamlar, Varlıklar / Değer Nesneleri) ile nispeten karmaşık bir uygulama üzerinde çalışıyorum ve DDD uygulamak. Bu noktada temelde DDD-Lite gibi görünüyor ki Uygulama / Etki Alanı Hizmetleri, Etki Alanı Modeli (Varlıklar, Değer Nesneleri) ve Depolar var.

DDD'yi uygulayan bir kitap aldım ve bahsettiği ilk şey DDD-Lite ve Sınırlı Bağlamlar ve Alan Olayları DDD'ye başlarken olağan ilk hatalar olarak eksik.

Şu anda Etki Alanı Modelini Toplu ilişkilere göre düzenlemeyi ve göstermek için ad alanlarını kullanmayı denedim.

Etki Alanı Modeli projesinin ayrı Sınırlı bağlamlara (henüz) ayrılmasıyla ilgili faydaları / düşüşleri göremiyorum. Belki daha sonra belirginleşecektir, ancak Sınırlı Bağlamlar (ve muhtemelen alt etki alanları vb.


Bana öyle geliyor ki, ayrı sınırlı bağlamları tanımlayan tek şey dilbilimi ve ilgili operasyonel farklılıkları ayırt etme ihtiyacıdır, yani bir alanda ürün ve başka bir alanda ürün olarak adlandırılır, ancak farklıdırlar, bu yüzden iki ürüne ihtiyacımız var ve her ikisi de ' t aynı modelde olmalıdır (aynı isim vb.). Öyleyse neden isimleri, kurnazca farklı anlambilimlerini temsil edecek şekilde değiştirmiyoruz? Hepsine hükmedecek bir modelimiz olabilir. Alt alanlar doğaldır, ancak şu anda sınırlı bağlamlar görmüyorum. Burada yüksek sesle düşünmek ...
Ashley Aitken

Sanırım alanınızı bağlamlara ayırmanın neden karlı olduğunu zaten fark ettiniz. Bu yüzden şimdi faydalı olabilecek, onları tanımlamanın, bağlamın sınırlarını tanımlamanın doğru yoludur. İşte bunu nasıl yapacağım: medium.com/@wrong.about/…
Zapadlo

Yanıtlar:


20

Birkaç farklı departmanı olan bir şirketi düşünün:

  • Yazılım geliştirme
  • İK
  • Muhasebe

Tüm bu iş alanlarını ifade edebilecek bir kullanıcı modeli bulabilir misiniz? Kullanıcı varlığının her birinde nasıl görünebileceğini düşünün. Belki de üç farklı varlığa ayrılmıştır:

  • Geliştirici
  • işçi
  • Alacaklı

Bir kullanıcıyı her bağlamda somutlaştırma çabası oldukça farklıdır. Belki de böyle bir şey:

  • yeni Çalışan (ssn, isim, joindate, doğum tarihi, cinsiyet)
  • yeni Geliştirici (Çalışan, iş istasyonu, kimlik bilgileri)
  • yeni Alacaklı (Çalışan, rol)

mazeret, referans için uygun bir alan adı modeli olmadan doğru bir şekilde göstermek zor

Saf bir uygulama kullandıysanız ve tek bir kullanıcı varlığı kullandıysanız, alıcılar ve ayarlayıcılarla dolu anemik bir veri modeli olur, çünkü kullanıcıyı her yerde tam olarak temsil edemezdiniz.

İşletmede net sınırlar var, bu yüzden onları bu şekilde modellemek yararlıdır. Bir bordro sistemindeki bir kullanıcıya karşı bir oyun oynayan bir kullanıcıya karşı giriş yapan bir kullanıcı, aynı büyük sistemin parçası olsalar bile hepsi çok farklıdır.

Başka bir şekilde düşünmek - artık çok hafif ve sisteminizin geri kalanından bağımsız olmak için geliştirici yönetim kodunuzu oluşturabilirsiniz. Endişelenmek için daha az bagajla daha doğru tipler kullanabilir. Nihayetinde kendi uygulamasına çıkarılabilecek daha küçük alt sistemler oluşturma adımıdır.


M.Ö. 3'lerin farklı ihtiyaçlarını göstermeye yardımcı olan destekleyici örnek için teşekkürler.
lko

Ben bu kavramları görmeye alışkınım şekilde değil: Normalde, bir Employeebir değil Usero, sahip bir User. Bu User, basitçe bir kişinin giriş yapabileceği ve kuruluş içindeki bir veya daha fazla uygulamaya erişebildiği bir varlıktır. Ve Employeea her zaman bir User. Ayrıca, normalde farklı departmanlar için basit bir uygulama elde edemezsiniz; genellikle, her bölümün kendi etki alanı model (ler) ini içeren kendi uygulamaları vardır. Yani bana göre bu cevap, aynı kod tabanında ayrı sınırlı bağlamlara sahip olmanın gerekliliğini açıklığa kavuşturmuyor.
Rogério

@ Rogério itirazınız aslında her sınırlı bağlamda her yerde kullanılan dilleri doğru bir şekilde tanımlamanın neden önemli olduğuna güzel bir örnektir :)
MauganRa

Sadece bir müşteri yönetim sistemimiz olduğunda, siparişlerimizi sorgulamak için telefon, ya da fatura vb. Durumlarda uygun departmana aktarılırken beklemeye alınır. Her bir departmanın alan bilgisi - bu senaryolarda müşterinin can sıkıcı olması gibi - devreye girer. Belki bu bağlamlar arasındaki ayrımı zorlamak için DDD'yi suçlayabiliriz.
Andez

16

Sana başka bir örnek verebilirim. Bazı e-ticaret sisteminiz olduğunu düşünün. Orada ürünleriniz olur, ancak ürünler en az iki farklı alanın parçası olur:

  • Ürün açıklamanızı ve tüm özelliklerinizi sakladığınız ürün kataloğu
  • Ürün stok seviyesine sahip olduğunuz envanter

Her iki alan için de sınırlı bir bağlamınız varsa, çözümünüz hızla büyük bir çamur topu haline gelebilir, çünkü çapraz referans vermeye başlayacaksınız. Sonunda artık iki alanınız olmayacak. Ürün envanteriniz ürün kataloğu referansları ile şımartılacak veya tam tersi. Bunun sonucu olarak, bunun gerekli olmadığını tam olarak anlasanız bile, bir alanı başka bir alana dokunmadan değiştiremezsiniz. Modelleriniz birbirine bağımlı, sıkıca bağlı ve kötü bir şekilde bağımlı - uygulamaya bağlı.

Bununla birlikte, iki sınırlı bağlamınız varsa, bir etki alanında yaptığınız tüm değişiklikler, iletişim kanallarınızı temiz tutar tutmaz diğerini etkilemez. Bu, veri çoğaltmanızın olması gerektiği anlamına gelecektir, ancak bu, yakın birleşik bileşen tabanlı uygulama için en düşük maliyettir. Alan adlarınız, alan adı etkinliklerini kullanarak birbirleriyle konuşabilir. Başlangıçta SOA tabanlı bir uygulamaya sahip olmayı planlamasanız bile, nispeten düşük çaba ile ihtiyacınız olduğunda bu seviyeye kadar ölçeklendirebileceksiniz, çünkü sadece alan etkinlikleriniz için aktarımı değiştirdiğiniz ve arkasındaki fikri olduğu gibi bırakacaksınız.

Güncelleme: SkillsMatter'da Eric Evans'dan iyi bir beceri var. Birkaç kör adam bir fili kendi perspektifinden tarif ettiğinde eski hikayenin bir benzetmesini verir. Her insan filin sadece bir kısmına dokunabildiğinden, onu bir "ağaç", "duvar", "yılan", "ip" olarak tanımlarlar. Ve bu insanların her biri kendi bağlamları içinde. Sınırlı bağlam her yerde bulunan dilin yaşadığı yerdir. Bağlamın dışında, bu terimler tamamen farklı bir anlama sahip olabilir, ancak bağlam içinde, dil birden fazla alanda aynıdır. Greg Young bölüm 11'deki mavi kitabı okumaya başlamanızı şiddetle tavsiye ediyor, çünkü burada en önemli, temel kavramlar açıklanıyor. Kitabın başındaki taktik kalıplara odaklanma, bu "DDD-light" yaklaşımını çok yaygın kılıyor,


1
Çoğaltmayı getirmek için +1. ilk başta biraz kafa karıştırıcı ("Bu yanlış mı yapıyorum ?!) ama tamamen doğal, çoğu durumda, gerekli.
Adrian Schneider

Bu senaryoda bu Productsınıflar hem varsayımsal olarak aynı kimliği paylaşıyor mu (örneğin, ayrı BC tablolarının her ikisinin de tek bir Ürün Kimliği içeren bir tablonun yabancı anahtarı vardır)? Belki de Domain Events ile iletişim kurarken bu kimliği kullanabilirler?
lko

1
Her şey hangi depolama alanının seçildiğine bağlıdır. Alanlar arası başvurmak için teknik kimliği kullanmak gerekli değildir. Bağlamlar arası iletişim yapılması da önerilmez.
Alexey Zimarev

1
Görünüşe göre mavi kitabı raftan çıkarma ve daha sonraki bölümleri okuma
zamanı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.