2013-01-06 38 views
15

मैं एरिक इवांस द्वारा लिखी गई शानदार पुस्तक "डोमेन संचालित डिजाइन" पढ़ रहा हूं। अपनी पुस्तक एरिक में दो अलग-अलग अवधारणाओं का वर्णन किया गया है: विनिर्देश पैटर्न और नीतियां।विनिर्देश और नीति के बीच अंतर?

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

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

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

यहाँ एक नीति के लिए एक उदाहरण है::

यहाँ एक विनिर्देशन के लिए एक उदाहरण है

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); 
    } 
} 

मुझे पता है कि एक नीति वास्तव में एक रणनीति है, लेकिन इसके बाद के संस्करण दो उदाहरण में बिल्कुल कोई फर्क नहीं पड़ता है। तो इस बिंदु पर मेरा सवाल है: उन दो पैटर्न के बीच क्या अंतर है? दोनों पैटर्न व्यापार नियमों को स्पष्ट करते हैं तो हम उन दो पैटर्न के बीच अंतर क्यों करते हैं? मेरे लिए दोनों तरह की भविष्यवाणी हैं।

+0

मैं कहूंगा कि विनिर्देशों को उदाहरणों और नीतियों की विशेषताओं का वर्णन करने पर लक्षित किया गया है जो क्रियाओं का वर्णन करने के बारे में हैं। लेकिन मुझे वास्तव में यकीन नहीं है, हालांकि मैंने पुस्तक भी पढ़ी है। – SpaceTrucker

उत्तर

31

विनिर्देश के पीछे मुख्य विचार यह है कि यह एक विधेय है, जो अक्सर इसके साथ तार्किक ऑपरेटर्स का उपयोग

विनिर्देश एक स्थापित रीतिवाद का रूपांतरण है तात्पर्य है (एरिक इवांस DDD, पी। 274)

उदाहरण के लिए हम कह सकते हैं कि बॉक्स लाल है, यानी कुछ RedSpecification को संतुष्ट करता है। हम कुछ ग्रीन स्पेसिफिकेशन, और यहां तक ​​कि एक समग्र RedOrGreenSpecification घोषित कर सकते हैं। हम कुछ उन्नत रूपरेखा है कि विनिर्देशों के लिए तार्किक आपरेशनों का समर्थन करता है है, तो ऐसा लगता है जैसे

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

कुछ तो हम कुछ रिपोजिटरी से सभी लाल/हरी बक्से क्वेरी करने के लिए उदाहरण के लिए विनिर्देश उपयोग कर सकते हैं हो सकता है:

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

नीति के लिए - यह स्ट्रैटजी पैटर्न का एक रूप है, लेकिन इसका मुख्य उद्देश्य व्यापार नियमों को समाहित करना कुछ घोषणात्मक रूप है।

तकनीकी तौर पर - यह हमेशा रणनीति का एक सीधा कार्यान्वयन नहीं है - पहले चरण में यह सिर्फ एक अलग वर्ग हो सकता है (के रूप में यह नीले रंग पुस्तक के प्रथम अध्याय में दिखाया गया है), लेकिन यह बाद में आसानी से

बढ़ाया जा सकता है

नीति स्ट्रैटजी के रूप में जाने जाने वाले डिजाइन पैटर्न के लिए एक और नाम है, यह आमतौर पर विभिन्न नियमों को प्रतिस्थापित करने की आवश्यकता से प्रेरित होता है, जहां तक ​​हमें पता नहीं है। लेकिन अवधारणा हम पर कब्जा करने की कोशिश कर रहे हैं एक नीति के अर्थ, जिसमें डोमेन संचालित डिजाइन

उदाहरण के लिए हम जनवरी में पीले बक्से में प्रस्तुत करता है पैक एक समान रूप से महत्वपूर्ण प्रेरणा है फिट होता है, और लाल रंग में फ़रवरी

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(); 
     } 
} 

ऐसा नहीं है कि नीति कार्यों को संपुटित कर सकते हैं समझने के लिए है, जबकि विनिर्देश एक वस्तु के गुण (इन गुणों दोनों संतुष्ट कर सकते हैं या व्यापार की आवश्यकताओं को संतुष्ट नहीं है) का वर्णन करता है महत्वपूर्ण है में बक्से। कुछ सत्यापन नीति निश्चित रूप से आवश्यकताओं को संतुष्ट करने के लिए विनिर्देशों का उपयोग कर सकती है।

तो आपके पास अपनी परियोजना में कई अलग-अलग विनिर्देश उदाहरण हो सकते हैं, और वे व्यापार बिंदु से वैध और अमान्य वस्तुओं दोनों का वर्णन कर सकते हैं।असल में, विनिर्देशों को कोई अर्थ नहीं हो सकता है: उदाहरण के लिए यदि आपके पास कोई उत्पाद खोज साइट है, तो उपयोगकर्ता "एक्सबॉक्स" नामक उत्पाद की खोज करने का अनुरोध निर्दिष्ट कर सकता है, लेकिन विक्रेता नाम "सोनी" के साथ, अगर ज्ञान केवल विशिष्ट विक्रेता आपके उत्पाद में विशिष्ट उत्पादों का उत्पादन नहीं कर सकते हैं। (ताकि कोड परियोजना के विभिन्न भागों में बिखरे हुए है नहीं)

नीति का महत्वपूर्ण पहलू यह है कि इसकी मंशा वास्तविक व्यापार के नियम को संपुटित करने के लिए है है, इसलिए जब नियमों को बदलने आप आसानी से इसी वर्ग पा सकते हैं। तो आपके पास अपनी परियोजना में कई विनिर्देश हो सकते हैं, लेकिन नीतियों की एक प्रबंधनीय संख्या हो सकती है, और उन नीतियों को ढूंढना और बदलना आसान होना चाहिए।

पीएस कृपया ध्यान दें कि यह पोस्ट सिर्फ एक उदाहरण है और अधिक इंजीनियरिंग करने का लाइसेंस नहीं है, बेशक आपको सबसे सरल डिजाइन का उपयोग करना चाहिए, यह सामान्य ज्ञान का विषय है।

+0

बहुत अच्छा, व्यापक उत्तर! – eulerfx

+0

मुझे यह अधिकार प्राप्त करने दें। एक नीति में एल्गोरिदम होते हैं। निर्दिष्टीकरण भविष्यवाणी कर रहे हैं और इसलिए बूलियन चेक तक ही सीमित हैं। क्या मुझे यह अधिकार मिला? (इसे सरल रखने के लिए) – MUG4N

+0

@ एमयूजी 4 एन हाँ - यह उनके बीच का अंतर है, लेकिन विनिर्देश की सबसे अच्छी विशेषता रचना है, और नीति की विशेषता यह है कि कोड जिसमें व्यापार नियम शामिल हैं बिखरे हुए नहीं हैं (encapsulation) I.e. यह ठीक है कि सभी जगहों पर बहुत सारे चश्मा (और उनके संयोजन) हैं, लेकिन कुछ केंद्रीकृत जगहों के बिना बहुत सारी नीतियां ठीक नहीं हैं, जहां आप उन्हें पा सकते हैं। –