2008-09-29 6 views
8

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

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

क्या इस अभ्यास के खिलाफ वास्तविक विपक्ष है या क्या यह ऐसा कुछ है जिसके पास पहले "सेक्स अपील" पर्याप्त नहीं है?

उत्तर

0

मार्टिन फाउलर इस विषय को http://www.martinfowler.com/bliki/FluentInterface.html पर 'धाराप्रवाह इंटरफेस' के रूप में चर्चा करता है। एक मुख्य मुद्दा यह है कि धाराप्रवाह इंटरफेस मनुष्यों के लिए डिज़ाइन किए गए हैं, इसलिए वसंत जैसे ढांचे उन्हें समझने में सक्षम नहीं हैं। सरलीकृत रूप से एक धाराप्रवाह इंटरफेस का उपयोग एक अर्थ (पठनीयता) में रखरखाव प्रदान करता है लेकिन दूसरे (लचीलापन) में रखरखाव खो देता है।

1

मुझे वास्तव में इस दृष्टिकोण को भी पसंद है। मैं केवल एक ही नकारात्मक पक्ष के बारे में सोच सकता हूं कि हर बार के अंत में 'इसे वापस करने' के लिए यह थोड़ा अजीब लगता है। JQuery के लिए, उदाहरण के लिए, यह प्लगइन्स को अनुमति देने के लिए थोड़ा अजीब बनाता है, क्योंकि आपको यह कहना है कि "सुनिश्चित करें कि आप अपने रिटर्न को न भूलें !!" लेकिन संकलन समय पर इसे पकड़ने का कोई अच्छा तरीका नहीं है।

+0

यह अच्छा होगा अगर जावा के पास एक प्रज्ञा थी जो 'अगर कोई अन्य वापसी मूल्य निर्दिष्ट नहीं किया गया था तो इसे वापस कर दें'? या अधिक एक संकलक चेतावनी की संभावना है। –

1

एकमात्र कॉन आप रिटर्न प्रकार को खो देते हैं, इसलिए चेनिंग उन परिचालनों के लिए अच्छा है जो चीजें करते हैं, लेकिन चीजों की गणना करने वाले संचालन के लिए अच्छा नहीं है।

एक और मुद्दा यह है कि कंपाइलर को चेन करने के साथ आसानी से इनलाइनिंग के लिए मामूली फ़ंक्शन कॉल निर्धारित नहीं किया जा सकता है। लेकिन जैसा कि मैंने कहा था कि यदि आपकी चेनिंग संचालन करती है, और गणना नहीं करती है, तो इसकी संभावना है कि संकलक किसी भी तरह से कुछ भी नहीं बदलेगा।

0

जावास्क्रिप्ट प्रथम श्रेणी के नागरिकों के रूप में कार्यों के साथ एक कार्यात्मक भाषा (अधिक या कम) है।
ऑब्जेक्ट्स के तरीकों को जोड़ना/निकालना, पैरामीटर के रूप में कार्य गुजरना, यह सब इस भाषा के लिए स्वाभाविक है।

दूसरी तरफ, जावा सख्ती से ओओ है, एक वर्ग कक्षा के बाहर मौजूद नहीं हो सकता है। विरासत, संरचना और इंटरफेस का उपयोग इस भाषा के लिए एक और प्राकृतिक तरीका है।

+0

और? ओओ/कार्यात्मक अवधारणा और विधि कॉल लिखने के तरीके के बीच संबंध क्या है? क्या प्रतिमान वास्तव में x = a.b() के बजाय a.b()। C() का उपयोग करने पर प्रभाव डालता है; x.c()? मुझे ऐसा नहीं लगता। – gizmo

+0

ओह, क्षमा करें, गलत उदाहरण। मैं एबी लिखना चाहता था(); ए.c() बेशक। – gizmo

+0

आह, मैं एक समारोह को ओवरराइड करने की भावना में चेन करने के बावजूद, फिर पुराने कार्य को नए के अंत में बुला रहा हूं, जैसे घटनाओं को बुलबुला करना। आपके जैसे चेनिंग जावा में वास्तव में संभव है (और काफी आम), जब तक कि कार्य उचित वस्तु को वापस कर लेते हैं। – PhiLho

3

आईएमओ डीबग करने के लिए दर्दनाक है क्योंकि आपके पास निरीक्षण के लिए कोई मध्यस्थ चर नहीं है।

+0

जहां तक ​​मुझे पता है, सभी वास्तविक आईडीई श्रृंखलाबद्ध विधि के डीबगिंग को आसान बनाने के साथ-साथ पैरामीटर के रूप में उपयोग की जाने वाली विधि कॉल को आसान बनाने के लिए चरण-दर-चरण-चरण सुविधाएं प्रदान करती हैं। – gizmo

0

हमारे डिजाइन टूलबैग में चेन करने योग्य विधियां एक और बेहतरीन टूल हैं। बस सुनिश्चित करें कि आप आम तौर पर नहीं चलते हैं "मेरे पास हथौड़ा है, इसलिए हर समस्या एक नाखून है" डिज़ाइन गड़बड़।

प्रत्येक डिजाइन समस्या को श्रृंखला योग्य तरीकों से हल नहीं किया जाता है। कभी-कभी यह एक इंटरफ़ेस का उपयोग करना आसान बनाता है (यानी आपके द्वारा वर्णित संग्रह समस्या)। कभी-कभी ऐसा नहीं होता है। चाल यह पता लगा रही है कि कौन सा मामला लागू होता है।

2

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

+0

सी ++ में इसे आम तौर पर सीआरटीपी के साथ हल किया जाता है: http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern –

+0

सच है, दुर्भाग्यवश, .NET जेनेरिक एक सामान्य वर्ग के लिए बेस क्लास स्पेक में टेम्पलेट पैरामीटर का उपयोग करने की अनुमति नहीं देते हैं। एरिक लिपर्ट के पास उनके ब्लॉग (http://blogs.msdn.com/ericlipper) पर एक अच्छा स्पष्टीकरण है, यह प्रतिबंध जेनिक्स के .NET कार्यान्वयन में अपरिहार्य क्यों है। – LBushkin

+0

यदि सी # कभी भी कॉन्वेंट रिटर्न प्रकारों का समर्थन करता है तो यह एक समस्या से कम हो सकता है। इस बीच, आप मूल विधियों को छिपाने के लिए नए कीवर्ड का उपयोग कर सकते हैं और उन संस्करणों के साथ प्रतिस्थापित कर सकते हैं जो उपयुक्त रिटर्न प्रकार का उपयोग करते हैं। मैं डुप्लिकेटिंग कोड से बचने के लिए इन मामलों में बेस क्लास को कॉल करने का सुझाव दूंगा। – LBushkin

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