DDD agrega serileştirme için en iyi yöntemler


23

DDD'ye göre, etki alanı mantığı, serileştirme, nesne-ilişkisel haritalama, vs. gibi teknik kaygılarla kirlenmemelidir.

Peki, toplayıcıların durumunu alıcılar ve belirleyiciler aracılığıyla herkese açık bir şekilde ifşa etmeden nasıl seri hale getirir veya eşlersiniz? Örneğin depo uygulamaları için pek çok örnek gördüm, ancak pratikte hepsi haritalandırma için varlıklara ve değer nesnelerine kamu erişimine dayanıyordu.

Kamu erişimcilerinden kaçınmak için yansıma kullanabiliriz, ancak IMO bu etki alanı nesnelerinin hala seri hale getirme endişesine bağlı olacaktır. Örneğin, serileştirme / eşleme yapılandırmanızı değiştirmeden özel bir alanı yeniden adlandıramaz veya kaldıramazsınız. Dolayısıyla etki alanı mantığına odaklanmanız gereken seri hale getirmeyi göz önünde bulundurmalısınız.

Peki, burada takip edilecek en iyi uzlaşma nedir? Halka açık erişimcilerle birlikte yaşayın, ancak eşleme kodu dışında başka bir şey için bunları kullanmaktan kaçının? Yoksa bariz bir şeyi mi özledim?

DDD etki alanı nesnelerinin (varlıklardan ve değer nesnelerinden oluşan kümelerin) durumunu seri hale getirmekle açıkça ilgileniyorum. Bu, genel olarak serileştirme ya da durumsuz hizmetlerin basit veri kabı nesnelerinde çalıştığı işlem dizisi senaryoları ile ilgili DEĞİLDİR .

Yanıtlar:


12

Nesnelerin Çeşitleri

Tartışmamızın amacı, nesnelerimizi üç farklı türe ayıralım:

İşletme Alanı mantığı

Bunlar işi yapan nesnelerdir. Parayı bir çek hesabından diğerine taşırlar, emirleri yerine getirirler ve iş yazılımının gerçekleştirmesini beklediğimiz diğer tüm eylemleri yaparlar.

Etki alanı mantığı nesneleri normalde erişimciler gerektirmez (alıcılar ve ayarlayıcılar). Aksine, nesneyi bir yapıcı aracılığıyla bağımlılıklarını asarak yaratır ve sonra nesneyi yöntemlerle manipüle eder (söyleme, sorma).

Veri Aktarım Nesneleri

Veri Aktarım Nesneleri saf durumdur; herhangi bir iş mantığı içermiyorlar. Her zaman erişimcileri olacak. Onları değişmez bir şekilde yazıp yazmamaya bağlı olarak ayarlayıcıları olabilir veya olmayabilir . Alanlarınızı yapıcıda ayarlayacaksınız ve değerleri nesnenin ömrü boyunca değişmeyecek veya erişimcileriniz okuma / yazma olacaktır. Uygulamada, bu nesneler tipik olarak değiştirilebilir, böylece bir kullanıcı bunları düzenleyebilir.

Model nesnelerini görüntüleme

Görünüm Modeli nesneleri, görüntülenebilir / düzenlenebilir bir veri sunumu içerir. Genellikle veri doğrulama ile sınırlı olan iş mantığı içerebilirler. Görünüm Modeli nesnesinin bir örneği, bir Müşteri nesnesi, bir Fatura Başlığı nesnesi ve Fatura Satır Öğeleri içeren bir InvoiceViewModel olabilir. Görünüm Model nesneleri her zaman erişimciler içerir.

Dolayısıyla saha erişimcilerini içermemesi anlamında "saf" olacak tek nesne türü Etki Alanı Mantığı nesnesi olacaktır. Böyle bir nesnenin seri hale getirilmesi, mevcut "hesaplama durumunu" kaydeder, böylece işlemeyi tamamlamak için daha sonra alınabilir. Görünüm Modelleri ve DTO'lar serbestçe seri hale getirilebilir, ancak pratikte verileri normalde bir veritabanına kaydedilir.

Serileştirme, bağımlılıklar ve eşleşme

Serileştirmenin bağımlılıklar yarattığı doğru olsa da, uyumlu bir nesneye seri hale getirmeniz gerektiğine bağlı olarak, serileştirme yapılandırmanızı değiştirmeniz gerekmemektedir. İyi seri hale getirme mekanizmaları genel amaçtır; Değerleri üyelere eşleyebildiği sürece, bir mülkün veya üyenin adını değiştirip değiştirmemeniz umrumda değil. Uygulamada, bu yalnızca seri hale getirme gösterimini (xml, json, her neyse) yeni nesnenizle uyumlu hale getirmek için nesne örneğini yeniden serileştirmeniz gerektiği anlamına gelir; serileştirici üzerinde hiçbir yapılandırma değişikliği gerekmemelidir.

Nesnelerin nasıl serileştirildiğiyle ilgilenmemesi gerektiği doğrudur. Bu tür endişelerin etki alanı sınıflarından ayrıştırılmasının bir yolunu zaten açıkladınız: yansıma. Ancak seri hale getirici , nesneleri nasıl seri hale getirdiği ve seri hale getirdiği konusunda endişeli olmalıdır ; Sonuçta bu onun işlevidir. Nesnelerinizi serileştirme işleminizden ayrı tutmanızın yolu, serileştirmeyi tüm nesne türleri üzerinde çalışabilen genel amaçlı bir işlev yapmaktır .

İnsanların kafasını karıştıran şeylerden biri, dekuplajın her iki yönde de gerçekleşmesi gerektiğidir. O değil; sadece bir yönde çalışması gerekir . Uygulamada, asla tamamen ayrılmaz; her zaman bazı bağlantı vardır. Gevşek bağlamanın amacı, tüm bağımlılıkları ortadan kaldırmak yerine kod bakımını kolaylaştırmaktır.


Ayrılma konusundaki görüşünle aynı fikirdeyim. Serileştirici, etki alanı nesnesine bağlıdır ve bu Tamam. Ama tam tersi değil. Ancak, etki alanı nesnelerine ilişkin halka açık erişimciler hakkındaki görüşünüze katılmıyorum. Uygulamada sık sık onlara sahipler, evet. Ancak IMO, etki alanı mantığını temiz, nesne yönelimli bir tasarımda uygulamak için tercih edilir: Anlat, sorma . Ancak yine de haritalama amaçları için erişimcilere ihtiyacınız var (ORM, seri hale getirme, GUI ...). Ve eğer mümkünse, kaçınmak istediğim şey bu.
EagleBeak

Erişimcileriniz yoksa, alanlarınıza erişmeyi nasıl planlıyorsunuz?
Robert Harvey,

Aslında, tanımladığınız üç nesne türünden hiçbirine değil , DDD terminolojisindeki "kümelenmeler" e ve alt nesnelerine (enitler, değer nesneleri) atıfta bulunuyorum. Şimdi, sorumun bu konuda yeterince açık olmadığını anladım. Üzgünüm! Lütfen yukarıdaki düzenlememe bakın.
EagleBeak

1
Bu temelde çözülemeyen bir problem - DTO'yu aynı anda açığa çıkarmanın, ayrıştırmanın ve seri hale getirmenin \ şifrelemesini sağlayamazsınız, uzlaşmayı başarmanın bir yoludur. Bununla birlikte, çok daha az müdahaleci yollar vardır: yegor256.com/2016/07/06/data-transfer-object.html
Basilevs

1
Bu enkapsülasyonu düşürür, herkes nesnesinin içini okumak için friend sınıfını uygulayabilir veya kullanabilir.
Basilevs,

-1

Serileştirmenin altında yatan amaç, bir sistem tarafından üretilen verilerin bir veya daha fazla uyumlu sistem tarafından tüketilebilmesini sağlamaktır.

Serileştirmeye en kolay ve en sağlam yaklaşım, verileri basit ve tüketmesi kolay bir formatta tutan tipte bir agnostik formata çevirmektir. Örneğin en yaygın seri hale getirme formatları (örn. JSON, XML), iyi tanımlanmış bir metin tabanlı format kullanır. Metin üretmek, iletmek ve tüketmek basittir.

Bu formatlardan birini kullanmanın ideal olmamasının 2 nedeni vardır.

  1. verim

    Tüm verilerin metin tabanlı eşdeğerlerine çevrilmesinde içsel bir maliyet vardır. Metin, tüm farklı veri biçimlerini ifade etmenin en etkili yolu olsaydı, veri türleri mevcut olmazdı. Ek olarak, bu formatların yapısı senkronize olmayan veya parçalar halinde veri alt kümelerini almak için ideal değildir.

    Örneğin, XML ve JSON, kullanılan verilerin baştan sona yazılacağını ve okunacağını varsaymaktadır. Hafızanın az olduğu çok büyük veri kümelerini işlemek için, verileri kullanan sistem, verileri parçalara göre işlemeyi gerektirebilir. Bu durumda, verileri işlemek için özel bir amaç seri hale getirme / seri kaldırma uygulaması gerekebilir.

  2. Hassas

    Verileri amaçlanan türünden veri agnostik türüne seri hale getirmek / seri hale getirmek için gereken döküm hassaslık kaybına neden olur.

Bir kişi, nesnelerin ve verilerin ikili bir temsilini üretmenin açıkça en verimli ve doğru çözüm olduğunu iddia edebilir. En büyük dezavantajı hem veri tüketen hem de üreten tüm sistemlerin uygulanmasının uyumlu kalması gerektiğidir. Teoride basit bir kısıtlama olmasına rağmen, üretim sistemleri zaman içinde değişme / gelişme eğilimi gösterdiğinden pratikte sürdürülmesi bir kabus.

Bu sözü edilen. Serileştirme / seri kaldırma işleminin etki alanına özgü ayrıntılardan ayrılması genel bir kural olarak anlamlıdır, çünkü genel amaçlı biçimler daha sağlamdır, çeşitli sistemler arasında daha iyi desteklenir ve kullanması için az çok fazla arttırılmış bakım gerektirmez.


Üzgünüm, ama bu sorumu cevaplamıyor. Etki alanı nesnelerinin serileştirme işleminden ayrılması, serileştirme nedenleri veya lehte ve çeşitli biçimlerde eksileri hakkında değil. Etki alanı nesnelerini özel durumlarını herkese açık bir şekilde göstermeden nasıl seri hale getirebilirim?
EagleBeak

@EagleBeak Oh, endişenizin özel üyelerle ilgilenmekle ilgili olduğunu bilmiyordum. Sizin durumunuzda ikili sistemde serileştirilebilir (alıcı sistemin etki alanı nesnelerinin altında oluşturduğu kurallara / yapıya uyduğu varsayılarak) veya serileştirme işleminden önce sadece genel verileri çıkaran bir mantık yazabilirsiniz.
Evan Plaice

Bence 'olağan' varsayım, genel amaçlı bir formata (örneğin, xml, json) seri hale getirilen verilerin herkese açık olacağı ve bu ayrıcalıkların ACL'ler veya başka bir eşdeğer aracılığıyla API üzerinden kontrol edilmesi olduğunu düşünüyorum. Genel amaçlı seri hale getirme / seri hale getirme, iş mantığından bir sistemden diğerine giden veri ayrıştırma çizgileri boyunca daha fazla düşer.
Evan Plaice

Genel erişim sağlayıcıların genellikle seri hale getirilecek nesneler üzerinde varsayıldığı konusunda hemfikirim. Ancak bunun DDD ile ve bunun etki alanı mantığının kapsüllenmesine olan güçlü odaklanması ile ilgili daha fazla şey öğrenmek istiyorum. Tüm DDD uygulayıcıları sadece etki alanı modelinin durumunu seri hale getirme için halka açık erişimciler aracılığıyla ortaya koyuyorlar mı (ve örneklerinde asla bahsetmiyorlar)? Şüpheliyim. Lütfen beni yanlış anlama. Girişinizi çok takdir ediyorum. Sadece farklı bir yönle ilgileniyorum. (Şimdiye kadar sorumun çok belirsiz olduğunu sanmıyorum, ancak Robert Harvey'in cevabı ve seninkiler bunu düşünmemi
sağladı
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.