উদাহরণস্বরূপ নামকরণের সম্মেলনগুলি, স্থানীয় এবং পরামিতি ভেরিয়েবলগুলি [বন্ধ]


13

আমি আমাদের প্রকল্পগুলিতে প্রয়োগ করার জন্য একটি প্রবীণ বিকাশকারী কোডিং কনভেনশনগুলির সাথে আলোচনা করছিলাম (প্রধানত জাভা / জেইই প্রকল্পসমূহ)। তিনি প্রস্তাবিত একটি সম্মেলনের সাথে আমি একমত নই:

ইনস্ট্যান্স ভেরিয়েবলের নামগুলি "_" দিয়ে শুরু করা উচিত, "লোক" দিয়ে স্থানীয় ভেরিয়েবল এবং "পার" দিয়ে পদ্ধতি পরামিতিগুলি ব্যবহার করা উচিত, সুতরাং ভেরিয়েবলের উত্স এবং সুযোগটি সনাক্ত করা সহজ হবে।

তিনি স্বল্প-মেয়াদী স্মৃতি এবং পাঠযোগ্যতার পক্ষে যুক্তি রেখেছিলেন, আমি এটির পরিবর্তে পঠনযোগ্যতা হ্রাস করার বিষয়ে একমত নই, এক্লিপস ফর্ম্যাট ভেরিয়েবলের মতো আইডিই তাদের ধরণের উপর নির্ভর করে আলাদা করে দেয় এবং এই সমস্যাটি একটি ভাল শ্রেণি এবং পদ্ধতির নকশায় এড়ানো হবে avoided

আপনার কোন মতামত, যুক্তি বা অধ্যয়ন যা আমার বক্তব্য সমর্থন করে (বা এর বিরোধিতা করে)?


আপনি বলেছিলেন যে "এটি বরং পাঠযোগ্যতা হ্রাস করে" এই বিষয়ে আপনি একমত নন। আমি বলছি না আপনি ভুল, কিন্তু এই দাবিটি সমর্থন করার জন্য আপনি কোন প্রমাণ সরবরাহ করেছিলেন? আমি এমন কোনও গবেষণা সম্পর্কে অবগত নই যা বলছে এটি পাঠযোগ্যতা হ্রাস করবে (আমি বিকাশকারী হওয়ার আগে স্নাতক স্কুল মনোবিজ্ঞানে জ্ঞানীয় পড়াশোনা করেছি, সুতরাং এটি আমার আগ্রহের ক্ষেত্র is)
আদমজোনআর

আমি বলতে চাইছি এটি গোলমাল করছে। তবে আমার ব্যক্তিগত মতামত ব্যতীত আমার কাছে আর কোনও প্রমাণ নেই
এইচ এইচ

উপসর্গগুলি নকল তথ্য যা ইতিমধ্যে কোডে অন্তর্ভুক্ত রয়েছে এবং কোনও অর্ধ-শালীন পরিবেশে প্রদর্শিত হয়েছে। এবং যেমনটি আমরা সবাই জানি, সদৃশ তথ্যগুলি অসঙ্গতিপূর্ণ হতে পারে। ডিআরওয়াই আপনাকে উপসর্গগুলি ব্যবহার না করার দিকে নির্দেশ করবে।
জুলিয়া হ্যাওয়ার্ড

উত্তর:


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+ বছর ধরে প্রোগ্রামিং এবং অন্যান্য লোকের কোড নিয়ে কাজ করার দরকার আছে।

আমি মনে করি যে আপনার পরিবর্তনকে তাদের স্কোপ হিসাবে একটি সংক্ষিপ্ত ইঙ্গিত দিয়ে নামকরণ করা পরবর্তী ব্যক্তির (বা নিজেকে) যারা আপনার কোডটি দেখবে তার পক্ষে সত্যই কার্যকর।

কোনও আইডিইতে ইতিমধ্যে সুন্দর রঙের কোডটির দিকে নজর নেই (এবং রঙগুলির অর্থ কী এবং বিভিন্ন IDE বিভিন্ন রঙ প্রদর্শন করে তা আমি মনে করতে পারি না))।

সত্য, পদ্ধতিগুলি যথেষ্ট সংক্ষিপ্ত হওয়া উচিত যাতে এটি প্রচুর পরিমাণে ভেরিয়েবল এবং টন কোড দিয়ে বোঝানো হয় না তবে সংক্ষিপ্ত একটিতেও - আপনি যখন কোডটি পুরোপুরি অপরিচিত দেখেন তখন কখনও কখনও কোনও ভেরিয়েবল শ্রেণীর পরিবর্তনশীল, স্থানীয় কিনা তা বলা শক্ত হয় পরিবর্তনশীল বা পদ্ধতি পরামিতি।

এক নজরে আলাদা করতে সক্ষম হওয়া কোডটির সাথে পর্যালোচনা করা আপনার পক্ষে অপরিচিত হওয়া খুব সহজ করে তোলে।

এই উদাহরণটি ধরুন:

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

এটি মূলত পছন্দের বিষয়, এবং এর মতো কোনও 'সঠিক' উত্তর নেই। সুতরাং, এই প্রশ্নটি আসলে বন্ধ হয়ে যেতে পারে। তবে এটি করার আগে, আমি আপনাকে বলি যে আমি আপনার সাথে পুরোপুরি একমত। উপসর্গগুলি যতটা আমি উদ্বিগ্ন দৃশ্যমানতা হ্রাস করে। এই বিষয়টিকে একা রাখুন যে যদি কোনও উপসর্গ থাকতে হয় তবে সেগুলি হাঙ্গেরিয়ান নোটেশনের মূল অভিযানের মতো আরও দরকারী জিনিসগুলির জন্য ব্যবহার করা উচিত এবং আপনার আইডিই যেভাবে যেভাবে হাইলাইটিং সরবরাহ করতে পারে তার জন্য নয়।

আমি উদাহরণস্বরূপ ডেটা (ভেরিয়েবল বা ধ্রুবক হোক) এবং প্যারামিটার এবং স্থানীয় ভেরিয়েবলের জন্য লোয়ার_केস ব্যবহার করি, যেহেতু দুটির মধ্যে সত্যই খুব সামান্য, যদি কোনও আছে, তবে পার্থক্য রয়েছে। আমি কখনও কখনও হেডলেস ক্যামেলকেস ব্যবহার করি না কারণ এটি লম্পট : একক উপাদান সনাক্তকারীটি দেখতে ছোট হাতের মতো দেখায়, যদিও এটি হেডলেস ক্যামেলকেস করার উদ্দেশ্যে করা হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.