2010-04-15 12 views
6

आम तौर पर, एक तरल एपीआई बनाना कुछ ऐसा है जो सभी प्रोग्रामर को खुश करता है; दोनों निर्माता जो इंटरफ़ेस लिखते हैं, और उपभोक्ता जो इसके खिलाफ प्रोग्राम करते हैं। सम्मेलनों से परे देखकर, यह क्यों है कि हम अपने सभी गेटर्स को "गेट" शब्द से उपसर्ग करते हैं। इसे छोड़कर आमतौर पर अधिक तरल पदार्थ, निर्देशों को पढ़ने में आसान होता है, जो अंततः खुशी (हालांकि छोटे या निष्क्रिय) की ओर जाता है। इस बहुत ही सरल उदाहरण पर विचार करें। (छद्म कोड)गेटर्स शब्द "get" के साथ क्यों prefixed हैं?

परम्परागत:

person = new Person("Joey") 
person.getName().toLower().print() 

वैकल्पिक:

person = new Person("Joey") 
person.name().toLower().print() 

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

धन्यवाद।

+4

हम में से कुछ गेटर्स नहीं लिखते हैं या सेटर्स या "तरल एपीआई" में विश्वास करते हैं। –

+1

मैं असहमत हूं कि ' person.name() 'निर्देशों के सेट को पढ़ने के लिए एक अधिक तरल पदार्थ और आसान सेट है, क्योंकि मुझे लगता है कि विधि वास्तव में इस व्यक्ति को नाम, या उपनाम निर्दिष्ट करती है। और ईमानदारी से, अगर आप उस संदर्भ में इसका उपयोग करना चाहते हैं, 'person.name.hhatever' अब जैसा दिखता है और बहुत आसान पढ़ता है,' नाम 'विधि के बजाय एक (पठनीय/असाइन करने योग्य) संपत्ति बन जाता है। –

+2

इसलिए जब आपके पास कोड पूर्ण होने के साथ और आईडीई है, तो आप "प्राप्त करें" टाइप कर सकते हैं और सभी गेटर्स – colinjwebb

उत्तर

10

क्योंकि, गुणों के बिना भाषाओं में, name() एक कार्य है। हालांकि कुछ और जानकारी के बिना, यह आवश्यक नहीं है कि यह क्या कर रहा है (या यह वापस आने वाला है)।

कार्य/विधियों को क्रियाएं भी माना जाता है क्योंकि वे कुछ क्रियाएं कर रहे हैं। name() स्पष्ट रूप से बिल को फिट नहीं करता है क्योंकि यह आपको कुछ भी बताता है कि यह कौन सी कार्रवाई कर रहा है।

getName() आपको बिना किसी संदेह के बताता है कि विधि एक नाम वापस करने जा रही है।

गुणों वाली भाषाओं में, तथ्य यह है कि कोई संपत्ति एक संपत्ति है जो इसे प्राप्त करने या सेट करने के समान अर्थ व्यक्त करती है। यह केवल चीजों को थोड़ा साफ दिखता है।

+0

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

+0

@ जॉय: आपके नामकरण व्यवस्था के साथ समस्या नाम नहीं है लेकिन माता-पिता। माता-पिता एक संपत्ति के मूल्य को वापस करने के बजाय, एक कार्रवाई निष्पादित करने का सुझाव देते हैं। यही कारण है कि 'get' उपसर्ग की आवश्यकता है। –

+0

@robert बहुत मान्य बिंदु। ऐसी परिस्थितियों में जहां ऐसी भाषा में संपत्ति एक्सेसर्स को लागू करने के लिए कोई तंत्र नहीं है, या वास्तविक संपत्ति के कार्यान्वयन में तथ्य बदलने के बाद, नग्न नाम के आसपास के पेयरर्स का उपयोग करना वास्तव में एकमात्र स्थिति है। – Joey

1

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

+2

आपके स्कूल को यह सही नहीं मिला, आईएमओ। –

+1

दूसरी तरफ, मैं आपकी व्यक्तिगत राय स्वीकार करता हूं। –

+0

गेटर्स और सेटर्स के उचित उपयोग के लिए यहां देखें: http://stackoverflow.com/questions/565095/java-are-getters-and-setters-evil –

4

सर्वश्रेष्ठ उत्तर मैं कभी भी प्राप्त/सेट उपसर्गों प्रयोग करने के लिए सुना है इस तरह के रूप में है:

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

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

+1

अच्छा अवलोकन। सेटर्स, मुझे विश्वास है, उपसर्ग के बहुत हद तक योग्यता है, क्योंकि वे किसी प्रकार का राज्य बदलते हैं। यह शून्य राशि वाला गेम नहीं है, "पाने" की बोली लगाने से जरूरी नहीं है कि वह "सेट" की बोली लगाए। क्या होगा यदि केवल सेट का उपयोग किया गया था, और इस प्रकार अधिभार से परहेज किया जा रहा था? – Joey

+0

@ जॉय: यह 'get' और' set' का उपयोग करने से अधिक शोर की तरह लगता है, क्योंकि कोई दूसरे की तरह नहीं दिखता है। और आपको अभी भी एक संपत्ति को पुनर्प्राप्त करने के बजाए निष्पादित करने के लिए कार्रवाई करने का सुझाव देने वाले माता-पिता के साथ समस्या है। –

+0

यदि सम्मेलन यह था कि मेरे नाम पर कोई क्रिया नहीं है, तो मैं इसके साथ ठीक रहेगा। – danben

0

कस्टम।

प्लस, सी ++ में, यदि आप एक संदर्भ वापस करते हैं, जो कक्षा में संभावित सूचना रिसाव प्रदान करता है।

+0

वास्तव में? क्या आपको लगता है कि std :: स्ट्रिंग का ऑपरेटर [] (उदाहरण के लिए) ऐसे रिसाव का कारण बनता है? –

+0

नील: मैं प्रति मतलब स्मृति रिसाव नहीं है। –

+0

मेरा मतलब स्मृति लीक का मतलब या उल्लेख नहीं था - मेरा मतलब था "रिसाव" की अपनी अवधारणा। –

3

उस मामले के बारे में क्या है जहां किसी संपत्ति के नाम पर संपत्ति का नाम दिया गया है?

object.action() 

इस कार्रवाई के प्रकार प्राप्त करता है प्रदर्शन किया जा करने के लिए, या कार्रवाई को अंजाम ... जोड़ना प्राप्त/सेट/करना अस्पष्टता जो हमेशा एक अच्छी बात है ... को हटा

object.getAction() 
object.setAction(action) 
object.doAction() 
+0

प्रतिक्रिया उत्सुकता के लिए धन्यवाद। क्या आप मुझे एक उदाहरण दे सकते हैं जिसमें एक क्रिया के नाम पर नामित संपत्ति को लॉटर के रूप में लॉजिकल रूप से भी इस्तेमाल किया जा सकता है? – Joey

+0

"क्रिया" क्रिया नहीं है इसलिए यह एक बुरा उदाहरण है। आम तौर पर, गुणों को हमेशा संज्ञाओं के नाम पर रखा जाता है, क्रिया नहीं। –

4

मैं हमेशा एक नई एपीआई और उसके दस्तावेज के साथ काम करते समय लगातार get/set उपसर्ग की सराहना करता हूं। गेटर्स और सेटर्स का स्वचालित समूह जब सभी कार्यों को उनके वर्णानुक्रम में सूचीबद्ध किया जाता है, तो सरल डेटा पहुंच और उन्नत functinality के बीच अंतर करने में मदद करता है।

आईडीई के भीतर इंटेलिजेंस/ऑटो पूर्णता का उपयोग करते समय भी यही सच है।

+0

यह एक बहुत अच्छा मुद्दा है, शायद मेरे विचार में सबसे मजबूत। – Joey

0

मैं अधिक उद्देश्य-सी नहीं लिख सकता, लेकिन जब से मैंने इसे सीखा है, तो मैं वास्तव में इसके सम्मेलनों से प्यार करने आया हूं। आप जिस चीज के बारे में पूछ रहे हैं वह addressed भाषा से है।

+1

@jsumners सेब के आस-पास कई मंडल वास्तव में इस सम्मेलन का उपयोग नहीं करते हैं। (* वेबकिट शैली गुडी * के माध्यम से)। "शब्द" सेट "के साथ पूर्व निर्धारित सेटर्स। गेटर्स के लिए नंगे शब्दों का प्रयोग करें। सेटर और गेटर नाम सेट/प्राप्त किए जा रहे चर के नामों से मेल खाना चाहिए"। http://webkit.org/coding/coding-style.html। बेशक कुछ भाषाओं ने इस तरह के सम्मेलनों को त्याग दिया है क्योंकि उनके पास उनके आसपास काम करने के लिए सम्मेलन या भाषा संरचनाएं हैं। लाभ भिन्न हो सकता है। – Joey

+0

ठीक है, मुझे काम पर सी # का उपयोग करना है। सी # गुण हैं, लेकिन वे कष्टप्रद हैं (मूल प्रश्न के रूप में उल्लिखित)। उदाहरण के लिए, इस काम नहीं करेगा:

 public class MyClass { private int _foo; public int foo { get { return this._foo; } set { this._foo = value; } } } 
मुझे लगता है ऑब्जेक्टिव-सी थोड़ा कम इस संबंध में कष्टप्रद है:
 public class MyClass { private int foo; public int foo { get { return this.foo; } set { this.foo = value; } } } 
इसके बजाय, आप क्या करना है। –

+1

बहुत बढ़िया। टिप्पणियाँ मार्कअप का समर्थन नहीं करते हैं। –

1

यहां एक छोटा सा जवाब है जो मुझे सबसे ज्यादा पसंद है। स्मॉलटाक बीटीडब्ल्यू के बारे में कुछ नियमों को जानना है। फ़ील्ड केवल परिभाषित किए गए हैं। अगर आप "एक्सेसर्स" नहीं लिखते हैं तो आप उनके साथ कुछ भी करने में सक्षम नहीं होंगे।

सम्मेलन एक चर (तब का यह instVar1 anme जाने आप एक समारोह instVar1 जो सिर्फ instVar1 और instVar रिटर्न बारे में वहाँ हो रही है:।। जो सेट मूल्य

मैं इस सम्मेलन में ज्यादा कुछ और की तुलना में अधिक पसंद यदि आप एक देखते हैं: कहीं आप शर्त लगा सकते हैं कि यह एक या दूसरे तरीके से कुछ "सेटर" है।

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