उदाहरण के लिए नामकरण सम्मेलनों, स्थानीय और पैरामीटर चर [बंद]


13

मैं हमारी परियोजनाओं (मुख्य रूप से जावा / जेईई परियोजनाओं) पर लागू करने के लिए एक वरिष्ठ डेवलपर कोडिंग सम्मेलनों के साथ चर्चा कर रहा था। मैं उनके द्वारा प्रस्तावित एक सम्मेलन से असहमत था:

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

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

क्या आपके पास कोई राय, तर्क या अध्ययन है जो मेरी बात का समर्थन करता है (या इसका विरोध करता है)?


आप कहते हैं कि आप इस तथ्य पर असहमत हैं कि यह पठनीयता कम कर देता है। मैं यह नहीं कह रहा कि आप गलत हैं, लेकिन आपने उस दावे का समर्थन करने के लिए क्या सबूत दिए? मैं किसी भी शोध से अवगत नहीं हूं जो कहता है कि यह पठनीयता कम कर देगा (मैंने एक डेवलपर बनने से पहले स्नातक स्कूल मनोविज्ञान में संज्ञानात्मक अध्ययन किया, इसलिए यह मेरे लिए रुचि का क्षेत्र है।)
एडमजोनआर

मेरा मतलब था कि यह अव्यवस्थित है। लेकिन मेरे पास मेरी निजी राय के अलावा कोई सबूत नहीं है
HH

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

जवाबों:


15

जैसा कि विकिपीडिया इस विषय पर कहता है - जावा के नामकरण के नियम,

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

कोडिंग मानकों के साथ मेरे अनुभव के अनुसार, इंस्टेंस चर नाम "_" से शुरू होता है, जैसा कि विकिपीडिया मानकों के अनुसार बहुत अच्छा नहीं है।

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

विधियों के बारे में स्वच्छ संहिता विनिर्देश के अनुसार ये कम होने चाहिए जितना कि आप पठनीयता के लिए कर सकते हैं और चर नामों का माइंड मैप नहीं होना चाहिए, उन्हें आपके ऑपरेशन के लिए प्रासंगिक होना चाहिए जो आपका तरीका करता है।

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

public class Part {
private String m_dsc; // The textual description
void setName(String name) {
m_dsc = name;
}
}

public class Part {
String description;
void setDescription(String description) {
this.description = description;
}
}

इसके अलावा, लोग नाम के सार्थक भाग को देखने के लिए उपसर्ग (या प्रत्यय) को अनदेखा करना सीखते हैं। जितना अधिक हम कोड पढ़ते हैं, उतना ही कम हम उपसर्ग देखते हैं। अंततः उपसर्ग अनदेखी अव्यवस्था और पुराने कोड का एक मार्कर बन जाते हैं।


4

यह एक पुराना सवाल है, लेकिन मैं यहाँ वैसे भी पोस्ट करने जा रहा हूँ। मेरे पास कुछ 20+ वर्ष की प्रोग्रामिंग है और अन्य लोगों के कोड के साथ काम कर रहा हूं।

मुझे लगता है कि अपने चर को उनके संकेत के रूप में एक छोटे संकेत के साथ नामित करना वास्तव में अगले व्यक्ति (या अपने आप) के लिए वास्तव में उपयोगी है जो आपके कोड को देखेंगे।

एक पहले से ही सुंदर रंगों के साथ एक आईडीई में कोड को नहीं देखता है (और मुझे याद नहीं है कि रंगों का क्या मतलब है और अलग-अलग आईडीई अलग-अलग रंग दिखाते हैं, आदि)।

यह सच है, विधियाँ पर्याप्त रूप से कम होनी चाहिए, इसलिए यह बहुत सारे वैरिएबल और टन के कोड से भरी हुई नहीं होती है, बल्कि छोटी पर भी - जब आप ऐसे कोड को देखते हैं जो पूरी तरह से अपरिचित है, तो यह बताना कभी-कभी कठिन होता है कि क्या एक वैरिएबल एक वैरिएबल, स्थानीय है चर या विधि पैरामीटर।

एक नज़र में अंतर करने में सक्षम होने के लिए आपके द्वारा अपरिचित कोड की समीक्षा करना बहुत आसान है।

इस उदाहरण को लें:

public <T> Page<T> moreLikeThis(MoreLikeThisQuery query, Class<T> clazz) {
    int startRecord = 0;
    ElasticsearchPersistentEntity persistentEntity = getPersistentEntityFor(clazz);
    String indexName = isNotBlank(query.getIndexName()) ? query.getIndexName() : persistentEntity.getIndexName();
    String type = isNotBlank(query.getType()) ? query.getType() : persistentEntity.getIndexType();

    Assert.notNull(indexName, "No 'indexName' defined for MoreLikeThisQuery");
    Assert.notNull(type, "No 'type' defined for MoreLikeThisQuery");
    Assert.notNull(query.getId(), "No document id defined for MoreLikeThisQuery");

    MoreLikeThisRequestBuilder requestBuilder = client.prepareMoreLikeThis(indexName, type, query.getId());

    if (query.getPageable() != null) {
        startRecord = query.getPageable().getPageNumber() * query.getPageable().getPageSize();
        requestBuilder.setSearchSize(query.getPageable().getPageSize());
    }
    requestBuilder.setSearchFrom(startRecord);

    if (isNotEmpty(query.getSearchIndices())) {
        requestBuilder.setSearchIndices(toArray(query.getSearchIndices()));
    }
    if (isNotEmpty(query.getSearchTypes())) {
        requestBuilder.setSearchTypes(toArray(query.getSearchTypes()));
    }
    if (isNotEmpty(query.getFields())) {
        requestBuilder.setField(toArray(query.getFields()));
    }
    if (isNotBlank(query.getRouting())) {
        requestBuilder.setRouting(query.getRouting());
    }
    if (query.getPercentTermsToMatch() != null) {
        requestBuilder.setPercentTermsToMatch(query.getPercentTermsToMatch());
    }
    if (query.getMinTermFreq() != null) {
        requestBuilder.setMinTermFreq(query.getMinTermFreq());
    }
    if (query.getMaxQueryTerms() != null) {
        requestBuilder.maxQueryTerms(query.getMaxQueryTerms());
    }
    if (isNotEmpty(query.getStopWords())) {
        requestBuilder.setStopWords(toArray(query.getStopWords()));
    }
    if (query.getMinDocFreq() != null) {
        requestBuilder.setMinDocFreq(query.getMinDocFreq());
    }
    if (query.getMaxDocFreq() != null) {
        requestBuilder.setMaxDocFreq(query.getMaxDocFreq());
    }
    if (query.getMinWordLen() != null) {
        requestBuilder.setMinWordLen(query.getMinWordLen());
    }
    if (query.getMaxWordLen() != null) {
        requestBuilder.setMaxWordLen(query.getMaxWordLen());
    }
    if (query.getBoostTerms() != null) {
        requestBuilder.setBoostTerms(query.getBoostTerms());
    }

    SearchResponse response = requestBuilder.execute().actionGet();
    return resultsMapper.mapResults(response, clazz, query.getPageable());
}

अब, अपने आप को समय दें और कोड को देखें (स्प्रिंग-डेटा-इलास्टिक्सखोज परियोजना से एलीस्टेकटाइटप्लेट से निकाले गए - मैं जिस कोड की समीक्षा कर रहा था जिसने मुझे Google पर खोज करने के लिए प्रेरित किया कि लोग नामकरण परंपराओं के बारे में क्या कहते हैं)।

  • का स्कॉड क्या है resultsMapper?
  • है requestBuildingएक पैरामीटर?
  • आदि...

यहाँ मेरा सरल सुझाव है कि चर का नाम कैसे रखा जाना चाहिए:

  • क्लास स्टैटिक विशेषताएँ (अर्थात स्थिरांक): ALL_CAPS_WITH_UNDERSCORES (उदा HOST_NAME)।
  • वर्ग गुण (यानी वर्ग उदाहरण चर): कैमलकेस (जैसे resultsMapper)।
  • विधि पैरामीटर: उपसर्ग के साथ a(जैसे aQuery, aClazz)।
  • स्थानीय चर: उपसर्ग के साथ my(जैसे myIndexName, myType)।

उपरोक्त कोड बन जाता है:

public <T> Page<T> moreLikeThis(MoreLikeThisQuery aQuery, Class<T> aClazz) {
  int myStartRecord = 0;
  ElasticsearchPersistentEntity myPersistentEntity = getPersistentEntityFor(aClazz);
  String myIndexName = isNotBlank(aQuery.getIndexName()) ? aQuery.getIndexName() : myPersistentEntity.getIndexName();
  String myType = isNotBlank(aQuery.getType()) ? aQuery.getType() : myPersistentEntity.getIndexType();

  Assert.notNull(myIndexName, "No 'indexName' defined for MoreLikeThisQuery");
  Assert.notNull(myType, "No 'type' defined for MoreLikeThisQuery");
  Assert.notNull(aQuery.getId(), "No document id defined for MoreLikeThisQuery");

  MoreLikeThisRequestBuilder myRequestBuilder = client.prepareMoreLikeThis(myIndexName, myType, aQuery.getId());

  if (aQuery.getPageable() != null) {
     myStartRecord = aQuery.getPageable().getPageNumber() * aQuery.getPageable().getPageSize();
     myRequestBuilder.setSearchSize(aQuery.getPageable().getPageSize());
  }
  myRequestBuilder.setSearchFrom(myStartRecord);

  if (isNotEmpty(aQuery.getSearchIndices())) {
     myRequestBuilder.setSearchIndices(toArray(aQuery.getSearchIndices()));
  }
  if (isNotEmpty(aQuery.getSearchTypes())) {
     myRequestBuilder.setSearchTypes(toArray(aQuery.getSearchTypes()));
  }
  if (isNotEmpty(aQuery.getFields())) {
     myRequestBuilder.setField(toArray(aQuery.getFields()));
  }
  if (isNotBlank(aQuery.getRouting())) {
     myRequestBuilder.setRouting(aQuery.getRouting());
  }
  if (aQuery.getPercentTermsToMatch() != null) {
     myRequestBuilder.setPercentTermsToMatch(aQuery.getPercentTermsToMatch());
  }
  if (aQuery.getMinTermFreq() != null) {
     myRequestBuilder.setMinTermFreq(aQuery.getMinTermFreq());
  }
  if (aQuery.getMaxQueryTerms() != null) {
     myRequestBuilder.maxQueryTerms(aQuery.getMaxQueryTerms());
  }
  if (isNotEmpty(aQuery.getStopWords())) {
     myRequestBuilder.setStopWords(toArray(aQuery.getStopWords()));
  }
  if (aQuery.getMinDocFreq() != null) {
     myRequestBuilder.setMinDocFreq(aQuery.getMinDocFreq());
  }
  if (aQuery.getMaxDocFreq() != null) {
     myRequestBuilder.setMaxDocFreq(aQuery.getMaxDocFreq());
  }
  if (aQuery.getMinWordLen() != null) {
     myRequestBuilder.setMinWordLen(aQuery.getMinWordLen());
  }
  if (aQuery.getMaxWordLen() != null) {
     myRequestBuilder.setMaxWordLen(aQuery.getMaxWordLen());
  }
  if (aQuery.getBoostTerms() != null) {
     myRequestBuilder.setBoostTerms(aQuery.getBoostTerms());
  }

  SearchResponse myResponse = myRequestBuilder.execute().actionGet();
  return resultsMapper.mapResults(myResponse, aClazz, aQuery.getPageable());

}

क्या यह सही है? मुझे ऐसा नहीं लगता। लेकिन ऊपर, जहां तक ​​चर का संबंध है, अब पढ़ना आसान है। इस तरह के संरेखण और रिक्ति के रूप में अन्य चीजें हैं, जो मुझे इस उत्तर में नहीं मिलेंगी क्योंकि यह प्रश्न से संबंधित नहीं है, जिससे इसे पढ़ने में भी आसानी होगी।

आपको ऊंट केस पसंद नहीं है? ठीक है, अंडरस्कोर आदि का उपयोग करें, लेकिन अपने स्थानीय चरों और अपने मापदंडों को उपसर्ग करें ताकि उन्हें कक्षा के उदाहरण चर से अलग बना सकें।

आपको पसंद नहीं है aऔर my- ठीक है, बस अपनी परियोजना के भीतर बने रहें और कुछ और का उपयोग करें ... लेकिन कुछ का उपयोग करें।

नियम # 1: परियोजना के भीतर स्थिरता।

नियम # 2: पढ़ने में आसान बनाते हैं और इससे पहले कि वह सीख सकें, पाठक को सब कुछ जानने की आवश्यकता नहीं है।


3

यह काफी हद तक प्राथमिकता का विषय है, और जैसे कि कोई 'सही' उत्तर नहीं है। इसलिए, यह प्रश्न वास्तव में बंद हो सकता है। लेकिन ऐसा होने से पहले, मैं आपको बता दूं कि मैं आपसे पूरी तरह सहमत हूं। जहां तक ​​मेरा संबंध है, उपसर्ग दृश्यता कम कर देते हैं। अकेले इस तथ्य को बताएं कि यदि कोई उपसर्ग हैं, तो उन्हें अधिक उपयोगी सामान के लिए उपयोग किया जाना चाहिए, जैसे कि हंगेरियन नोटेशन का मूल इरादा , और उन चीजों के लिए नहीं जो आपकी आईडीई किसी भी तरह से हाइलाइटिंग प्रदान कर सकती हैं।

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

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