এনামগুলি কি ভঙ্গুর ইন্টারফেস তৈরি করে?


17

নীচের উদাহরণ বিবেচনা করুন। কালারচয়েস এনামে কোনও পরিবর্তন সমস্ত আইওয়াইন্ডো কালার সাবক্লাসকে প্রভাবিত করে।

এনামগুলি কি ভঙ্গুর ইন্টারফেস সৃষ্টি করতে পারে? আরও বহুগুণিত নমনীয়তার জন্য এনামের চেয়ে আরও ভাল কিছু থাকতে পারে?

enum class ColorChoice
{
    Blue = 0,
    Red = 1
};

class IWindowColor
{
public:
    ColorChoice getColor() const=0;
    void setColor( const ColorChoice value )=0;
};

সম্পাদনা: রঙটিকে আমার উদাহরণ হিসাবে ব্যবহারের জন্য দুঃখিত, প্রশ্নটি এটাই নয়। এখানে একটি আলাদা উদাহরণ যা রেড হেরিং এড়িয়ে যায় এবং নমনীয়তার দ্বারা আমি কী বোঝাতে চাই সে সম্পর্কে আরও তথ্য সরবরাহ করে।

enum class CharacterType
{
    orc = 0,
    elf = 1
};

class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
    CharacterType getCharacterType() const;
    void setCharacterType( const CharacterType value );
};

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

সম্পাদনা: আমি কী নিয়ে কাজ করছি সে সম্পর্কে আরও দৃ concrete় হতে হবে। আমি এই ( মিউজিকএক্সএমএল ) স্পেসিফিকেশনটির একটি শক্তিশালী বাঁধাই ডিজাইন করছি এবং আমি এনএস ক্লাস ব্যবহার করছি যাতে এক্সেস: গণনা দ্বারা ঘোষিত স্পেসিফিকেশনের সেই ধরণের প্রতিনিধিত্ব করতে পারি। আমি পরের সংস্করণ (৪.০) প্রকাশিত হলে কী ঘটে যায় তা ভেবে দেখার চেষ্টা করছি। আমার ক্লাস লাইব্রেরি একটি 3.0 মোড এবং একটি 4.0 মোডে কাজ করতে পারে? পরবর্তী সংস্করণটি যদি 100% পশ্চাদপটে সামঞ্জস্যপূর্ণ হয়, তবে সম্ভবত। তবে যদি বিশিষ্টতা থেকে গণনার মানগুলি সরানো হয় তবে আমি জলে মরেছি।


2
আপনি যখন "পলিমারফিক নমনীয়তা" বলবেন, তখন আপনার ঠিক কী কী ক্ষমতার কথা মনে রয়েছে?
Ixrec


3
রঙের জন্য এনাম ব্যবহার করা কেবল "এনাম ব্যবহার করা" নয়, ভঙ্গুর ইন্টারফেস তৈরি করে।
ডক ব্রাউন 21

3
একটি নতুন এনাম ভেরিয়েন্ট যুক্ত করা সেই এনাম ব্যবহার করে কোড ব্রেক করে। এনামে একটি নতুন অপারেশন যুক্ত করা অন্যদিকে যথেষ্ট স্বয়ংসম্পূর্ণ, কারণ যে সমস্ত ক্ষেত্রে যেগুলি হ্যান্ডেল করা প্রয়োজন তা ঠিক সেখানেই রয়েছে (এটি ইন্টারফেস এবং সুপারক্লাসগুলির সাথে বিপরীত, যেখানে একটি ডিফল্ট নয় এমন পদ্ধতি যুক্ত করা একটি গুরুতর ব্রেকিং পরিবর্তন)। এটি নির্ভর করে যে ধরণের পরিবর্তনগুলি যা সত্যই প্রয়োজনীয়।

1
মিউজিকএক্সএমএল: যদি এক্সএমএল ফাইলগুলি থেকে স্কিমার কোন সংস্করণ প্রত্যেকে ব্যবহার করছে তা জানার কোনও সহজ উপায় না থাকে, যা স্পেসিফিকেশনের সমালোচনামূলক নকশার ত্রুটি হিসাবে আমাকে আঘাত করে। যদি আপনার এটি কোনওরকমভাবে চালিয়ে যেতে হয়, তবে তারা আমাদের 4.0 র মধ্যে কী ভাঙতে পছন্দ করবে তা সঠিকভাবে না জানা পর্যন্ত আমাদের পক্ষে সাহায্য করার কোনও উপায় নেই এবং আপনি এটির কারণে তৈরি একটি নির্দিষ্ট সমস্যা সম্পর্কে জিজ্ঞাসা করতে পারেন।
Ixrec

উত্তর:


25

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

  • সেট কালার () valueএকটি বৈধ রঙের মান কিনা তা পরীক্ষা করে সময় নষ্ট করতে হবে না। সংকলক ইতিমধ্যে এটি সম্পন্ন করেছে।
  • আপনি সেট কালার (0) এর পরিবর্তে সেট কালার (রঙ :: লাল) লিখতে পারেন। আমি বিশ্বাস করি যে enum classআধুনিক সি ++ এর বৈশিষ্ট্যটি আপনাকে এমনকি সর্বকালের পরিবর্তে প্রাক্তনটি লিখতে বাধ্য করে lets
  • সাধারণত গুরুত্বপূর্ণ নয়, তবে বেশিরভাগ এনামগুলি যে কোনও আকারের ইন্টিগ্রাল টাইপের সাথে প্রয়োগ করা যেতে পারে, তাই সংকলক আপনাকে এই জাতীয় বিষয়গুলি সম্পর্কে ভাবতে বাধ্য না করে যে আকারটি সবচেয়ে বেশি সুবিধাজনক তা চয়ন করতে পারে।

তবে, রঙের জন্য এনাম ব্যবহার করা প্রশ্নবিদ্ধ কারণ অনেক (বেশিরভাগ?) পরিস্থিতিতে ব্যবহারকারীকে এত ছোট রঙের রঙে সীমাবদ্ধ করার কোনও কারণ নেই; আপনি তাদের যেকোন যথেচ্ছ আরজিবি মানগুলিতে পাস করতে পারেন। আমি যে প্রকল্পগুলিতে কাজ করি সেগুলিতে এই জাতীয় রঙের একটি ছোট তালিকা কেবলমাত্র "থিম" বা "শৈলীর" সেটগুলির অংশ হিসাবে আসে যা কংক্রিটের রঙগুলির তুলনায় একটি পাতলা বিমূর্তি হিসাবে কাজ করবে বলে মনে করা হয়।

আপনার "বহুতল নমনীয়তা" প্রশ্নটি কী হচ্ছে তা আমি নিশ্চিত নই। এনামদের কোনও এক্সিকিউটেবল কোড নেই, তাই বহুবর্ষ তৈরির মতো কিছুই নেই। সম্ভবত আপনি কমান্ড প্যাটার্ন খুঁজছেন ?

সম্পাদনা: পোস্ট-সম্পাদনা করুন, আপনি কী ধরণের এক্সটেনবিলিটি খুঁজছেন তা সম্পর্কে আমি এখনও পরিষ্কার নই, তবে আমি এখনও মনে করি কমান্ড প্যাটার্নটি আপনি একটি "বহুবর্ষীয় এনাম" এ পাবেন সবচেয়ে নিকটতম জিনিস।


এনাম হিসাবে 0 কে পাস না করার বিষয়ে আমি আরও কোথায় জানতে পারি?
ট্যাঙ্কোরস্যামশ

5
@ ট্যাঙ্করসম্যাশ সি ++ 11 "এনাম ক্লাস" প্রবর্তন করেছিল, এটিকে "স্কোপড এনাম "ও বলা হয় যা তাদের অন্তর্নিহিত সংখ্যার প্রকারে স্পষ্টভাবে রূপান্তর করা যায় না। তারা পুরানো সি-স্টাইলের "এনাম" প্রকারের মতো নেমস্পেসকে দূষিত করা এড়ায়।
ম্যাথু জেমস ব্রিগেস

2
এনামগুলি সাধারণত পূর্ণসংখ্যার দ্বারা সমর্থিত হয়। সিরিয়ালাইজেশন / ডেসারিয়ালাইজেশন বা পূর্ণসংখ্যার এবং এনামগুলির মধ্যে কাস্টিংয়ে ঘটতে পারে এমন প্রচুর অদ্ভুত জিনিস রয়েছে। এটি এনামের সর্বদা একটি কার্যকর মান থাকবে তা ধরে নেওয়া নিরাপদ নয়।
এরিক

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

1
@ আইজরেক "কারণ অনেক (বেশিরভাগ?) পরিস্থিতিতে ব্যবহারকারীকে এত ছোট রঙের রঙে সীমাবদ্ধ করার কোনও কারণ নেই" বৈধ মামলা রয়েছে। নেট কনসোল পুরোনো শৈলী জানালা কনসোল, যা শুধুমাত্র 16 রং (সিজিএ মান 16 রং) এক টেক্সট থাকতে পারে অনুকরণ msdn.microsoft.com/en-us/library/...
Pharap

15

কালারচয়েস এনামে কোনও পরিবর্তন সমস্ত আইওয়াইন্ডো কালার সাবক্লাসকে প্রভাবিত করে।

না এটা হয় না। দুটি ক্ষেত্রে রয়েছে: বাস্তবায়নকারীরা হয় হয়

  • স্টোর, রিটার্ন এবং ফরোয়ার্ড এনাম মানগুলি, সেগুলি কখনই চালিত হয় না, সেই ক্ষেত্রে এনামের পরিবর্তনের দ্বারা তারা প্রভাবিত হয় না, বা

  • পৃথক enum মান, যে ক্ষেত্রে অবশ্যই enum আবশ্যক যে কোন পরিবর্তন, স্বাভাবিকভাবেই, অনেকটা সে-কারণেই, কাজ অগত্যা , implementer যুক্তি একটি সংশ্লিষ্ট পরিবর্তন জন্য দায়ী হবে না।

যদি আপনি "শেফার", "আয়তক্ষেত্র" এবং "পিরামিড" কে "শেপ" এনুমে রেখে দেন এবং এ জাতীয় এনামকে কোনও drawSolid()ফাংশনে পাস করেন যা আপনি সংশ্লিষ্ট শক্ত আঁকার জন্য লিখেছেন, এবং তারপরে একটি সকালে আপনি একটি যুক্ত করার সিদ্ধান্ত নেন " আইকোসিটেট্রহেড্রন "এনামের মান, আপনি কার্যটি অকার্যকর drawSolid()থাকার আশা করতে পারবেন না ; আপনি যদি আইসোসিটেট্রহেড্রনগুলি আঁকার জন্য প্রথমে আসল কোডটি না লিখে কোনওভাবে আইকোসিটেট্রহেড্রনগুলি আঁকতে আশা করে থাকেন তবে এটি আপনার দোষ, এনামের দোষ নয়। তাই:

এনামগুলি কি ভঙ্গুর ইন্টারফেস সৃষ্টি করতে পারে?

না, তারা না। ভঙ্গুর ইন্টারফেসের কারণ কী তা হল প্রোগ্রামাররা নিজেকে নিনজ হিসাবে ভাবছে, পর্যাপ্ত সতর্কতা সক্ষম না করেই তাদের কোডটি সংকলনের চেষ্টা করছে। তারপরে, সংকলক তাদের সতর্ক করে না যে তাদের drawSolid()ফাংশনে একটি switchবিবৃতি রয়েছে যা caseসদ্য যুক্ত হওয়া "আইকোসিটেট্রেহেড্রন" এনাম মানটির জন্য একটি ধারা অনুপস্থিত ।

এটি যেভাবে কাজ করার কথা বলেছে তা বেস ক্লাসে একটি নতুন খাঁটি ভার্চুয়াল পদ্ধতি যুক্ত করার অনুরূপ: আপনাকে তারপরে এই পদ্ধতিটি প্রতিটি একক উত্তরাধিকারীর উপর প্রয়োগ করতে হবে, অন্যথায় প্রকল্পটি তৈরি করে না এবং করা উচিত নয়।


এখন, সত্য বলা যেতে পারে, enums একটি অবজেক্ট-ভিত্তিক নির্মাণ নয়। এগুলি অবজেক্ট-ওরিয়েন্টেড দৃষ্টান্ত এবং কাঠামোগত প্রোগ্রামিং প্যারাডিজমের মধ্যে একটি ব্যবহারিক সমঝোতা।

জিনিসগুলি করার খাঁটি অবজেক্ট ওরিয়েন্টেড পদ্ধতিতে মোটেও এনাম না থাকা এবং তার পরিবর্তে সমস্ত উপায়ে বস্তু থাকা।

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

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


এই সুইচগুলির জন্য একটি সংকলন সময় সতর্কতা নিক্ষেপ করার কোনও টিপস? আমি সাধারণত রানটাইম ব্যতিক্রম ছুঁড়ে ফেলি; কিন্তু সংকলন সময় দুর্দান্ত হতে পারে! ততটা দুর্দান্ত নয় .. তবে ইউনিট টেস্টগুলি মাথায় আসে।
ভান হিলস

1
আমি সর্বশেষে সি ++ ব্যবহার করেছি তার কিছুক্ষণ হয়েছে, সুতরাং আমি নিশ্চিত নই, তবে আমি আশা করব যে সংকলককে -ওয়াল প্যারামিটার সরবরাহ করা এবং ধারাটি বাদ দিয়ে তা করা default:উচিত। বিষয়টিতে একটি তাত্ক্ষণিক অনুসন্ধানের ফলে আরও নির্দিষ্ট ফলাফল পাওয়া যায়নি, সুতরাং এটি অন্য programmers SEপ্রশ্নের বিষয় হিসাবে উপযুক্ত হতে পারে ।
মাইক নাকিস

সি ++ এ আপনি এটি সক্ষম করে থাকলে একটি সংকলন সময় পরীক্ষা করতে পারে। সি # তে যে কোনও চেক রান সময় হতে হবে। যে কোনও সময় আমি প্যারামিটার হিসাবে একটি নন-ফ্ল্যাগ এনাম নিলে আমি এটি এনাম.আইএসডিফাইন্ডের সাথে বৈধতা নিশ্চিত করেছিলাম, তবে এর অর্থ এই যে আপনি নতুন মান যুক্ত করার সময় আপনাকে এনামের সমস্ত ব্যবহার ম্যানুয়ালি আপডেট করতে হবে। দেখুন: স্ট্যাকওভারফ্লো.com
মাইক 12

1
আমি আশা করব যে কোনও বস্তু-ভিত্তিক প্রোগ্রামার তাদের ডেটা স্থানান্তর বস্তু কখনই তৈরি করতে পারে না, যেমন পিরামিডটি Pyramidকীভাবে আসলে তা জানে draw()। সর্বোপরি এটি হতে পারে Solidএবং কোনও GetTriangles()পদ্ধতি থাকতে পারে এবং আপনি এটি কোনও SolidDrawerপরিষেবাতে দিতে পারেন। আমি ভেবেছিলাম ওওপি-তে বস্তুর উদাহরণ হিসাবে আমরা শারীরিক বস্তুর উদাহরণ থেকে দূরে চলেছি।
স্কট হুইটলক

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

14

এনামগুলি ভঙ্গুর ইন্টারফেস তৈরি করে না। এনামগুলির অপব্যবহার করে।

এনাম কিসের জন্য?

এনামগুলি অর্থপূর্ণ নামযুক্ত ধাপের সেট হিসাবে ব্যবহার করার জন্য ডিজাইন করা হয়েছে। সেগুলি ব্যবহার করা হবে যখন:

  • আপনি জানেন যে কোনও মান মুছে ফেলা হবে না।
  • (এবং) আপনি জানেন যে এটির একটি নতুন মান প্রয়োজন হবে এমনটি অত্যন্ত সম্ভাবনা।
  • (বা) আপনি স্বীকার করেন যে একটি নতুন মান প্রয়োজন হবে, তবে এর ফলে ভেঙে থাকা সমস্ত কোডের ফিক্সিংয়ের জন্য খুব কমই যথেষ্ট।

এনামগুলির ভাল ব্যবহার:

  • সপ্তাহের দিন: (নেট অনুসারে System.DayOfWeek) আপনি যদি কিছু অবিশ্বাস্যরূপে অস্পষ্ট ক্যালেন্ডারের সাথে ডিল না করেন তবে সপ্তাহে কেবলমাত্র 7 দিন থাকবে।
  • অ-এক্সটেনসিবল রঙ: (নেট অনুসারে System.ConsoleColor) কেউ কেউ এর সাথে একমত নন, কিন্তু। নেট কোনও কারণে এটি করতে বেছে নিয়েছে। নেট নেট কনসোল সিস্টেমে কনসোল ব্যবহারের জন্য কেবল 16 টি রঙ উপলব্ধ। এই 16 টি রঙ সিজিএ বা 'রঙিন গ্রাফিক্স অ্যাডাপ্টার' নামে পরিচিত লিগ্যাসির রঙ প্যালেটের সাথে মিলে । কোনও নতুন মান যুক্ত হবে না, যার অর্থ এটি আসলে একটি এনামের যুক্তিসঙ্গত প্রয়োগ।
  • নির্দিষ্ট রাজ্যের প্রতিনিধিত্ব করে এমন গণনা: (জাভা অনুসারে Thread.State) জাভার ডিজাইনাররা স্থির করেছেন যে জাভা থ্রেডিং মডেলটিতে কেবল কোনও স্থির রাজ্যের একটি সেট থাকবে যা কোনও ক্ষেত্রে Threadথাকতে পারে এবং তাই বিষয়গুলি সরল করার জন্য এই বিভিন্ন রাজ্যকে গণনা হিসাবে উপস্থাপন করা হয় । এর অর্থ হ'ল অনেক রাজ্য-ভিত্তিক চেকগুলি সাধারণ ifs এবং স্যুইচ যা অনুশীলন করে পূর্ণসংখ্যার মানগুলিতে কাজ করে, প্রোগ্রামারকে মূল্যবোধগুলি আসলে কী তা নিয়ে চিন্তিত না করে।
  • বিটফ্ল্যাগগুলি অপ-পারস্পরিক একচেটিয়া বিকল্পগুলির প্রতিনিধিত্ব করে: (নেট অনুসারে System.Text.RegularExpressions.RegexOptions) বিটফ্ল্যাগগুলি এনামগুলির খুব সাধারণ ব্যবহার। প্রকৃতপক্ষে সাধারণ, এটিতে। সমস্ত এনামের একটি HasFlag(Enum flag)অন্তর্নির্মিত পদ্ধতি রয়েছে They তারা বিটওয়াইস অপারেটরগুলিকে সমর্থন করে এবং FlagsAttributeএকটি এনামকে বিটফ্ল্যাগের সেট হিসাবে ব্যবহার করার উদ্দেশ্যে চিহ্নিত করার জন্য একটি চিহ্ন রয়েছে। পতাকাগুলির সেট হিসাবে একটি এনাম ব্যবহার করে, আপনি একক মানতে বুলিয়ান মানগুলির একটি গ্রুপের প্রতিনিধিত্ব করতে পারেন, পাশাপাশি সুবিধার্থে পতাকাগুলি পরিষ্কারভাবে নামকরণও করতে পারেন। কোনও এমুলেটরটিতে স্থিতির নিবন্ধের পতাকাগুলি উপস্থাপন করার জন্য বা কোনও ফাইলের (পড়ার, লেখার, সম্পাদনকারী) অনুমতিগুলির প্রতিনিধিত্ব করার জন্য, বা সম্পর্কিত বিকল্পগুলির একটি সেট পারস্পরিকভাবে একচেটিয়া নয় এমন পরিস্থিতি সম্পর্কে এটি অত্যন্ত উপকারী হবে।

এনামগুলির খারাপ ব্যবহার:

  • একটি গেমের চরিত্রের ক্লাস / প্রকার: যদি গেমটি একটি শট ডেমো না হয় যা আপনার আবার ব্যবহারের সম্ভাবনা নেই, এনামগুলিকে অক্ষর শ্রেণীর জন্য ব্যবহার করা উচিত নয় কারণ আপনি আরও অনেক ক্লাস যুক্ত করার সম্ভাবনা রয়েছে। একটি একক শ্রেণীর প্রতিনিধিত্বকারী চরিত্র এবং অন্যথায় গেমের একটি অক্ষর 'টাইপ' উপস্থাপন করা ভাল। এটি পরিচালনা করার একটি উপায় হ'ল টাইপঅবজেক্ট প্যাটার্ন, অন্যান্য সমাধানগুলিতে একটি অভিধান / টাইপ রেজিস্ট্রি বা দুটিটির মিশ্রণ সহ অক্ষর প্রকার নিবন্ধকরণ অন্তর্ভুক্ত।
  • এক্সটেনসিবল রঙ: আপনি যদি রঙের জন্য এনাম ব্যবহার করেন যা পরে এটিতে যুক্ত হতে পারে তবে এটি এনাম আকারে উপস্থাপন করা ভাল ধারণা নয়, অন্যথায় আপনি চিরকালের জন্য রঙ যুক্ত করে ছেড়ে চলে যাবেন। এটি উপরের ইস্যুটির অনুরূপ, সুতরাং অনুরূপ সমাধানটি ব্যবহার করা উচিত (অর্থাত্ টাইপঅবজেক্টের একটি প্রকরণ)।
  • এক্সটেনসিবল স্টেট: যদি আপনি এমন একটি রাষ্ট্রীয় মেশিন পেয়ে থাকেন যা আরও অনেকগুলি রাজ্যের সূচনা করতে পারে তবে গণনাগুলির মাধ্যমে এই রাজ্যগুলির প্রতিনিধিত্ব করা ভাল ধারণা নয়। পছন্দসই পদ্ধতিটি হ'ল মেশিনের অবস্থার জন্য একটি ইন্টারফেস সংজ্ঞায়িত করা, একটি প্রয়োগকরণ বা শ্রেণি সরবরাহ করা যা ইন্টারফেসটি মোড় করে এবং তার পদ্ধতি কলগুলি ( কৌশল প্যাটার্নের অনুরূপ ) উপস্থাপন করে এবং তারপরে তার অবস্থার পরিবর্তন করে যা সরবরাহ বর্তমানে কার্যকর হয়।
  • বিটফ্ল্যাগগুলি পারস্পরিক একচেটিয়া বিকল্পগুলির প্রতিনিধিত্ব করে: আপনি যদি পতাকাগুলি উপস্থাপন করতে enums ব্যবহার করেন এবং এর মধ্যে দুটি পতাকা দুটি কখনও একসাথে না ঘটানো উচিত তবে আপনি নিজেকে পায়ে গুলি করেছিলেন। পতাকাগুলির মধ্যে একটিতে প্রতিক্রিয়া জানানোর জন্য প্রোগ্রাম করা যে কোনও কিছু হঠাৎই এটির প্রতিক্রিয়া জানানোর জন্য প্রোগ্রামযুক্ত যে পতাকাটিতে প্রতিক্রিয়া দেখাবে - বা আরও খারাপ, এটি উভয়কেই সাড়া দিতে পারে। এই ধরণের পরিস্থিতি কেবল সমস্যার জন্য জিজ্ঞাসা করছে। সর্বোত্তম পন্থা হ'ল সম্ভব হলে বিকল্প শর্ত হিসাবে পতাকার অনুপস্থিতিকে চিকিত্সা করা (যেমন Trueপতাকাটির অনুপস্থিতি বোঝায় False)। বিশেষায়িত ফাংশন (যেমন IsTrue(flags)এবং IsFalse(flags)) ব্যবহারের মাধ্যমে এই আচরণটি আরও সমর্থিত হতে পারে ।

আমি বিটফ্ল্যাগ উদাহরণগুলি যুক্ত করব যদি কেউ বিটফ্লাগ হিসাবে ব্যবহৃত এনামগুলির কোনও কার্যকরী বা সুপরিচিত উদাহরণ খুঁজে পায়। আমি সচেতন তাদের অস্তিত্ব আছে কিন্তু দুর্ভাগ্যক্রমে আমি এই মুহূর্তে কোনও কিছুই মনে করতে পারি না।
ফারাপ

1
RegexOptions
.NET-

@ বিএলসুলি দুর্দান্ত উদাহরণ। বলতে পারি না যে আমি তাদের কখনই ব্যবহার করেছি তবে সেগুলি একটি কারণে রয়েছে।
ফারাপ

4

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

সমস্যাটি হ'ল যখন আপনি এনামের সাথে সম্পর্কিত গুরুত্বপূর্ণ কার্যকারিতা রাখেন। তা হল, আপনার কাছে এই ধরণের কোড রয়েছে:

switch (my_enum) {
case orc: growl(); break;
case elf: sing(); break;
...
}

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

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


1

আপনি কীভাবে এগুলি ব্যবহার করেন সে বিষয়ে যদি আপনি সতর্ক হন তবে আমি এনামগুলিকে ক্ষতিকারক হিসাবে বিবেচনা করব না। তবে আপনি যদি কোনও একক প্রয়োগের বিপরীতে কিছু লাইব্রেরি কোডে সেগুলি ব্যবহার করতে চান তবে কয়েকটি বিষয় বিবেচনা করতে হবে।

  1. মানগুলি কখনই মুছে ফেলুন বা পুনঃক্রম করুন। আপনার তালিকায় যদি কোনও মুহুর্তে এনাম মান থাকে তবে সেই মানটি অনন্তকাল ধরে সেই নামের সাথে যুক্ত হওয়া উচিত। যদি আপনি চান, আপনি কিছু সময় deprecated_orcবা তার যেকোন কিছুতে মান পরিবর্তন করতে পারেন , তবে এগুলি অপসারণ না করে আপনি সহজেই পুরানো কোডের সাথে এনামগুলির পুরানো সেটগুলির সাথে সংকলিত পুরানো কোডের সাথে সামঞ্জস্য বজায় রাখতে পারবেন। যদি কিছু নতুন কোড পুরাতন এনাম কনস্ট্যান্টগুলির সাথে ডিল করতে না পারে, তবে সেখানে একটি উপযুক্ত ত্রুটি উত্পন্ন করুন বা নিশ্চিত করুন যে কোডটির এই অংশে কোনও মান পৌঁছেছে।

  2. তাদের গাণিতিক করবেন না। বিশেষত, তুলনা অর্ডার করবেন না। কেন? কারণ তখন আপনি এমন পরিস্থিতির মুখোমুখি হতে পারেন যেখানে আপনি বিদ্যমান মানগুলি রাখতে পারবেন না এবং একই সাথে একটি অর্থে অর্ডার সংরক্ষণ করতে পারবেন না। উদাহরণস্বরূপ কম্পাসের দিকনির্দেশগুলির জন্য একটি এনাম নিন: এন = 0, এনই = 1, ই = 2, এসই = 3,… এখন যদি কিছু আপডেটের পরে আপনি NNE এবং এর সাথে বিদ্যমান দিকগুলির মধ্যে অন্তর্ভুক্ত করেন তবে আপনি সেগুলি শেষ পর্যন্ত যুক্ত করতে পারেন তালিকার তালিকাটি এবং এইভাবে ক্রমটি ভেঙে দিন বা আপনি বিদ্যমান কীগুলির সাহায্যে এটিকে আন্তঃলিভ করুন এবং এভাবে উত্তরাধিকার কোডে ব্যবহৃত প্রতিষ্ঠিত ম্যাপিংগুলি ভেঙে দিন। বা আপনি সমস্ত পুরানো কীগুলি অবমাননাকর করেছেন এবং কিছু সামঞ্জস্য কোডের সাথে পুরানো এবং নতুন কীগুলির মধ্যে লিগ্যাসি কোডের জন্য অনুবাদ করে এমন একটি সম্পূর্ণ নতুন কী রয়েছে keys

  3. পর্যাপ্ত আকার চয়ন করুন। ডিফল্টরূপে সংকলক ক্ষুদ্রতম পূর্ণসংখ্যা ব্যবহার করবে যা সমস্ত এনাম মানগুলি ধারণ করতে পারে। যার অর্থ যদি কোনও আপডেটে আপনার সম্ভাব্য এনামগুলির সেট 254 থেকে 259 পর্যন্ত প্রসারিত হয় তবে হঠাৎ আপনার পরিবর্তে প্রতিটি এনাম মানের জন্য 2 বাইট প্রয়োজন। এটি পুরো জায়গা জুড়ে কাঠামো এবং শ্রেণি বিন্যাসগুলি ভেঙে ফেলতে পারে, তাই প্রথম ডিজাইনে পর্যাপ্ত আকার ব্যবহার করে এটি এড়াতে চেষ্টা করুন। সি ++ 11 আপনাকে এখানে প্রচুর নিয়ন্ত্রণ দেয়, তবে অন্যথায় একটি এন্ট্রি নির্দিষ্ট LAST_SPECIES_VALUE=65535করাও সহায়তা করবে।

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

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

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