এনামদের তাদের স্ট্রিং প্রতিনিধিত্বকে আরও সহজ করার জন্য নামকরণের জন্য সমস্ত ক্যাপের বিরুদ্ধে যাওয়া কি ঠিক আছে?


14

আমি বেশ কয়েকবার লোককে দেখেছি শিরোনাম-কেস এমনকি সমস্ত নিম্ন-মামলার নামকরণ এনাম ধ্রুবকের জন্য করা হয়, উদাহরণস্বরূপ:

enum Color {
  red,
  yellow,
  green;
}

throw new IllegalStateException("Light should not be " + color + ".")উদাহরণস্বরূপ , যদি আপনি এটি করতে চান তবে এটি তাদের স্ট্রিং ফর্মটির সাথে কাজ সহজ এবং সহজ করে তোলে ।

এনাম থাকলে এটি আরও গ্রহণযোগ্য মনে হয় privateতবে আমি এখনও এটি পছন্দ করি না। আমি জানি আমি একটি স্ট্রিং ফিল্ড সহ একটি এনাম কনস্ট্রাক্টর তৈরি করতে পারি এবং তারপরে নামটি ফিরে পেতে টু স্ট্রিংকে ওভাররাইড করতে পারি:

enum Color {
  RED("red"),
  YELLOW("yellow"),
  GREEN("green");

  private final String name;

  private Color(String name) { 
    this.name = name 
  }

  @Override public String toString() {
    return name; 
  }
}

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


4
এটি একটি সম্মেলন। আপনার কি কনভেনশন ভাঙার কারণ আছে? এটা তোমার উপর.

9
কেবল ব্যতিক্রমী বার্তায় যা ভুল হয়েছে তা ভাবছি Light should not be RED.। সর্বোপরি, এই বার্তাটি বিকাশকারীদের পক্ষে, ব্যবহারকারীর এটি কখনও দেখা উচিত নয়।
ব্র্যান্ডিন

1
@ ব্র্যান্ডিন যদি রঙটি আরও বাস্তবায়নের বিশদ হয়, তবে কারওাই এটি দেখতে পাবেন না। অবশ্যই, তবে আমি অনুমান করি যে আমাদের কেন একটি দুর্দান্ত টু স্ট্রিং ফর্ম প্রয়োজন তা এই প্রশ্নটি ছেড়ে দেয়।
কোডব্রেকার

8
দিনের শেষে এটি আপনার উপর নির্ভর করে। যদি আমি আপনার কোডটি ডিবাগ করছিলাম এবং একটি ব্যতিক্রম বার্তা Light should not be YELLOW.দেখেছি তবে আমি অনুমান করব যে এটি কোনও ধরণের ধ্রুবক the
ব্র্যান্ডিন

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

উত্তর:


14

সংক্ষিপ্ত উত্তরটি অবশ্যই, আপনি প্রয়োজনীয় ধ্রুবকগুলির জন্য নামকরণের সম্মেলনগুলি ভেঙে ফেলতে চান কিনা ... জেএলএস থেকে উদ্ধৃত :

কনস্ট্যান্ট নাম

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

ব্যবহারের ক্ষেত্রে লম্বা উত্তরটি toString()হ'ল আপনি যদি মূল্যবোধের আরও পাঠযোগ্য উপস্থাপনা চান তবে সেটি অবশ্যই ওভাররাইডের পদ্ধতি enumObject.toString()(জোর দেওয়া খনি) থেকে উদ্ধৃতি :

বস্তুর একটি স্ট্রিং প্রতিনিধিত্ব প্রদান করে। সাধারণভাবে, toStringপদ্ধতিটি একটি স্ট্রিং প্রদান করে যা এই বস্তুকে "পাঠ্যগতভাবে উপস্থাপন করে" । ফলাফলটি একটি সংক্ষিপ্ত কিন্তু তথ্যমূলক উপস্থাপনা হওয়া উচিত যা কোনও ব্যক্তির পক্ষে পড়া সহজ । সমস্ত সাবক্লাসগুলি এই পদ্ধতিটিকে ওভাররাইড করার পরামর্শ দেওয়া হয়।

এখন, আমি নিশ্চিত নই যে উত্তরগুলির মধ্যে কিছু কিছু কেন মানগুলিতে রূপান্তরিত enumsকরার বিষয়ে কথা বলছে String, তবে আমি এখানেও আমার গ্রহণ করব। enumমূল্যবোধের এ জাতীয় সিরিয়ালাইজেশন name()বা ordinal()পদ্ধতি ব্যবহার করে সহজেই যত্ন নেওয়া যেতে পারে । উভয়ই তাই finalএবং মানগুলির নাম বা অবস্থান পরিবর্তন না হওয়া পর্যন্ত আপনি প্রত্যাবর্তিত মানগুলির বিষয়ে নিশ্চিত হতে পারেন । আমার কাছে এটি পরিষ্কার-পরিস্কার মার্কার।

আমি উপরের থেকে যা সংগ্রহ করি তা হ'ল: আজ, আপনি YELLOWকেবল "হলুদ" হিসাবে বর্ণনা করতে চাইতে পারেন । আগামীকাল, আপনি এটিকে "প্যান্টোন মাইনিয়ন ইয়েলো" হিসাবে বর্ণনা করতে চাইতে পারেন । এই বিবরণগুলি কলিং থেকে ফিরিয়ে দেওয়া উচিত toString(), এবং আমি name()বা হয় না ordinal()পরিবর্তন আশা করি না । যদি আমি এটি করি তবে এটি আমার কোডবেস বা আমার দলের মধ্যে সমাধান করার দরকার এবং এটি কেবল একটি enumনামকরণ শৈলীর চেয়ে আরও বড় প্রশ্নে পরিণত হয়েছে

উপসংহারে, আপনি যদি করতে চান সমস্ত কিছু যদি আপনার মূল্যবোধের আরও বেশি পঠনযোগ্য উপস্থাপনাটি লগ করা হয় তবে enumআমি কনভেনশনগুলিতে লেগে থাকা এবং তারপরে ওভাররাইড করার পরামর্শ দিই toString()। আপনি যদি তাদের কোনও ডেটা ফাইল, বা অন্য জাভা-অবিচ্ছিন্ন গন্তব্যগুলিতে সিরিয়ালিয়াল করার পরিকল্পনা করে থাকেন তবে আপনার ব্যাকআপ নেওয়ার জন্য এখনও আপনার কাছে পদ্ধতি name()এবং ordinal()পদ্ধতি রয়েছে, তাই ওভাররাইডিং নিয়ে হতাশ হওয়ার দরকার নেই toString()


5

ENUMএটি কেবল খারাপ কোড গন্ধ সংশোধন করবেন না । একটি এনাম একটি এনাম এবং একটি স্ট্রিং একটি স্ট্রিং হোক।

পরিবর্তে, স্ট্রিং মানগুলির জন্য একটি ক্যামেলকেস রূপান্তরকারী ব্যবহার করুন।

throw new IllegalStateException("Light should not be " + CamelCase(color) + ".");

অনেকগুলি ওপেন সোর্স লাইব্রেরি রয়েছে যা ইতিমধ্যে জাভাটির জন্য এই সমস্যাটি সমাধান করে।

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CaseFormat.html


নির্দিষ্ট প্রান্তের ক্ষেত্রে এটি কি অ-সংযমী হবে না? (কোনও নির্দিষ্ট রূপান্তরকারীর আচরণ নয়, তবে সাধারণ নীতি)
প্যানজার্সারিসিস 21

-1 তৃতীয় পক্ষের লাইব্রেরি যুক্ত করা যা আপনি বেসিক স্ট্রিং ফর্ম্যাটিংয়ের জন্য যা চান তা না ওষ্কিল হতে পারে।
ব্যবহারকারী 949300

1
@ user949300 কোডটি অনুলিপি করুন, আপনার নিজের বা কী লিখুন। আপনি বিন্দু মিস করছি।
515

আপনি কি "বিন্দু" তে বিস্তারিত বলতে পারেন? "একটি এনামকে এনাম এবং একটি স্ট্রিং একটি স্ট্রিং হতে দিন" ভাল শোনাচ্ছে তবে এটির অর্থ কী?
user949300

1
এনুম ধরণের সুরক্ষা সরবরাহ করে। রঙ হিসাবে তিনি "আলু" পাস করতে পারেন না। এবং, সম্ভবত, তিনি এনামে অন্যান্য ডেটা অন্তর্ভুক্ত করেছেন, যেমন থ্রাই আরজিবি মান, কেবল কোডটিতে তা দেখায় না। স্ট্রিংয়ের পরিবর্তে এনাম ব্যবহার করার অনেকগুলি ভাল কারণ রয়েছে।
user949300

3

আমার জাভা কোড এবং একটি ডেটাবেস বা ক্লায়েন্ট অ্যাপ্লিকেশনগুলির মধ্যে এনামগুলি পাঠানো, আমি প্রায়শই স্ট্রিং হিসাবে এনাম মানগুলি পড়ি এবং লিখি। toString()স্ট্রিংগুলি সংহত করার সময় স্পষ্টতই বলা হয়। কিছু এনামে টু স্ট্রিং () -কে ওভাররাইড করার অর্থ হ'ল কখনও কখনও আমি ঠিক করতে পারি

"<input type='checkbox' value='" + MY_CONST1 + "'>"

এবং মাঝে মাঝে আমাকে কল করতে মনে পড়ে

"<input type='checkbox' value='" + MY_CONST1.name() + "'>"

যা ত্রুটির দিকে পরিচালিত করে, তাই আমি আর এটি করি না। প্রকৃতপক্ষে, আমি এনামের কোনও পদ্ধতি ওভাররাইড করি না কারণ আপনি যদি তাদের যথেষ্ট ক্লায়েন্ট কোডে ফেলে দেন তবে আপনি শেষ পর্যন্ত কারও প্রত্যাশা ভঙ্গ করবেন।

মত আপনার নিজের নতুন পদ্ধতি জনপ্রিয় করে তুলুন, public String text()বা toEnglish()বা যাই হোক না কেন।

এখানে একটি ছোট সহায়ক ফাংশন যা আপনার উপরের মতো প্রচুর এনাম থাকলে আপনার কিছু টাইপিং সংরক্ষণ করতে পারে:

public static String ucFirstLowerRest(String s) {
    if ( (s == null) || (s.length() < 1) ) {
        return s;
    } else if (s.length() == 1) {
        return s.toUpperCase();
    } else {
        return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    }
}

.ToUpperCase () বা .toLowerCase () কল করা সর্বদা সহজ তবে মিশ্র-কেস ফিরে পাওয়া কঠিন হতে পারে। রঙটি বিবেচনা করুন, "ব্লু ডি ফ্রান্স"। ফ্রান্স সর্বদা মূলধনীভূত হয়, তাই আপনি যদি এটিকে চালিত করেন তবে আপনি আপনার এনামের কাছে একটি পাঠ্যলয় () পদ্ধতি যুক্ত করতে চাইতে পারেন। আপনি যখন কোনও বাক্য শুরুর সময় এই পাঠ্যটি ব্যবহার করেন, বনাম একটি বাক্যটির মাঝামাঝি, বনাম একটি শিরোনামে, আপনি দেখতে পারেন যে কীভাবে একটি একক toString()পদ্ধতি সংক্ষিপ্ত হতে চলেছে। এবং এটি জাভা শনাক্তকারীগুলিতে অবৈধ এমন অক্ষরগুলিকেও স্পর্শ করে না বা টাইপ করতে ব্যথা হয় কারণ এগুলি স্ট্যান্ডার্ড কীবোর্ডগুলিতে উপস্থাপন করা হয় নি, বা অক্ষরগুলির ক্ষেত্রে (কানজি ইত্যাদি) নেই।

enum Color {
  BLEU_DE_FRANCE {
    @Override public String textTc() { return "Bleu De France"; }
    @Override public String textLc() { return "bleu de France"; }
  }
  CAFE_NOIR {
    @Override public String textTc() { return "Café Noir"; }
  }
  RED,
  YELLOW,
  GREEN;

  // The text in title case
  private final String textTc;

  private Color() { 
    textTc = ucFirstLowerRest(this.toString());
  }

  // Title case
  public String textTc() { return textTc; }

  // For the middle of a sentence
  public String textLc() { return textTc().toLowerCase(); }

  // For the start of a sentence
  public String textUcFirst() {
    String lc = textLc();
    return lc.substring(0, 1).toUpperCase() + lc.substring(1);
  }
}

এগুলি সঠিকভাবে ব্যবহার করা এত কঠিন নয়:

IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
                      color2.textLc() + "!")

আশা করি এটি প্রমাণ করে যে কেন মিক্সড-কেস এনাম মান ব্যবহার করা আপনাকে হতাশ করবে। আন্ডারস্কোর এনাম কনস্ট্যান্ট সহ অল-ক্যাপগুলি রাখার একটি শেষ কারণ হ'ল এটি করা সর্বনিম্ন বিস্ময়ের নীতি অনুসরণ করে। লোকেরা এটির প্রত্যাশা করে, সুতরাং আপনি যদি অন্যরকম কিছু করেন তবে আপনাকে সর্বদা নিজেকে ব্যাখ্যা করাতে হবে, বা আপনার কোডটির অপব্যবহার করা লোকদের সাথে ডিল করতে হবে।


3
toString()কোনও এনামকে কখনই ওভাররাইড না করার পরামর্শটি আমার কাছে কোনও অর্থ দেয় না। আপনি যদি এনাম নামের গ্যারান্টিযুক্ত ডিফল্ট আচরণ চান তবে ব্যবহার করুন name()। এর toString()জন্য সঠিক কী সরবরাহ করার জন্য নির্ভর করা মোটেও "প্রলোভনসঙ্কুল" মনে করি না valueOf(String)। আমি অনুমান করি আপনি যদি আপনার এনামগুলিকে বোকা-প্রমাণ করতে চান তবে এটি একটি জিনিস তবে আমি কখনই ওভাররাইড না করা উচিত বলে সুপারিশ করার পক্ষে এটি যথেষ্ট উপযুক্ত কারণ বলে মনে করি নাtoString()
কোডব্রেকার 20'15

1
তদ্ব্যতীত, আমি এটি পেয়েছি, যা প্রস্তাব দেয় (যেহেতু আমাকে বিশ্বাস করতে পরিচালিত হয়েছিল) যে এনামগুলিতে টু স্ট্রিংকে ওভাররাইড করা আসলে একটি ভাল জিনিস: স্ট্যাকওভারফ্লো
কোডব্রেকার

স্ট্রোকগুলি সংঘবদ্ধ করার সময় @ কোডডেবার টু স্ট্রিং () কে স্পষ্টভাবে বলা হয়। কিছু এনামে <input type='checkbox' value=" + MY_CONST1 + ">টু স্ট্রিং () কে ওভাররাইড করার অর্থ হ'ল কখনও কখনও আমি ন্যায়বিচার করতে পারি এবং কখনও কখনও আমাকে কল করতে হবে <input type='checkbox' value=" + MY_CONST1.name() + ">যা ত্রুটিগুলির দিকে পরিচালিত করেছিল।
গ্লেনপিটারসন

ঠিক আছে, এটি একটি ভাল বিষয়, তবে আপনি যখন তাদের নাম দিয়ে এনরিমগুলিকে "সিরিয়ালাইজিং" করছেন (তখনই আমার উদাহরণটি নিয়ে আমার চিন্তা করার দরকার নেই তা কেবল তখনই গুরুত্বপূর্ণ)।
কোডব্রেকার

0

যদি এই স্ট্রিং উপস্থাপনাগুলি ডাটাবেস বা পাঠ্য ফাইলের মতো জায়গায় সংরক্ষণ করা যেতে পারে তবে তার যদি সামান্যতম সম্ভাবনা থাকে তবে এগুলি সত্যিকারের এনাম কনস্ট্যান্টের সাথে বেঁধে রাখা যদি আপনার এনামকে রিফ্যাক্টর করার প্রয়োজন হয় তবে এটি অত্যন্ত সমস্যাযুক্ত হয়ে উঠবে।

যদি একদিন আপনি "হোয়াইট" রয়েছে এমন ডেটা ফাইল থাকা অবস্থায় নাম পরিবর্তন Color.Whiteকরার সিদ্ধান্ত নেন Color.TitaniumWhite?

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

যা বলা হয়ে গেছে, আপনি অবশ্যই এগিয়ে যেতে পারেন এবং আপনি যা করার কথা ভাবছেন তা করতে পারেন, এবং পরে আপনার এনামকে রিফেক্টর করে কনস্ট্রাক্টরের নাম লিখতে পারবেন, কখন (এবং যদি) আপনি সমস্যায় পড়েন।

আপনি nameক্ষেত্রটি ঘোষণা করে public finalএবং গিটারটি হারাতে আপনার এনম-উইথ কনস্ট্রাক্টরের কয়েকটি লাইন শেভ করতে পারেন । (জাভা প্রোগ্রামারদের প্রাপ্তদের প্রতি এই প্রেমটি কী?)


একটি সর্বজনীন চূড়ান্ত স্ট্যাটিক কোডে সংকলিত হয় যা শ্রেণি থেকে আসে এমন কোনও রেফারেন্সের পরিবর্তে এটি প্রকৃত ধ্রুবক হিসাবে ব্যবহার করে। কোডের আংশিক পুনঃসংশোধন (বা জার প্রতিস্থাপন) করার সময় এটি অন্যান্য মজাদার ত্রুটিগুলির কারণ হতে পারে। আপনি যদি পরামর্শ দিচ্ছেন public final static int white = 1;বা public final static String white = "white";(আবার কনভেনশন ভাঙ্গা বাদ দিয়ে), এটি এনাম সরবরাহ করে এমন ধরণের সুরক্ষা হারিয়ে ফেলে।

@ মিশেলটি এনাম ক্ষেত্রগুলি স্থির নয়। প্রতিটি এনাম ধ্রুবকের জন্য একটি উদাহরণ তৈরি করা হয়, এবং এনামের সদস্যরা সেই উদাহরণের সদস্য ভেরিয়েবল হয়। একটি public finalদৃষ্টান্ত ক্ষেত্র ঠিক একটি অ-ফাইনাল ক্ষেত্র মত কন্সট্রাকটর আচরণ করবে থেকে সক্রিয়া পরার যে ছাড়া তোমরা বাধা প্রাপ্ত হও কম্পাইল-সময়ে এটি বরাদ্দ থেকে। আপনি এটি প্রতিবিম্বের মাধ্যমে এবং এর সাথে সম্পর্কিত সমস্ত কোডের মাধ্যমে এটি সংশোধন করতে পারবেন সাথে সাথেই নতুন মানটি দেখা শুরু করবে।
মাইক নকিস

0

তর্কসাপেক্ষ, বড় হাতের নামকরণ সম্মেলন নিম্নলিখিত লঙ্ঘন করে শুকনো । (এবং ইয়াজিএনআই )। উদাহরণস্বরূপ, আপনার কোডে উদাহরণ # 2: "লাল" এবং "লাল" পুনরাবৃত্তি হয়েছে।

সুতরাং, আপনি কি অফিসিয়াল কনভেনশন অনুসরণ করেন বা ডিআরওয়াই অনুসরণ করেন? আপনার কল

আমার কোডে, আমি DRY অনুসরণ করব। যাইহোক, আমি এনাম ক্লাসে একটি মন্তব্য করব, "সমস্ত বড় হাতের কারণ নয় (কারণ এখানে ব্যাখ্যা)"

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