Anemik bir etki alanı modeli ile başa çıkmak

4 Cevap php

I was trying to separate my DAL from my Business Layer, and in doing so, I decided to eschew any ActiveRecord approach and go for a DataMapper approach. In other words, my domain objects would not take care of persisting themselves. In doing so, I seem to be encroaching on the "anemic domain model" anti-pattern. For instance, one of the entities in my program is an Organization.

Bir örgüt, bu gibi bir şey olarak temsil edilir:

class Organization {
    private $orgId;
    private $orgName;

    // getters and setters
}

Yani temelde bu örgütün bazı veriler için "torba" olarak hareket etmekten başka bir şey (Martin Fowler dediği gibi) yapar. PHP dünyasında bir övmek dizi başka bir şey değildir. Bağlantılı sıfır davranış bulunmaktadır.

Ve programda davranış, çoğunlukla bu nesneler ve DAL arasında bir arabulucu olarak hizmet veren bir OrganizationService gibi "hizmet seviyesi" sınıfında yapışmasını oldum.

PHP (Ben bu nesneler benim veri "torbalama" ısrar neden başka nedenler var) ile olası ölçeklendirme sorunları dışında, bu yaklaşım tamamen kapalı?

How do you handle your domain models in these situations? Perhaps an organization isn't part of my domain in the first place?

4 Cevap

iyi, başında bu gibi görünüyor, ancak daha fazla kodunuzu refactor olacak zaman, kuruluş sınıf için bazı davranış alırsınız ...

i şimdi düşünebilir bir örnek, insanların (çalışanlar) varsa, organizasyon ile ilişkilendirmek isteyebilirsiniz olduğunu. Eğer öyleyse, bir yöntem AssociateEmployee(User employee) örgüt sınıfında yerini bulabileceğiniz olabilir.

Yoksa yerine üç adımda adres, şehir, eyalet gibi parametreleri ayarlama, size ChangeLocation(Street, City, State) yöntemi ekleyebilirsiniz, şirketin konumunu değiştirmek olabilir ..

Eğer o, etki alanına ait etki aşağı hareket etmelidir gibi görünüyor BL / hizmet katman bazı kod karşılaştığınızda, sadece adım, adım gitmek. Eğer Fowler okursanız kodunuzu gördüğünüzde, çok yakında alacak.

Sadece şimdi kansızlık olabilir?

Örneğin, zaman bir kez bir toplantı / konferans kaydı sitesi geliştirme edildi. Sadece bir toplantı ile başladı.

Orada bir toplantı sınıf ve tek örneği hala, ama gelecek yıl biz genişletilmiş ve yeni özellikleri (iki arka-arkaya toplantılar için) ilave edildi toplantısı düzenledi, çok açıkça, sadece henüz tam olarak gelişmiş değil biz daha sonra birden toplantıları içerebilir toplantı grupları ekledi.

Bu yüzden zamanla değişimi etki ve modeli refactored sona erebilir akılda tutmak için önemli olduğunu düşünüyorum, o yüzden anemik olduğunu düşünüyorum olabilir olsa bile örgüt sınıf başlayacak gibi, sadece (biraz da ileriye dönük olabilir bazı ayarlar, kurallar veya tercihleri ​​falan) olsun.

Ayrıca DDD senin için çok fazla havai olabilir, iş kuralları, bir sürü, ya da etki alanı yoksa, sadece bu karmaşık olmadığını düşünebilirsiniz. DDD büyük, karmaşık etki alanları için mükemmel bir çözümdür, ama sadece dışarı veri veri yapıyorsun havai ve karmaşıklığı bir çok şey var. DDD yüzden haklı, tasarım ve doğal karmaşıklık ekler zordur, problem alanı karmaşıklığı o ağır basmalıdır.

Ben zappan ve epitka eklemek istiyorum hepsi bu.

Eğer başlamak için orada olmamalı reposnsibility alıyor çünkü varlık anemik değildir. Kalıcı ve kuruluşlar getiriliyor depoları reponsibility olduğunu. Gerçekten davranış değil, bir hizmet katmanda kişiler olmalıdır. Ama yolu basit bir cevap ötesinde nerede ne gider açıklayan. İyi bir başlangıç ​​noktası Eric Evans tarafından DDD.