रणनीति पैटर्न में संदर्भ वर्ग


10

मैं रणनीति पैटर्न को समझने की कोशिश कर रहा हूं और खुद से पूछ रहा हूं: क्या संदर्भ वर्ग में पैटर्न के उद्देश्य से समझौता किए बिना इसे छोड़ना चाहिए या मैं इसे छोड़ सकता हूं?

मैं इस धारणा के तहत था कि मुझे विभिन्न प्रकार की फ़ाइलों को पढ़ने के लिए किसी प्रकार के स्विच की आवश्यकता है, लेकिन केवल कुछ हैक करना नहीं चाहता था और बाद में रिफैक्टरिंग के साथ सौदा करना चाहता था (हालांकि, निश्चित रूप से यह हमेशा होता है कि कोड को फिर से सक्रिय किया जा सकता है लेकिन विचार था: प्रयास करें पहले से डिज़ाइन में जितना संभव हो उतना स्मार्ट ...):

यहां छवि विवरण दर्ज करें

विकिमीडिया से ली गई छवि

क्या क्लाइंट सीधे स्ट्रैटेजी इंटरफेस में आ सकता है या क्या ऐसा कुछ है जिसे मैं सिर्फ संदर्भ वर्ग के बारे में समझने में चूक गया हूं?

interface Reader {
    // read information from file and fill data list field of Client
    readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}

class Client{
    // strategic choice
    Reader r;

    // data list field
    List<Data> data;

    // Client Constructor
    public Client(){
        if(<file ends in .xls>)
            r = new ExcelReader();
        else
            r = new PdfReader();
        r.readFile();
    }
}

तो, ऊपर दर्शाया गया संदर्भ वर्ग गायब है। क्या कोड रणनीति पैटर्न का पालन करता है?


1
एक और दिलचस्प / महत्वपूर्ण बिंदु के रूप में मैं आपके ध्यान में लाना चाहूंगा कि कार्यात्मक भाषाओं में टाइप कक्षाओं की अवधारणा "बस" प्रकार के साथ रणनीति पैटर्न है । en.wikipedia.org/wiki/Kind_(type_theory )। दोनों ही तदर्थ बहुरूपता के लिए एक कार्यान्वयन तंत्र है।
एंड्रियाशेचेर्ट

क्या यह (8 या उससे कम) जावा 8 प्रोजेक्ट लैंबडा से संबंधित है? विकिपीडिया लेख मेरे लिए केवल एक बार में समझने के लिए बहुत घना है, लेकिन अगर ये जावा (या सामान्य रूप से प्रोग्रामिंग) की आगामी सुविधाओं का उपयोग करने के लिए कुशलता से सैद्धांतिक पृष्ठभूमि का हिस्सा हैं, तो मैं खुशी से इसमें और समय लगाऊंगा।
पैनी

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

जवाबों:


13

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

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


5

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

हालांकि यह भी तर्क दिया जा सकता है कि setStrategyयह निजी है और मेरा इंजेक्शन केवल दिखाए गए पैटर्न का उपयोग कर रहा है।


क्या इसका मतलब यह है कि प्रतिरूप वर्ग को प्रतिरूपित किए बिना छोड़ा जा सकता है? या एक और तरीका है, क्या यह ठीक है जब मेरे ग्राहक वर्ग को संदर्भित संदर्भ वर्ग है?
पैनी

6
@ पैननी - मैं प्रश्न का उत्तर देने में संकोच करता हूं क्योंकि यह इंगित करता है कि आप उत्तर के बिंदु से चूक गए हैं, और वास्तव में पूरी तरह से पैटर्न। रणनीति पैटर्न आपको एक इंटरफ़ेस के पीछे विभिन्न कंक्रीट कार्यान्वयन की आपूर्ति करके व्यवहार को अलग करने की अनुमति देता है। यह एक अवधारणा है , सूत्र नहीं ।
तेलस्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.