2013-01-06 28 views
15

Eric Evans tarafından yazılan "Domain Driven Design" adlı parlak kitabı okuyorum. Eric'in kitabında iki farklı kavram açıklanmaktadır: şartname modeli ve politikaları. Bir bir politika için örnek BuradaSpesifikasyon ve bir politika arasındaki fark nedir?

public interface ProjectSpecification { 
    public boolean isSatisfiedBy(Project p); 
} 

public class ProjectIsOverdueSpecification implements ProjectSpecification { 
    public boolean isSatisfiedBy(Project p) { … } 
} 

//client: 
if { 
    (projectIsOverdueSpecification.isSatisfiedBy(theCurrentProject) { … } 
} 

edilir: Burada

bir teknik özellik örneğidir Bir politika aslında bir strateji olduğunu biliyoruz

public class CargoBooking { 

    private OverBookingPolicy overBookingPolicy = new OverBookingPolicy(); 

    public int makeBooking(Cargo cargo, Voyage voyage) { 
    if (!overbookingPolicy.isAllowed(cargo, voyage)) 
     return –1; 
    int confirmation = orderConfirmationSequence.next(); 
    voyage.addCargo(cargo, confirmation); 
    return confirmation; 
    } 
} 

public OverBookingPolicy { 
    public boolean isAllowed(Cargo cargo, Voyage voyage) { 
    return (cargo.size() + voyage.bookedCargoSize()) <= (voyage.capacity() * 1.1); 
    } 
} 

ama orada Yukarıdaki iki örnekte kesinlikle fark yok. Dolayısıyla bu noktada sorum şu: Bu iki model arasındaki fark nedir? Her iki örüntü de iş kurallarını açık hale getiriyor, bu yüzden neden bu iki örüntüyü birbirinden ayırıyoruz? Benim için her ikisi de bir tür yüklemedir.

+0

Örneklerde, özelliklerin ve ilkelerin özelliklerinin tanımlanmasıyla ilgili eylemlerin tanımlanmasıyla ilgili hedeflerin belirtildiğini söyleyebilirim. Ama kitaptan da okudum, ama gerçekten emin değilim. – SpaceTrucker

cevap

31

BELİRTİME ardındaki ana fikir genellikle

ŞARTNAME kurulu bir biçimcilik bir uyarlamasıdır onunla mantıksal operatörleri kullanarak ima eden yüklem, olmasıdır (Eric Evans DDD, s. 274)

Örneğin kutunun kırmızı olduğunu söyleyebiliriz, yani bazı RedSpecification'ı karşılar. Bazı GreenSpecification ve hatta bir kompozit RedOrGreenSpecification bildirebiliriz. biz özellikleri için mantıksal işlemleri destekleyen bazı gelişmiş bir çerçeve varsa, bu

BoxSpecification redBoxSpec = BoxSpecification.forColor(BoxColor.RED); 
BoxSpecification greenBoxSpec = BoxSpecification.forColor(BoxColor.GREEN); 
BoxSpecification redOrGreenBoxSpec = redBoxSpec.or(greenBoxSpec); 

gibi bir şey o zaman bazı deposundaki bütün kırmızı/yeşil kutuları sorgulamak için örneğin şartname kullanabilirsiniz olabilir:

Collection<Box> boxes = boxRepository.findAll(redOrGreenBoxSpec); 

POLICY'e gelince - bu STRATEJİ modelinin bir çeşidi, ancak asıl amacı iş kurallarının kapsanması bazı bildirimsel formdur.

Teknik - (mavi kitabın ilk bölümünde gösterildiği şekliyle) sadece ayrı sınıf olabilir ilk aşamalarında, ancak daha sonra kolayca

uzatılabilir - bu STRATEJİSİ doğrudan uygulanması her zaman değil

Politikası bildiğimiz, genellikle burada gerekli değildir farklı kuralları, yerine ihtiyaç motive edilir STRATEJİSİ olarak bilinen tasarım modeli için başka adıdır. Ama biz yakalama çalışıyoruz konsept Ocak ayında sarı kutulara hediyeler paketi alan güdümlü tasarım

Örneğin içinde eşit derecede önemli bir motivasyon olan bir politikayı anlamını, uymayan ve kırmızı yok Şubat

public class Box{ 
    public BoxColor getColor(){} 
    public void recolor(BoxColor color){} 
} 

public class BoxFactory{ 
    public Box createDefaultBox(SomeDate date){ 
     NewBoxPolicy boxPolicy = PolicyRegistry.getNewBoxPolicyForDate(date); 
     Box box = new Box(); 
     boxPolicy.prepareBox(box); 
     return box; 
    } 
} 
public interface NewBoxPolicy{ 
    void prepareBox(Box box); 
} 
public class FebruaryNewBoxPolicy implements NewBoxPolicy{ 
    public void prepareBox(Box box) { box.recolor(BoxColor.RED}; } 
} 
public class JanuaryNewBoxPolicy implements NewBoxPolicy{ 
    public void prepareBox(Box box) { box.recolor(BoxColor.YELLOW}; } 
} 
public class PolicyRegistry{ 
    public static NewBoxPolicy getNewBoxPolicyForDate(SomeDate date){ 
     switch (date.month()){ 
     case SomeMonth.JANUARY: return JANUARY_NEW_BOX_POLICY; 
     case SomeMonth.FEBRUARY: return FEBRUARY_NEW_BOX_POLICY; 
     default: throw new AssertionError(); 
     } 
} 

o ŞARTNAME sadece bir nesnenin özelliklerini (bu özelliklerin her ikisi tatmin edebilir veya iş gereksinimlerini karşılamak YAPMAYIN) açıklar ise, eylemleri içine alabilir POLİTİKASI anlamak önemlidir içinde kutuları. Bazı doğrulama politikaları, şartların yerine getirildiğini kontrol etmek için SPESİFİKASYONLARI kullanabilir.

Yani projede birçok farklı ŞARTNAME örneği bulunabilir ve bunlar bakış iş açıdan geçerli ve geçersiz nesneler hem açıklayabilirsiniz.Aslında, teknik özellikler hiç mantıklı olmayabilir: örneğin, bir ürün arama siteniz varsa, kullanıcı "XBOX" adlı bir ürünü aramak için bir istek belirtebilir, ancak "Sony" satıcı adıyla, yalnızca Belirli satıcılar belirli ürünleri üretebilir, modelinizde yakalanmaz.

POLİTİKASI önemli yönü onun niyet fiili iş kuralları kapsüllemenizi olmasıdır (böylece kod projenin farklı bölümlerini dağınık değildir), bu yüzden kurallar değiştiğinde kolayca karşılık gelen sınıf bulabilirsiniz. Bu nedenle, projenizde çok sayıda TEKNİK ÖZELLİK olabilir, ancak yönetilebilir bir sayıda POLİTİKA olabilir ve bu POLİTİKALAR bulmak ve değiştirmek kolay olmalıdır.

P.S. Lütfen bu gönderinin sadece bir örnek olduğunu ve aşırı mühendislik yapmak için bir lisans olmadığını unutmayın, tabi ki en basit tasarımı kullanmalısınız, bu bir sağduyu meselesi.

+0

Çok iyi, kapsamlı cevap! – eulerfx

+0

Bu durumu bana anlatayım. Bir politika algoritmalar içerir. Teknik özellikler yüklemedir ve bu nedenle boole kontrolleriyle sınırlıdır. Bunu doğru mu yaptım? (basitleştirmek için) – MUG4N

+0

@ MUG4N evet - aralarındaki fark bu, ancak SPESİFİKASYON'un en havalı özelliği bileşimdir ve POLİTİKA özelliği, iş kurallarını içeren kodun dağılmamış olmasıdır (kapsülleme). her yerde bir çok özelliğin (ve bunların kombinasyonlarının) olması iyi bir şeydir, ancak bunları bulabileceğiniz bazı merkezi bir yer olmadan çok fazla politikaya sahip olmak iyi değildir. –

İlgili konular