खोज…


परिचय

यह विषय PHP में लागू किए गए प्रसिद्ध डिज़ाइन पैटर्न के उदाहरण प्रदान करता है।

PHP में मेथड चैनिंग

मेथड चेनिंग एक तकनीक है जिसे मार्टिन फाउलर की पुस्तक डोमेन स्पेसिफिक लैंग्वेज में समझाया गया है। विधि जंजीर के रूप में संक्षेप है

संशोधक विधियाँ होस्ट ऑब्जेक्ट को लौटाती हैं, ताकि एक ही अभिव्यक्ति में कई संशोधक लगाए जा सकें

इस गैर-चिनिंग / नियमित रूप से कोड के टुकड़े पर विचार करें (उपरोक्त पुस्तक से PHP में पोर्ट किया गया)

$hardDrive = new HardDrive;
$hardDrive->setCapacity(150);
$hardDrive->external();
$hardDrive->setSpeed(7200);

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

$hardDrive = (new HardDrive)
    ->setCapacity(150)
    ->external()
    ->setSpeed(7200);

काम करने के लिए आपको जो कुछ भी करने की जरूरत है, उसे इस तरीके से return $this है:

class HardDrive {
    protected $isExternal = false;
    protected $capacity = 0;
    protected $speed = 0;

    public function external($isExternal = true) {
        $this->isExternal = $isExternal;        
        return $this; // returns the current class instance to allow method chaining
    }

    public function setCapacity($capacity) {
        $this->capacity = $capacity;        
        return $this; // returns the current class instance to allow method chaining
    }

    public function setSpeed($speed) {
        $this->speed = $speed;        
        return $this; // returns the current class instance to allow method chaining
    }
}

इसका उपयोग कब करना है

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

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

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


अतिरिक्त नोट्स

कमांड क्वेरी पृथक्करण

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

getters

कक्षाओं का उपयोग करते समय, जो विधि-व्यवस्था को लागू करते हैं, गेट्टर के तरीकों को बुलाते समय विशेष ध्यान दें (अर्थात, ऐसी विधियाँ जो $this अलावा कुछ और लौटाती हैं)। चूँकि गेटर्स को $this अलावा किसी अन्य वैल्यू को वापस करना होगा, एक गेट्टर पर एक अतिरिक्त विधि का पीछा करते हुए कॉल को मूल मूल्य पर नहीं, बल्कि प्राप्त मूल्य पर संचालित होता है। जबकि जंजीर पाने वालों के लिए कुछ उपयोग मामले हैं, वे कोड को कम पठनीय बना सकते हैं।

Demeter और परीक्षण पर प्रभाव का कानून

विधि के रूप में ऊपर प्रस्तुत करने से कानून का उल्लंघन नहीं होता है। न ही इसका परीक्षण पर असर पड़ता है। ऐसा इसलिए है क्योंकि हम मेजबान उदाहरण लौटा रहे हैं और कुछ सहयोगी नहीं। यह एक आम गलतफहमी है जो लोगों को महज मेथड चेनिंग फ़्लूएंट इंटरफेसेस और एक्सप्रेशन बिल्डर्स के साथ भ्रमित करती है। यह केवल तभी है जब मेथड चाइनिंग मेजबान ऑब्जेक्ट की तुलना में अन्य वस्तुओं को लौटाता है जो आप लॉ ऑफ डेमेटर का उल्लंघन करते हैं और अपने परीक्षणों में मॉक फेस्ट के साथ समाप्त होते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow