गेटएटर और सेटर को मिलाना


16

जावास्क्रिप्ट लाइब्रेरी जैसे कि jQuery, उदाहरण के लिए प्रोग्रामिंग इंटरफेस में 'गेटर्स' और 'सेटर' को मिलाएं:

 $('element').css({'color','blue'});

रंग सेट या

 $('element').css();

एक तत्व के लिए सीएसएस मिलेगा।

क्या इस तरह के पैटर्न के लिए एक नाम है और क्या यह अनुप्रयोगों में उपयोग करने के लिए एक अच्छा अभ्यास है?

जवाबों:


12

मार्टिन फाउलर ने हाल ही में इस लेख में इसे ओवरलोडेड गटर और सेटर का नाम दिया है :

मैं हाल ही में जावास्क्रिप्ट में चारों ओर प्रहार कर रहा हूं और एक चीज जो मुझे लगी है वह है एक गटर और एक सेटर के लिए एक ही फ़ंक्शन नाम का उपयोग करने की आदत। इसलिए यदि आप jQuery में अपने बैनर की ऊंचाई का पता लगाना चाहते हैं तो आप उपयोग करेंगे $("#banner").height()और यदि आप जिस ऊंचाई का उपयोग करना चाहते हैं उसे बदलना चाहते हैं $("#banner").height(100)

यह सम्मेलन मेरे लिए परिचित है, क्योंकि इसका उपयोग स्मॉलटाक द्वारा किया गया था। आपको banner heightइसके साथ एक मान मिल सकता है और इसे बदल सकते हैं banner height: 100। यह जानते हुए कि यह एक छोटा-सा सम्मेलन था, जो मुझे पसंद करने के लिए मुझसे अपेक्षा करता है, क्योंकि मेरे पास उस भाषा के लिए एक दूर लेकिन घृणास्पद प्रेम है। लेकिन यहां तक ​​कि सबसे अच्छी चीजों में भी खामियां हैं, और मैं इस कोडिंग शैली के लिए अपनी नापसंद छिपा नहीं सकता ...

इस प्राथमिकता के बावजूद, आपको उस भाषा के सम्मेलनों का पालन करना होगा, जिसके साथ आप काम कर रहे हैं। अगर मैं स्मॉलटॉक फिर से लिख रहा था तो मैं अभी भी height:100भाषा के सम्मेलनों के साथ निरंतरता बनाए रखूंगा। जावास्क्रिप्ट, हालांकि, मजबूत सम्मेलनों होने के लिए नोट नहीं किया गया है, इसलिए यहां मैं इस सम्मेलन से बचना पसंद करूंगा, भले ही इसका उपयोग jQuery के लिए किया जाए ...


1
जबकि मैं आमतौर पर फाउलर के अधिकांश बातों से सहमत हूं, मैं इसके लिए उसकी नापसंदगी से असहमत हूं। उनका तर्क है कि जावास्क्रिप्ट में स्मॉलटाक जैसे मजबूत सम्मेलन नहीं हैं, जो इसे वहां उपयोग करने योग्य बनाता है। हालांकि, jQuery के मजबूत सम्मेलन हैं, और जावास्क्रिप्ट jQuery नहीं है। jQuery एक ढांचा है।
कैफ़ीक गीक 21'11

@, मुझे आपके उस पढ़ने से असहमत होना है। उनका तर्क है कि इसमें गवाह और निरंतरता का अभाव है। वह कहता है कि वह इसका इस्तेमाल स्मॉलटाक में कर रहा है क्योंकि अन्य उसकी चिंताओं से मेल खाते हैं। वह यह तर्क नहीं दे रहा है कि स्मॉलटाक के सम्मेलन किसी तरह समस्या को कम करते हैं या समाप्त करते हैं।
विंस्टन एवर्ट

2

इसे OO भाषाओं में "मेथड ओवरलोडिंग" या गैर-OO भाषाओं में "फ़ंक्शन ओवरलोडिंग" कहा जाता है।

अच्छी प्रैक्टिस हो या न हो, लगभग उतनी ही बहस का विषय है जितना गेटर्स / सेटर बनाम पब्लिक मेंबर्स। समर्थक और चोर पक्ष के लोग संभवतः उन भाषाओं पर अपने दाँत काटते हैं जिनकी यह सुविधा थी या नहीं और उनके तरीकों से सेट की गई हैं। मैं इसका उपयोग करता हूं और कई कारणों से अभ्यास पसंद करता हूं:

  • जिस संदर्भ में यह बहुत अच्छी तरह से उपयोग किया जाता है वह एक को दूसरे से अलग करता है।
  • प्रस्तुत करने getया setविधि के नाम में वर्बोसिटी कहते हैं।
  • यदि अनेक हैं getters (जैसे, के लिए एक intऔर के लिए एक double), एक काम (की एलएचएस में प्रकार बदलने int x = foo.bar()बनाम double x = foo.bar()) एक कोड परिवर्तन (की आवश्यकता नहीं है barAsInteger()बनाम barAsDouble()दाईं ओर) यदि वर्ग दोनों प्रदान करता है। इसका नकारात्मक पक्ष यह है कि कभी-कभी यह जानना मुश्किल हो जाता है कि कोड को देखकर वास्तव में किस विधि को बुलाया जा रहा है।

इसे C ++ में "फ़ंक्शन ओवरलोडिंग" भी कहा जाता है।
डेडएमजी सेप

दोनों शर्तें C ++ पर लागू होती हैं क्योंकि इसमें दोनों तरीके और नंगे-नग्न कार्य हैं।
ब्लरएफल

1

चूंकि जावास्क्रिप्ट में वास्तविक गुण नहीं हैं (जहां मान सेट करना वास्तव में कोड निष्पादित कर सकता है), संरक्षक वह है जो संपत्ति मुहावरे को लागू करता है। (भले ही आप इसे कुछ और कहें।)

इसलिए, वास्तविक गुणों को लागू करने वाली भाषाओं में, आप इसके बजाय ऐसा करेंगे:

element.css = ...
x = element.css

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


"जहां मान सेट करना वास्तव में कोड निष्पादित कर सकता है"। यह वास्तव में अब सच नहीं है। ईसीएमए 5 के बाद से यह कल्पना का हिस्सा है
डेमियन ब्रेख्त

@ डेमियन: लेकिन, JQuery उन ब्राउज़र में काम करता है जो ECMA 5 को लागू नहीं करते हैं
जॉन फिशर

मैंने क्रॉस-ब्राउज़र संगतता के बारे में कुछ भी उल्लेख नहीं किया है, बस बोली गलत है जैसा लिखा है।
डेमियन ब्रेख्त

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

1

मैं एक साधारण कारण के लिए पूरी तरह से इसके खिलाफ हूं: ए क्लास, मेथड या फंक्शन को सिर्फ एक काम करना चाहिए - मेरी राय में, getterऔर setterमेथड का संयोजन और उस नियम को भंग कर देगा। जैसा कि परिणाम है:

  1. returnफ़ंक्शन का मान भिन्नता के आधार पर भिन्न होता है यदि गेट्टर या सेटर ब्लॉक निष्पादित होता है। यह एक बस एक स्थिरता दुःस्वप्न में आप का नेतृत्व कर सकते हैं। आपकी विधि को किसी भी मामले में केवल एक प्रकार का डेटा / ऑब्जेक्ट वापस करना चाहिए - या वापसी null, falseया exceptionत्रुटि के मामले में फेंकना चाहिए ।
  2. यूनिट टेस्ट लिखना कठिन होगा क्योंकि फ़ंक्शन दो पूरी तरह से अलग कार्यक्षमता के लिए जिम्मेदार है।
  3. इस तरह की विधि या कार्य के लिए दस्तावेज लिखना स्पष्ट कारणों से कठिन है।
  4. यह लगातार जब कई नहीं होगा गेटर तरीकों की जरूरत - पहले से ही में उल्लेख किया है के रूप में Blrflइस सवाल का जवाब।

0

मुझे लगता है कि आप ढूंढ रहे हैं properties


यह C # में प्रदान की गई कार्यक्षमता के लिए नाम है (और शायद अन्य .NET भाषाओं में?) जो इस के समान है, लेकिन यह वास्तव में एक ही बात नहीं है।
थॉमस ओवेन्स

विकिपीडिया इससे सहमत है: en.wikipedia.org/wiki/Property_(programming)
thekip

धन्यवाद, नहीं वास्तव में आप एक मामले कहते हैं जहाँ आप निर्धारित किया है या एक आवेदन में एक व्यक्तियों वेतन मिल सकता है person.salary('10000')या person.salary()या इसी तरह की।
यानिस

1
मैं नहीं देखता कि कैसे। "गुणों को फ़ील्ड की तरह पढ़ा और लिखा जाता है", जो मूल पोस्ट में उदाहरण में सच नहीं है। वहां, स्पष्ट विधि कॉल की जाती है। यह बहुत समान है, लेकिन बिल्कुल समान नहीं है।
थॉमस ओवेन्स

1
@yannis यह सही नहीं है। गुणों के लिए जावास्क्रिप्ट में एक सिंटैक्स है, और यह वह नहीं है जो आपने मूल प्रश्न में वर्णित किया था। जावास्क्रिप्ट में गुणों को लागू करने और उपयोग करने के लिए en.wikipedia.org/wiki/Property_(programming)#JavaScript देखें ।
थॉमस ओवेन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.