किसी वस्तु के निर्माण के लिए विधि का उपयोग करते हुए मुहावरे का क्या नाम है?


21

मैं अक्सर एक पैटर्न का उपयोग करता हूं, जहां मैं किसी ऑब्जेक्ट को सेटअप करने के लिए विधिBuilder या Prototypeपैटर्न के समान , लेकिन मूल ऑब्जेक्ट को संशोधित करने के बजाय प्रत्येक विधि कॉल के साथ नई ऑब्जेक्ट नहीं बना रहा हूं ।

उदाहरण:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

बस सोच रहा था कि क्या इस पैटर्न का कोई नाम है और क्या इसे एक एंटी-पैटर्न माना जाता है, क्योंकि यद्यपि यह अधिक धाराप्रवाह पढ़ सकता है, लेकिन यह लंबी विधि श्रृंखलाओं को जन्म दे सकता है।


3
एक धाराप्रवाह इंटरफ़ेस शैली का मामला है। यदि आप एक एपीआई लिख रहे हैं तो उसे वैकल्पिक रूप प्रदान करें।
Oded

1
अधिक चर्चा के लिए, इस प्रश्न पर एक नज़र डालें: programmers.stackexchange.com/questions/69519/…
Eric King

@Oded इस तरह के एक एपीआई का उपयोग करना संभव है, केवल प्रत्येक कॉल को एक अलग स्टेटमेंट बनाए बिना, या आपके पास विकल्प के लिए कोई अन्य विचार है?
गैरेट हॉल

@GarrettHall - निश्चित रूप से यह संभव है, लेकिन फिर आप menu.withStyle("")बिना संदर्भ के ही चीजों को समाप्त कर देते हैं । ऐसे मामले में आपको दो एपीआई की आवश्यकता होती है ।
ओडेड

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

जवाबों:


37

धाराप्रवाह इंटरफ़ेस

मैंने हमेशा इस विधि को ' धाराप्रवाह इंटरफ़ेस ' कहा जाता है , जैसा कि एरिक इवांस ( डोमेन ड्रिवेन डिज़ाइन फेम) और मार्टिन फॉवलर ( एजाइल मेनिफेस्टो प्रसिद्धि) द्वारा बनाया गया है।

मुख्य कमियां पठनीयता हैं (जो कुछ लोगों को पसंद है और कुछ से नफरत है), और यह तथ्य कि कुछ मामलों में डिबग करना कठिन हो सकता है क्योंकि इसके माध्यम से कदम रखते समय कार्रवाई की पूरी श्रृंखला को एक ही बयान माना जा सकता है।

मैं निश्चित रूप से इसे एक विरोधी पैटर्न नहीं मानता, हालांकि मैंने केवल तकनीक का खुद ही कुछ बार उपयोग किया है।


4
ध्यान दें कि प्रस्तावक इस बात पर ज़ोर देते हैं कि एक धाराप्रवाह इंटरफ़ेस में केवल विधि-निर्धारण की तुलना में बहुत अधिक शामिल है, हालांकि यह अक्सर स्पष्ट नहीं होता है कि उस शब्द का क्या अर्थ है।
किलियन फोथ

क्या पूरी श्रृंखला को एक ही कथन माना जाना आम है? यह मेरे लिए एक खराब डिज़ाइन किए गए डिबगर मुद्दे जैसा लगता है।
ब्लूबेरीफिल्ड

मैं एक ऐसे डिबगर में नहीं आया हूं जो जंजीरों को एक ही कथन के रूप में मानता है, लेकिन यह तब भी दर्द हो सकता है जब आप केवल एक विशेष श्रृंखला में श्रृंखला के अंत की ओर तरीकों में से एक में रुचि रखते हैं।
विघ्नह्रदय

1
मैं C # में काम करता हूं, और .NET डिबगर मुझे अलग-अलग तरीकों से ठीक होने देता है। अन्य भाषाएं, मुझे यकीन नहीं है।
एरिक किंग

1
@KilianFoth जैसा कि सवाल की टिप्पणियों में कहा गया है, एक धाराप्रवाह इंटरफ़ेस में जंजीर विधियों को लगभग एक वाक्य के रूप में पढ़ा जा सकता है। कभी-कभी इसका मतलब यह है कि अलग-अलग तरीकों के अलग-अलग नाम होने चाहिए अन्यथा इसे अच्छा अभ्यास माना जाता है
इजाका

5

श्रृंखला में किसी प्रकार का प्रवाह या खोजशीलता होने पर उस तरह की विधि को आमतौर पर एक धाराप्रवाह इंटरफ़ेस कहा जाता है। वैकल्पिक रूप से, आप jQuery की तरह एक एपीआई के बारे में सोच सकते हैं जो कि 'धाराप्रवाह' के रूप में विधि के आधार पर बहुत निर्भर करता है क्योंकि खोज की क्षमता पर समान जोर नहीं है - यह सुविधा के लिए अधिक है।

अपने उदाहरण के लिए (withx, withy का उपयोग करके) आप इसे बिल्डर पैटर्न का एक प्रकार मान सकते हैं क्योंकि आपको एक विशेष वर्ग मिला है, जिसे कुछ राज्य (विधि कॉल) दिए जाने से पता चलता है कि कैसे ठीक से कॉन्फ़िगर की गई वस्तु वापस करना है।

यदि यह उचित रूप से उपयोग किया जाता है तो यह एक विरोधी पैटर्न नहीं है।


खोजी क्या है? एपीआई के स्वत: पूर्ण के माध्यम से आपके द्वारा आवश्यक तरीकों को खोजने की क्षमता?
जोशियाह योडर

मैं jQuery से परिचित नहीं हूँ। उनकी विधि श्रृंखलाएँ केवल सुविधा के लिए कैसे होती हैं, खोजी नहीं? क्योंकि वहाँ कई तरीके हैं श्रृंखला यह स्वत: पूर्ण के साथ भी भारी है?
जोशिया योडर

3

क्या इसे एक विरोधी पैटर्न माना जाता है,

निश्चित रूप से एक विरोधी पैटर्न नहीं है। jQuery शायद इस का सबसे अच्छी तरह से उपयोग किया जाने वाला कार्यान्वयन है।

क्योंकि यद्यपि यह अधिक धाराप्रवाह पढ़ सकता है, यह लंबी विधि श्रृंखलाओं को जन्म दे सकता है

हाँ, यह हो सकता है, लेकिन विकल्प क्या है? आप लगभग एक सादे अंग्रेजी वाक्य के साथ समाप्त कर सकते हैं, जो उपलब्ध है और उपयुक्त है, जो आपको मार्गदर्शन देता है।


..और आपको 8 के बजाय 1 लाइन में वही मिलता है जो आप चाहते हैं - 10. यदि आप केवल एक लाइनर को एक टर्मिनल में लिख रहे हैं तो अच्छा है। 1 से 10 कमांड को याद करने में आसान। 10. क्योंकि यह धाराप्रवाह है और विधियों में वर्णनात्मक नाम हैं, इसे पढ़ना भी आसान है। Python2 में बहुत अधिक यह अब Python3 / Python4 में नहीं किया जा सकता है।
मैकेंज़्म

-3

इसे "ट्रेन मलबे" पैटर्न कहा जाता है।

(यह एक विरोधी पैटर्न है और क्लीन कोड के खिलाफ है)

"ट्रेन मलबे" पैटर्न कानून के कानून का उल्लंघन करता है ।


3
यह आपके द्वारा लिंक किए गए लेख में, जहां उदाहरण है, की विधि की तरह ही नहीं है a.getB().getC().doSomething()। वह उदाहरण बुरा है क्योंकि "आपकी विधि सीधे अपने स्वयं के क्षेत्रों पर तरीकों को कॉल कर सकती है (लेकिन फ़ील्ड के फ़ील्ड पर नहीं)"। यहां, केवल 1 ऑब्जेक्ट है, जिसे बनाया जा रहा है, और "आप अपने द्वारा बनाए गए खिलौनों के साथ खेल सकते हैं"।
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.