स्टेटिक खराब है, लेकिन फैक्टरी पैटर्न के बारे में क्या?


13

मैं एक TDD प्रोजेक्ट पर हूं, इसलिए मैं उस तरह के विकास से जुड़े अच्छे प्रैटिक्स के लिए जितना संभव हो उतना छड़ी करने की कोशिश करता हूं। उनमें से एक यथासंभव स्थिर और वैश्विक से बच रहा है।

मैं इस समस्या का सामना कर रहा हूं: मेरे पास एक वस्तु "लेख" है, जिसमें "विकल्प" (अतिरिक्त "सूक्ष्म लेख") हो सकते हैं।

मैं यह नहीं पता लगा सकता हूं कि एक अच्छा तरीका कैसे हो सकता है जो काउंटर उत्पादक नहीं होगा या बहुत अधिक प्रश्न उत्पन्न नहीं करेगा क्योंकि मैं ऐसी स्थिति में रहूंगा जहां सब कुछ इतना कम हो जाता है कि मुझे मूल रूप से प्रति ऑब्जेक्ट 1 क्वेरी बनाने की आवश्यकता होगी।

अपने वास्तविक दृष्टिकोण से, मुझे 3 विकल्प दिखाई देते हैं:

1) लेख के अंदर बनाएँ:

class Article
{
    //[...]
    public function getArrOption(){
        //Build an array of Options instance.
        //return an array of Options.
    }
}

प्रो: सीधे आगे

Const: रखरखाव: लेख ऑब्जेक्ट में विकल्प ऑब्जेक्ट के लिए बिल्डिंग लॉजिक होता है। यह शायद कोड दोहराव को जन्म देगा।

2) एक विकल्प का उपयोग करनाफैक्टरी

class Article
{
    //[...]
    public function getArrOption(){
        return OptionFactory::buildFromArticleId($this->getId());
    }
}

प्रो: बिल्डिंग लॉजिक आर्टिकल क्लास से बाहर नहीं है

कॉन्स्ट: मैं "स्टेटिक टू मॉक कठिन है" नियम को तोड़ रहा हूं, जिससे मेरा आर्टिकल क्लास को टेस्ट करना कठिन हो गया है।

3) सभी लॉजिक्स को अलग करें।

//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());

प्रो: अनुच्छेद केवल अपनी जिम्मेदारी को संभालता है, और विकल्पों के लिए अपने "पिता" लिंक की परवाह नहीं करता है। चीजें वास्तव में डिकूप्ड हैं

Const: नियंत्रक के अंदर अधिक कोड की आवश्यकता होगी हर बार मुझे विकल्प तक पहुंचने की आवश्यकता होगी। इसका मतलब है कि मुझे कभी भी किसी वस्तु के अंदर एक फैक्ट्री का उपयोग नहीं करना चाहिए , और वह ध्वनि मेरे लिए एक तरह का है ...

सबसे अच्छा तरीका क्या है? (क्या मुझे कुछ याद आया?) धन्यवाद।

संपादित करें:

यह उल्लेख नहीं करने के लिए कि अगर मैं कारखाने को कक्षा के अंदर नहीं कह सकता, तो मैं यह दावा कर सकता हूँ कि मैं कभी भी आलसी आरंभीकरण पैटर्न का उपयोग नहीं कर सकता ...


मुझे यकीन नहीं है कि यह उचित है, लेकिन मैं PHP में कोडिंग कर रहा हूं, इसलिए "एप्लिकेशन" कम है। अगर यह एक सत्र कुकी में संग्रहीत नहीं है, तो हमें प्रत्येक पृष्ठ के बीच सभी डेटा को पुनः लोड करना होगा। इसका मतलब है कि हम एक आवेदन भाषा की तरह सब कुछ पूर्व-लोड नहीं कर सकते ।
FMaz008

@job: खैर यह इसलिए है क्योंकि एक विधि के अंदर एक स्थिर कॉल , यूनिट परीक्षण के समय प्रतिस्थापित करना असंभव है। लक्ष्य निर्भरता इंजेक्शन का उपयोग करना है। लेकिन एक कारखाना आमतौर पर स्थिर होता है, इसलिए इसे इंजेक्ट नहीं किया जा सकता है।
FMaz008 19

जवाबों:


12
  1. स्टेटिक "बुरा" नहीं है, यह अचूक है। आप अभी भी इसका उपयोग कर सकते हैं जहां मजाक का कोई मतलब नहीं है।

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

  3. आपने निर्माता को आर्टिकल क्लास को ऑब्जेक्टफैक्ट (या रिपॉजिटरी, या जो भी) ऑब्जेक्ट देने की संभावना को नजरअंदाज कर दिया है, जिस पर वह बिल्डफ्रॉमआर्टिकल विधि कह सकता है।

मेरा PHP कठोर है, लेकिन मुझे लगता है कि यह इस तरह दिखता है:

class Article
{
    private $_option_repository;

    public function __construct($option_repository) {
        $_option_repository = $option_repository;
    }

    //[...]

    public function getArrOption(){
        return $_option_repository->buildFromArticleId($this->getId());
    }
}

मुझे लगता है कि यह आपके ऊपर के सभी पेशेवरों को पूरा करता है।


तो कारखाने / रिपोजिटरी / मैपर के उदाहरण होना ठीक है? मुझे एक निर्भरता कंटेनर या कुछ और की आवश्यकता होगी क्योंकि अगर हमें सभी कारखाने / रिपॉजिटरी / मैपर को सभी संभव ऑब्जेक्ट के लिए इंजेक्ट करने की आवश्यकता होती है जिसे किसी ऑब्जेक्ट द्वारा वापस किया जा सकता है, तो यह जल्दी से बहुत कुछ बना देता है। (अनुच्छेद -> OptionGroup -> विकल्प -> अनुच्छेद, आदि)
FMaz008

1
यह ठीक से अधिक है, यह बेहतर है। मैं आमतौर पर बार-बार कोड को हटाने के लिए स्थैतिक उपयोग को आरक्षित करता हूं, जहां यह कई वर्गों में परीक्षण के लिए छोटा है। और हाँ, एक IOC / DI कंटेनर आपके जीवन को बहुत आसान बनाने जा रहा है। एक का उपयोग करें।
पीडीआर

1

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

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

(1) एक उदाहरण चर के उपयोग के साथ वैश्विक की प्रत्येक घटना को बदलें;

(२) उस उदाहरण चर को स्वतः ही वस्तु में इंजेक्ट किया जाए जब वह तुरंत हो।

"सीस: बारीक दानेदार विन्यास के लिए स्थिर तरीकों से जिम्मेदारियों को कम करना"

Wayback मशीन लिंक


3
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.