2009-09-15 21 views
5

previous question स्वीकृत उत्तर पर Dr. Herbie की टिप्पणियों में से एक यह था कि मेरी विधि दो जिम्मेदारियां कर रही थी .. डेटा बदलने और डेटा को सहेजने की स्थिति।इस कोड के लिए चिंताओं को अलग करने का सबसे अच्छा तरीका क्या है?

जो मैं समझने की कोशिश कर रहा हूं वह मेरी परिस्थितियों में इन चिंताओं को अलग करने का सबसे अच्छा तरीका है।

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 

//method in PolicyManager which has data access and update responsibility 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
    Update(policy); 
} 

हैं:

एक नीति वस्तु जो NHibernate के माध्यम से लिया गया है होने के अपने उदाहरण के साथ पर ले जाने ....

तरह से मैं वर्तमान नीति सेट कर रहा हूं निष्क्रिय करने के लिए इस प्रकार है मैं डेटा एक्सेस और डेटा अपडेट की ज़िम्मेदारी को अलग करना था इसके बारे में जाने का सबसे अच्छा तरीका क्या होगा?

बेहतर PolicyManager (जो दाव के लिए प्रवेश द्वार के रूप में कार्य) नीति वस्तु की स्थिति को प्रबंधित करने के लिए है:

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 
policyManager.Update(policy); 

//method in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
} 

या नीति वस्तु को बनाए रखने के लिए यह अपने राज्य है और उसके बाद का उपयोग करने के लिए प्रबंधक वर्ग डेटाबेस में जानकारी सहेजने के:

Policy policy = new Policy(); 
policy.Status = Active; 

policy.Inactivate(); 

policyManager.Update(policy); 

//method in Policy 
public void Inactivate() 
{ 
    this.Status = Inactive; 
} 

उत्तर

1

मेरी मूल टिप्पणी जारी रखने के रूप में :) ... वर्तमान में आपकी सबसे अच्छी शर्त तीसरी विकल्प है, लेकिन यदि चीजें अधिक जटिल हो जाती हैं तो आप दूसरे के साथ जा सकते हैं, पूर्व निर्धारित अनुक्रमों को करने के लिए मुखौटा विधियों को जोड़ते समय:

Policy policy = new Policy(); 

policy.Status = Active; 

policyManager.InactivateAndUpdate(policy); 


//methods in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    // possibly complex checks and validations might be put there in the future? ... 
    policy.Status = Inactive; 
} 

public void InactivateAndUpdate(Policy policy) 
{ 
    Inactivate(policy); 
    Update(policy); 
} 

InactivateAndUpdate, मुखौटा विधि है, जो सिर्फ वहाँ है बुला कोड एक छोटे से neater बनाने के लिए की तरह है (टूटता तरीकों के लिए एक जिम्मेदारी की तरह, जबकि अभी भी अलग चिंताओं होने के लिए वास्तविक काम कर रही है तरीकों की इजाजत दी , लेकिन कभी-कभी आपको व्यावहारिक होना चाहिए!)। मैं जानबूझकर स्टाइल एक्स और वाई में दो तरीकों के रूप में बाहर खड़े होने के लिए इस तरह के तरीकों का नाम देता हूं।

निष्क्रिय और अद्यतन विधि फिर आपको रणनीति पैटर्न लागू करने या गतिशील प्रसंस्करण के लिए कमांड ऑब्जेक्ट्स के रूप में वास्तविक कार्यान्वयन विधियों को विभाजित करने या भविष्य में जो भी अन्य वास्तुकला संभव हो सकता है, को विभाजित करने के लिए आपको मुक्त करता है।

3

मुझे क्या करना होगा:

  • एक संग्रह बनाएं जो नीतियों को बचाता है और पुनर्प्राप्त करता है। (पॉलिसी रिपोजिटरी)

  • यदि आपके पास जटिल तर्क है जो पॉलिसी को सक्रिय/निष्क्रिय करने के लिए किया जाना चाहिए, तो आप इसके लिए एक सेवा बना सकते हैं। यदि उस सेवा को डेटाबेस तक पहुंच की आवश्यकता है, तो यदि आवश्यक हो, तो आप इसे पॉलिसी रिपॉजिटरी पास कर सकते हैं। यदि कोई जटिल तर्क शामिल नहीं है, और पॉलिसी को सक्रिय/निष्क्रिय करना सिर्फ ध्वज को गलत या सत्य में स्थापित करने का मामला है, या यदि केवल पॉलिसी क्लास के सदस्य शामिल हैं, तो 'सक्रिय' क्यों एक सरल संपत्ति नहीं है पॉलिसी क्लास जिसे आप गलत/सत्य पर सेट कर सकते हैं? मैं केवल एक सेवा बनाउंगा, अगर अन्य ऑब्जेक्ट्स शामिल हैं, या यदि पॉलिसी को सक्रिय या निष्क्रिय करने के लिए डीबी एक्सेस की आवश्यकता है।

0

स्थिति Policy वर्ग के राज्य का हिस्सा है, तो Policy भी Inactivate विधि होनी चाहिए - कि सिर्फ बुनियादी कैप्सूलीकरण है। एक ही जिम्मेदारी में कई वर्गों को उलझाना कम से कम एक वर्ग को कई जिम्मेदारियों के रूप में खराब है।

वैकल्पिक रूप से, स्थिति Policy लेकिन PolicyManager के लिए नहीं संबंधितPolicy के बारे में मेटाडेटा माना जा सकता है,। उस स्थिति में, हालांकि, Policy को अपनी स्थिति बिल्कुल नहीं जाननी चाहिए।

1

मैं निश्चित रूप से कारणों के लिए 3 विकल्प आप का उल्लेख के साथ जाना होगा:

नीति वस्तु को बनाए रखने के लिए यह खुद राज्य है और फिर प्रबंधक वर्ग डेटाबेस के लिए जानकारी बचाने के लिए उपयोग

Repository Pattern पर भी एक नज़र डालें। यह आपके PolicyManager को प्रतिस्थापित कर सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे