কাস্টম (আশাবাদী অর্থপূর্ণ) নাম সহ এনামগুলি কেবল সীমাবদ্ধ প্রকার। একটি enum শুধুমাত্র একটি মান, মত থাকতে পারে void
যা শুধুমাত্র রয়েছে null
(কিছু কিছু ভাষায় এই কল unit
, এবং নাম ব্যবহার void
সঙ্গে একটি enum জন্য কোন উপাদান!)। এটা দুই মূল্যবোধ, মত থাকতে পারে bool
যা হয়েছে false
এবং true
। এটি তিনটি মত থাকতে পারে, colourChannel
সঙ্গে red
, green
এবং blue
। ইত্যাদি।
দুটি এনামের যদি একই সংখ্যার মান থাকে তবে তারা "আইসোমোরফিক" হয়; উদাহরণস্বরূপ, যদি আমরা নিয়মিতভাবে সমস্ত নামগুলি স্যুইচআউট করি তবে আমরা অন্যটির জায়গায় একটি ব্যবহার করতে পারি এবং আমাদের প্রোগ্রামটি কোনও আলাদা আচরণ করবে না। বিশেষত, আমাদের পরীক্ষাগুলি কোনও আলাদা আচরণ করবে না!
উদাহরণস্বরূপ, result
ধারণকারী win
/ lose
/ draw
উপরোক্ত isomorphic হয় colourChannel
, যেহেতু আমরা যেমন প্রতিস্থাপন করতে পারেন colourChannel
সঙ্গে result
, red
সঙ্গে win
, green
সঙ্গে lose
এবং blue
সঙ্গে draw
, এবং যতদিন আমরা কি হিসাবে সর্বত্র (উত্পাদক ও ভোক্তাদের, পারজার এবং serialisers, ডাটাবেজ এন্ট্রি, লগ ফাইল, ইত্যাদি ) তাহলে আমাদের প্রোগ্রামে কোনও পরিবর্তন হবে না। colourChannel
আমাদের লেখা কোনও " পরীক্ষা" এখনও পাস করবে, যদিও এর পরে আর কিছু নেই colourChannel
!
এছাড়াও, যদি কোনও এনামের একাধিক মান থাকে তবে আমরা সর্বদা একই সংখ্যার মান সহ একটি নতুন এনাম পেতে সেই মানগুলিকে পুনরায় সাজিয়ে তুলতে পারি । যেহেতু মানগুলির সংখ্যা পরিবর্তিত হয়নি, তাই নতুন ব্যবস্থাটি পুরানোটির কাছে বিচ্ছিন্ন, এবং সেইজন্য আমরা সমস্ত নামগুলি সরিয়ে দিতে পারি এবং আমাদের পরীক্ষাগুলি এখনও পাস হতে পারে (নোট করুন যে আমরা কেবল সংজ্ঞাটি পরিবর্তন করতে পারি না ; আমাদের অবশ্যই তবুও সমস্ত ব্যবহারের সাইটগুলিও স্যুইচআউট করুন)।
এর অর্থ কী, মেশিনটি যতটা উদ্বিগ্ন, এনামগুলি হ'ল "স্বতন্ত্র নাম" এবং অন্য কিছু নয় । একটি এনামের সাথে আমরা কেবলমাত্র যা করতে পারি তা হ'ল দুটি মান একই (যেমন red
/ red
) বা পৃথক (যেমন red
/ blue
) পৃথক কিনা on সুতরাং এটিই কেবল 'ইউনিট পরীক্ষা' করতে পারে, যেমন
( red == red ) || throw TestFailure;
(green == green) || throw TestFailure;
( blue == blue ) || throw TestFailure;
( red != green) || throw TestFailure;
( red != blue ) || throw TestFailure;
...
যেমন @ জেসম00 বলেছেন, এই জাতীয় পরীক্ষাটি আপনার প্রোগ্রামের চেয়ে ভাষা বাস্তবায়ন পরীক্ষা করে । এই পরীক্ষাগুলি কখনই ভাল ধারণা নয়: আপনি যদি ভাষা প্রয়োগের উপর বিশ্বাস নাও করেন তবে আপনার বাইরে থেকে এটি পরীক্ষা করা উচিত , কারণ পরীক্ষাগুলি সঠিকভাবে চালানোর জন্য এটি বিশ্বাস করা যায় না!
সুতরাং এটি তত্ত্ব; অনুশীলন সম্পর্কে কি? এনামগুলির এই বৈশিষ্ট্যটির মূল সমস্যাটি হ'ল 'রিয়েল ওয়ার্ল্ড' প্রোগ্রামগুলি খুব কমই স্ব-অন্তর্ভুক্ত থাকে: আমাদের উত্তরাধিকার সংস্করণ, দূরবর্তী / এমবেডড মোতায়েন, historicalতিহাসিক ডেটা, ব্যাকআপ, লাইভ ডাটাবেস ইত্যাদি রয়েছে তাই আমরা কখনই 'সুইচ আউট' করতে পারি না কিছু ব্যবহার মিস না করে একটি নামের সমস্ত ঘটনা।
তবুও এ জাতীয় জিনিসগুলি এনামের নিজের দায়বদ্ধতা নয়: এনাম পরিবর্তন করা দূরবর্তী সিস্টেমের সাথে যোগাযোগকে ভেঙে দিতে পারে, তবে বিপরীতভাবে আমরা এনাম পরিবর্তন করে এ জাতীয় সমস্যা সমাধান করতে পারি !
যেমন পরিস্থিতিতে, enum একটি লাল-হেরিং হল: এক সিস্টেম এটা করা প্রয়োজন কি যদি এই পথ, এবং অন্য দরকার হতে যে উপায়? এটি উভয়ই হতে পারে না, আমরা যত পরীক্ষাই লিখি না! এখানে আসল অপরাধী হ'ল ইনপুট / আউটপুট ইন্টারফেস, যা "যে কোনও সংখ্যার পূর্ণরূপ ব্যাখ্যা করবে" তার চেয়ে ভালভাবে সংজ্ঞায়িত ফর্ম্যাটগুলি উত্পাদন / গ্রহণ করা উচিত। সুতরাং আসল সমাধানটি হ'ল আই / ও ইন্টারফেসগুলি পরীক্ষা করা: ইউনিট পরীক্ষার সাহায্যে এটি প্রত্যাশিত ফর্ম্যাটটি পার্সিং / প্রিন্ট করছে কিনা তা পরীক্ষা করে এবং সংহতকরণ পরীক্ষার সাহায্যে ফর্ম্যাটটি আসলে অন্য পক্ষের দ্বারা গ্রহণ করা হয়েছে কিনা তা পরীক্ষা করে।
আমরা এখনও ভাবতে পারি যে এনামটি 'যথেষ্ট পরিমাণে অনুশীলন করা হচ্ছে', তবে এই ক্ষেত্রে এনাম আবার একটি লাল রঙের হারিং ring আমরা আসলে যা উদ্বিগ্ন তা হ'ল টেস্ট স্যুট নিজেই । আমরা এখানে বেশ কয়েকটি উপায়ে আত্মবিশ্বাস অর্জন করতে পারি:
- কোড কভারেজ আমাদের বলতে পারে যে পরীক্ষার স্যুট থেকে আসা বিভিন্ন এনাম মানগুলি কোডের বিভিন্ন শাখাকে ট্রিগার করার জন্য যথেষ্ট। যদি তা না হয় তবে আমরা পরীক্ষাগুলি যুক্ত করতে পারি যা অনাবৃত শাখাগুলি ট্রিগার করে, বা বিদ্যমান পরীক্ষাগুলিতে বিস্তৃত বিভিন্ন এনাম তৈরি করতে পারে।
- সম্পত্তি যাচাই আমাদের জানাতে পারে যে কোডের বিভিন্ন শাখাগুলি রানটাইম সম্ভাবনাগুলি পরিচালনা করার জন্য যথেষ্ট কিনা is উদাহরণস্বরূপ, যদি কোডটি কেবলমাত্র পরিচালনা করে
red
এবং আমরা কেবল এটি দিয়ে পরীক্ষা red
করি তবে আমাদের 100% কভারেজ রয়েছে। একটি সম্পত্তি যাচাইকারী আমাদের দাবিগুলিতে পাল্টা নমুনা তৈরি করার চেষ্টা করবে (যেমন) আমরা যে পরীক্ষাগুলিতে ভুলে গিয়েছি green
এবং blue
মানগুলি তৈরি করে ।
- মিউটেশন টেস্টিং আমাদের বলতে পারে যে আমাদের দাবিগুলি প্রকৃতপক্ষে কেবল শাখা অনুসরণ করা এবং তাদের পার্থক্যগুলি উপেক্ষা করার পরিবর্তে এনাম পরীক্ষা করে।