2009-03-26 14 views
6

मेरे पास किसी के साथ रणनीति पैटर्न वास्तव में क्या है और इस मामले को सुलझाने के लिए एक विशेषज्ञ की आवश्यकता है।रणनीति डिजाइन पैटर्न की सटीक परिभाषा क्या है?

हम दोनों सहमत हैं कि रणनीति पैटर्न एक ही इंटरफेस को बनाए रखते हुए रनटाइम पर एक वर्ग (उदा। व्यवहार) को बदलने के लिए अनुमति देता है। हालांकि, उनकी विवाद यह है कि "[एल्गोरिदम] के लिए एक रणनीति होने के लिए, आपको एक ही परिणाम प्राप्त करना होगा"। मेरी विवाद यह है कि एक वर्ग के "एल्गोरिदम" या तर्क को स्वैप करने का अर्थ यह हो सकता है कि ओवरराइड ऑपरेशन के परिणाम अलग हैं, लेकिन यह अभी भी रणनीति पैटर्न के उद्देश्य, उद्देश्य (और वर्गीकरण) को पूरा करता है।

टिप्पणी के साथ उसका कोड उदाहरण:


अपने परिभाषा के अनुसार, एक वर्ग के किसी भी उपवर्गों एक रणनीति होगी। उनके पास एक ही विधि परिभाषाएं (हस्ताक्षर) हैं, और इसलिए अदला-बदली हैं।

Interface Strategy 
{ 
    DoArithmatic(int[] a) 
} 

Class A : Strategy 
public int DoArithmatic(int[]a) 
{ 
    int temp = 0; 
    for(int i =0; i< a.length; i++) 
      temp += a[i] 
} 

Class B : Strategy 
public int DoArithmaticB(int[]a) 
{ 
    int temp = 0; 
    for(int i =a.length -1; i>-1; i--) 
      temp += a[i] 
} 

Class C : Strategy 
public int DoArithmatic(int[]a) 
{ 
    int temp = 0; 
    for(int i =0; i< a.length; i++) 
      temp -= a; 
} 

int[] a = { 1,2,3 } 
ClassA.DoArithmatic(a) = 6 
ClassB.DoArithmatic(a) = 6 
ClassC.DoArithmatic(a) = -6//This one is not interchangeable 

पहले दो रणनीतियों हैं। क्योंकि किसी भी इनपुट के लिए वे आपको एक ही जवाब देंगे। आखिरी वाला नहीं है। सिर्फ इसलिए कि यह आपको एक int देता है यह एक रणनीति नहीं बनाता है। उन्हें एक ही चीज़ "करना" है।

आप उन्हें एक रणनीति बनाने के लिए "उच्च" अमूर्त अवधि का उपयोग नहीं कर सकते हैं।

ये सभी "MATH" करते हैं लेकिन वे सभी एक ही तरीके से "समान" चीज़ नहीं कर रहे हैं। यह एक रणनीति का सार है।

तो, कौन सही है?

उत्तर

11

आप सर सही हैं और आपके सहकर्मी को गोफ पढ़ने की जरूरत है।

"रणनीति पैटर्न एल्गोरिदम उन ग्राहकों से स्वतंत्र रूप से भिन्नता देता है जो उनका उपयोग करते हैं।"

देखें:

http://www.dofactory.com/Patterns/PatternStrategy.aspx

+1

यह एल्गोरिदम भिन्न होता है, लेकिन क्या यह उनके परिणाम को अलग-अलग करने देता है? यानी: यह कार्यान्वयन को अलग-अलग करने देता है, लेकिन इंटरफ़ेस के बारे में क्या? सवाल यही है। –

+0

?? सवाल विशेष रूप से कहा गया है "हम दोनों सहमत हैं कि रणनीति पैटर्न एक ही इंटरफ़ेस को बनाए रखने के दौरान एक वर्ग (उदाहरण के लिए, व्यवहार) को रनटाइम पर बदल दिया जा सकता है" –

+0

"ग्राहकों से स्वतंत्र रूप से भिन्न होता है" ठीक है, लेकिन वे कैसे करते हैं एक दूसरे के बीच भिन्नता (रणनीति बनाम रणनीति)? यही तो प्रश्न है। – eljenso

4

मैं आपकी राय समर्थन करते हैं। विभिन्न रणनीतियों को तब तक बहुत अलग चीजें कर सकती हैं जब तक कि उनका उपयोग उसी संदर्भ में किया जा सके।

उदाहरण के लिए, यदि आप एक पेड़ में प्रत्येक नोड पर जाना चाहेंगे, वैध रणनीति हो सकता है:

  • गहराई-पहले खोज: प्री-ऑर्डर
  • डीएफएस के बाद आदेश
  • BFS
  • यादृच्छिक
  • ...

सभी रणनीतियों नोड का दौरा करेंगे एक अलग क्रम में है, फिर भी उद्देश्य (प्रत्येक नोड का दौरा) वही होगा। तो अगर आदेश कोई फर्क नहीं पड़ता, तो रणनीति आपकी आवश्यकताओं के अनुरूप है।

0

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

2

"हेड पहले डिजाइन पैटर्न" (see here) पेज 24

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

तो सर आप कम से कम लोग हैं, जो पैटर्न परिभाषित के अनुसार सही हैं,, लेकिन क्या वे जानते हैं।

3

एफडब्ल्यूआईडब्ल्यू, Wikipedia article आपके साथ सहमत है और उसने कभी भी अपनी स्थिति के बारे में नहीं सुना है।

6

तकनीकी रूप से, रणनीतियों जो भी चाहें कर सकते हैं।

यह केवल तब होता है जब "बाहरी संदर्भ" कुछ निश्चित और दोहराने योग्य व्यवहार को निर्देशित करता है जिसे प्रोग्रामेटिकल इंटरफ़ेस में कैद नहीं किया जा सकता है (उन्हें "वांछनीय गुण" कहें), आपको यह ध्यान रखना होगा कि आपकी रणनीतियां वास्तव में प्रतिस्थापन योग्य हैं इन वांछनीय गुणों के संबंध में Liskov।

2

आप हैं। रणनीति का बिंदु एल्गोरिदम को प्रतिस्थापित करना है। चाहे वे वही परिणाम प्रदान करते हैं वांछित व्यवहार का उप-उत्पाद है।

3

पहले दो रणनीतियों हैं। किसी भी इनपुट के लिए बनें वे आपको एक ही जवाब देंगे। आखिरी वाला नहीं है। बस क्योंकि यह आपको एक int देता है यह एक रणनीति नहीं बनाता है। उन्हें एक ही चीज़ "करना" है।

उन्हें एक ही चीज़ करना है, लेकिन इसका मतलब यह नहीं है कि वे एक ही परिणाम देते हैं। गोफ से प्रेरक उदाहरण विभिन्न लेआउट एल्गोरिदम में से एक है, या अलग-अलग रजिस्टर आवंटन एल्गोरिदम है। रणनीतियों का एक ही लक्ष्य है - किसी पृष्ठ पर टेक्स्ट और छवियों के लेआउट ब्लॉक, या हार्डवेयर रजिस्टरों को वर्चुअल रजिस्ट्रार असाइन करना - लेकिन उन्हें बिल्कुल वही परिणाम नहीं बनाना है।

तो यदि आपके उदाहरण में Strategy का लक्ष्य इनपुट के साथ अंकगणित करना है, तो प्रत्येक उदाहरण उस लक्ष्य के लिए एक रणनीति है। यदि लक्ष्य सरणी को समेटना था, तो DoArithmatic को CalculateSum कहा गया होगा, और अंतिम उदाहरण रणनीति के अनुबंध के अनुरूप होने में विफल रहेगा, और इसलिए LSP का उल्लंघन करें।

2

मुझे लगता है कि यह कहना सही होगा कि रणनीतियों को निश्चित रूप से समान होना चाहिए या नहीं, रणनीति पैटर्न की परिभाषा के दायरे से बाहर है।

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

आमतौर पर यह मामला नहीं है। आइए एक ऐसे उदाहरण पर विचार करें जो निर्धारिती समतुल्यता की आवश्यकता होती है: सॉर्टिंग। आप सोच सकते हैं कि यदि दो तुलनात्मक कार्यान्वयन एक ही इनपुट के लिए एक ही परिणाम लौटने में असफल होते हैं तो उनमें से कम से कम एक दोषपूर्ण होना चाहिए, लेकिन यह आवश्यक नहीं है।

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

आप जीतते हैं।

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