जावा के लिए जेनेरिक प्रकार पैरामीटर नामकरण सम्मेलन (कई वर्णों के साथ)?


125

कुछ इंटरफेस में मैंने लिखा था कि मैं कोड को अधिक पठनीय बनाने के लिए एक से अधिक वर्णों के साथ सामान्य प्रकार के मापदंडों का नाम देना चाहूंगा।

कुछ इस तरह....

Map<Key,Value>

इसके अलावा...

Map<K,V>

लेकिन जब तरीकों की बात आती है, तो टाइप-पैरामीटर्स जावा-क्लास की तरह दिखते हैं जो भ्रामक भी है।

public void put(Key key, Value value)

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

जिन विकल्पों का मैंने अनुमान लगाया या पाया ...

Map<KEY,VALUE>
Map<TKey,TValue>

9
आप एक नया सम्मेलन क्यों बनाना चाहते हैं?
अमीर अफगानी

13
@AmirAfagani प्रश्न से: कोड को अधिक पठनीय बनाने के लिए।
शांतिबेलर्स

तकनीकी रूप से, IDE में जेनरिक के विभिन्न ह्यू को एक अच्छा पर्याप्त संकेतक के रूप में काम करना चाहिए
Sudix

जवाबों:


182

ओरेकल जावा ट्यूटोरियल> जेनेरिक> जेनेरिक प्रकारों में निम्नलिखित की सिफारिश करता है :

टाइप करें पैरामीटर नामकरण परंपराएँ

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

सबसे अधिक इस्तेमाल किया जाने वाला टाइप पैरामीटर नाम हैं:

  • ई - तत्व (बड़े पैमाने पर जावा कलेक्शंस फ्रेमवर्क द्वारा उपयोग किया जाता है)
  • के - कुंजी
  • एन - नंबर
  • टी - प्रकार
  • वि - मान
  • एस, यू, वी आदि - 2, 3, 4 प्रकार

आप इन नामों को जावा एसई एपीआई और इस पाठ के बाकी हिस्सों में उपयोग करते देखेंगे।

मैं इसे डेवलपर्स और संभावित रखवालों के बीच भ्रम से बचने के लिए चिपका सकता हूं।


14
नया स्ट्रीम फ्रेमवर्क Rपरिणाम और Aसंचायक के लिए भी उपयोग करता है ।
वांडले

32
Blech, एकल-अक्षर नामकरण। मैं इस सम्मेलन का अनुसरण करता हूं क्योंकि सम्मेलन वर्णनात्मक नामों से अधिक मायने रखता है, लेकिन यह दुख की बात है कि यह सबसे अच्छा है जो वे साथ आ सकते हैं।
वारबेक

4
@warbaker: मुझे वास्तविक कक्षाओं से पैरामीटराइज़्ड प्रकारों को अलग करने का यह एक अच्छा तरीका लगता है। अन्यथा आप यह कैसे बताएंगे कि उदाहरण Elementके List<Element>लिए कोई पैरामीटर प्रकार या वर्ग है?
BalusC

1
यह BiFunction<T, U, R>इस सम्मेलन का अनुसरण नहीं करता है । अगर ऐसा होता, तो यह होता BiFunction<T, S, R>
माइकेलवेल्डेन

4
वास्तविक वर्गों से पैरामीटराइज्ड प्रकारों को अलग करने की चिंता क्यों? वे कर रहे हैं वर्गों। इससे कोई फर्क नहीं पड़ता कि आपको फ़ाइल में कहीं स्क्रॉल करना है ताकि यह पता लगाया जा सके कि वे किस रूप में परिभाषित हैं। और यह एक आयात या एक पैरामीटर प्रकार होगा।
वेक्टरजोन

47

संलग्न Type

एक अच्छी चर्चा DZone पृष्ठ पर टिप्पणियों में पाई जा सकती है, नामकरण परंपराओं के लिए नामकरण प्रकार

इरविन मुलर की टिप्पणी देखें। उनका सुझाव मेरे लिए एकदम स्पष्ट अर्थ है: शब्द को जोड़ोType

एक सेब को एक सेब, एक कार को एक कार कहें। प्रश्न का नाम डेटा प्रकार का नाम है, है ना? ( OOP में , एक वर्ग अनिवार्य रूप से एक नए डेटा प्रकार को परिभाषित करता है।) इसलिए इसे "टाइप" कहें।

मूल पोस्ट के लेख से लिया गया मुलर का उदाहरण:

public interface ResourceAccessor < ResourceType , ArgumentType , ResultType > {
    public ResultType run ( ResourceType resource , ArgumentType argument );
}

संलग्न T

एक डुप्लिकेट प्रश्न एंडी थॉमस द्वारा यह उत्तर प्रदान करता है । Google की शैली मार्गदर्शिका के अंश पर ध्यान दें जो एक बहु-अक्षर प्रकार के नाम का सुझाव देता है, जो एक एकल अपरकेस में समाप्त होना चाहिए T


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

16

एकल पत्र का उपयोग करने वाले आधिकारिक नामकरण सम्मेलन में देरी का कारण निम्नलिखित है:

इस सम्मेलन के बिना, एक प्रकार के चर और एक साधारण वर्ग या इंटरफ़ेस नाम के बीच अंतर बताना मुश्किल होगा।

मुझे लगता है कि आधुनिक आईडीई इस कारण से अब मान्य नहीं है। इंटेलीज आइडिया नियमित कक्षाओं की तुलना में विभिन्न रंगों के साथ सामान्य प्रकार के मापदंडों को दर्शाता है।

IntelliJ Idea 2016.1 में प्रदर्शित जेनेरिक प्रकार के साथ कोड IntelliJ Idea 2016.1 में प्रदर्शित जेनेरिक प्रकार के साथ कोड

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

नोट: जैसा कि मैं एक्लिप्स या नेटबीन्स का उपयोगकर्ता नहीं हूं, मुझे नहीं पता कि वे सिमिलियर सुविधा प्रदान करते हैं या नहीं।


मैं उन उपकरणों की अनुमानित क्षमताओं के आधार पर कन्वेंशनों का नामकरण नहीं करूंगा, जो प्रत्येक व्यक्ति कभी भी उसी फ़ाइल को पढ़ / संशोधित करता है। मैं व्यक्तिगत रूप से अपने कोडिंग (उदात्त पाठ) के लिए एक पाठ संपादक का उपयोग करना पसंद करता हूं जो आईडीई नहीं है। टेक्स्ट एडिटर आमतौर पर आजकल सिंटेक्स कलरिंग करते हैं, लेकिन अंतर्निहित कोड संरचना की गहरी समझ नहीं है, जो मुझे लगता है कि रंग प्रकार के चर नामों को सही ढंग से करने की आवश्यकता होगी। और इस तर्क को रंग के आधार पर खराब रंग दृष्टि वाले लोगों के लिए स्वाभाविक रूप से अनन्य माना जाता है (मैं लाल-हरे रंग के अंधेपन के साथ पुरुषों के 8% का हिस्सा हूं)
joonas.fi

1
खराब रंग दृष्टि वाले लोगों के संबंध में अच्छी बात है। आईडीई का उपयोग नहीं करने के बारे में - यदि लोग सरल पाठ संपादकों का उपयोग करना पसंद करते हैं, तो यह ठीक है, लेकिन वे स्वेच्छा से अधिक हल्के उपकरण के पक्ष में आईडीई की पेशकश करते हैं। यह उन सुविधाओं में से एक हो सकता है जो गायब हैं। अंत में, हालांकि, यदि एक वर्णनात्मक नाम का उपयोग एक अक्षर के बजाय किया जाता है, तो आपको आईडीई के बिना और रंग कोडिंग के बिना नाम के आधार पर अर्थ बताने में सक्षम होना चाहिए। कलर कोडिंग इसे और तेज़ बनाता है।
वोजटेक रूजिका

16

हां, आप प्रकार चर के लिए बहु-चरित्र नामों का उपयोग कर सकते हैं, जब तक कि वे स्पष्ट रूप से वर्ग नामों से अलग हैं।

यह 2004 में जेनरिक की शुरुआत के साथ सूर्य द्वारा सुझाए गए सम्मेलन से अलग है। हालांकि:

  • एक से अधिक सम्मेलन मौजूद हैं।
  • मल्टी-कैरेक्टर नाम अन्य जावा शैलियों के अनुरूप हैं, जैसे कि जावा के लिए Google की शैली
  • पठनीय नाम (आश्चर्य!) अधिक पठनीय हैं।

पठनीयता

कुछ इंटरफेस में मैंने लिखा था कि मैं कोड को अधिक पठनीय बनाने के लिए एक से अधिक वर्णों के साथ सामान्य प्रकार के पैरामीटर का नाम देना चाहूंगा।

पठनीयता अच्छी है।

की तुलना करें:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

सेवा:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

या, Google के बहु-चरित्र सम्मेलन के साथ:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

Google शैली

गूगल जावा स्टाइल गाइड की अनुमति देता है एक अक्षर का नाम और बहु चरित्र वर्ग की तरह टी में समाप्त होने वाले नामों दोनों

5.2.8 चर नाम टाइप करें

प्रत्येक प्रकार के चर को दो शैलियों में से एक में नाम दिया गया है:

  • एक एकल बड़े अक्षर, वैकल्पिक रूप से एक भी अंक के बाद (जैसे E, T, X, T2)

  • कक्षाओं के लिए इस्तेमाल किया रूप में एक नाम (धारा 5.2.2, देखना क्लास के नाम ), बड़े अक्षर टी (: उदाहरण के द्वारा पीछा किया RequestT, FooBarT)।

मुद्दे

"इस सम्मेलन के बिना, एक प्रकार के चर और एक साधारण वर्ग या इंटरफ़ेस नाम के बीच अंतर बताना मुश्किल होगा।" - ओरेकल ट्यूटोरियल से, "सामान्य प्रकार"

एकल-वर्ण नाम वर्ग के नामों से प्रकार के मापदंडों को अलग करने का एकमात्र तरीका नहीं है, जैसा कि हमने ऊपर देखा है।

सिर्फ जावाडॉक में टाइप पैरामीटर अर्थ का दस्तावेज क्यों नहीं है?

यह सच है कि @paramJavaDoc तत्व एक लंबा विवरण प्रदान कर सकते हैं। लेकिन यह भी सच है कि JavaDocs जरूरी नहीं है। (उदाहरण के लिए, एक्लिप्स में एक कंटेंट असिस्ट है जो टाइप पैरामीटर नाम दिखाता है।)

बहु-चरित्र प्रकार पैरामीटर नाम Oracle सम्मेलन का पालन नहीं करते हैं!

जावा प्रोग्रामिंग में सन के कई मूल सम्मेलनों का सार्वभौमिक रूप से अनुसरण किया जाता है।

हालांकि, यह विशेष सम्मेलन नहीं है।

प्रतिस्पर्धी सम्मेलनों में सबसे अच्छा विकल्प राय का विषय है। इस मामले में ओरेकल के अलावा एक सम्मेलन को चुनने के परिणाम मामूली हैं। आप और आपकी टीम एक सम्मेलन चुन सकती है जो आपकी आवश्यकताओं को पूरा करता है।


15

आप कम से कम अपने सामान्य वर्ग के उपयोगकर्ताओं को एक सुराग देने के लिए javadoc का उपयोग कर सकते हैं। मुझे अभी भी यह पसंद नहीं है (मैं @ chaper29 से सहमत हूं) लेकिन डॉक्स मदद करते हैं।

जैसे,

/**
 * 
 * @param <R> - row
 * @param <C> - column
 * @param <E> - cell element
 */
public class GenericTable<R, C, E> {

}

दूसरी बात जो मैं करने के लिए जाना जाता हूं वह सम्मेलन को तोड़ने वाले एक वर्ग को फिर से भरने के लिए मेरी आईडीई का उपयोग करना है। फिर कोड और रिफ्लेक्टर पर एकल अक्षरों पर वापस काम करें। वैसे भी अगर कई प्रकार के मापदंडों का उपयोग किया जाता है तो यह मेरे लिए आसान बनाता है।


1
मैं कहता हूँ कि टाइप पैरामीटर के लिए Javadoc टिप्पणियाँ आमतौर पर एक चाहिए।
मिगू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.