কেন আমাদের গতিশীল টাইপ করা ভাষায় এনাম দরকার?


32

আমি এখানে কিছু কোড পড়ছিলাম এবং দেখেছি যে একটি এনাম এইচটিএমএল ট্যাগগুলির নাম সংরক্ষণ করতে ব্যবহৃত হয়। আমাদের কখনই এটি করা দরকার? এই কৌশলটি ব্যবহার করে আমি কী সুবিধা পাব?

আমি জানি যে সংকলিত বা স্ট্যাটিকালি টাইপ করা ভাষায় এনামগুলি কতটা দরকারী তবে আমি যখন উদাহরণস্বরূপ উপরে বর্ণিত কোডের মতো ডায়ামিকালি টাইপ করা ভাষায় এনাম দেখি তখন আমি কৌতূহলী হয়ে উঠি। সুতরাং, প্রশ্নটি মূলত এটিকে ফুটিয়ে তোলে যে কেন আমাদের গতিশীলভাবে টাইপ করা ভাষায় এনামগুলির প্রয়োজন বা আমাদের এগুলি আদৌ প্রয়োজন?


38
এই প্রশ্নটি মূলত "আমাদের প্রকারের প্রয়োজন কেন"
ব্যবহারকারী 11153

1
রেপো এটি কীভাবে বলা হচ্ছে তা অনুসন্ধান করার জন্য? এটি সম্ভবত আপনি প্রাপ্ত উত্তরগুলি সম্পর্কে আরও ভাল বোঝার সুযোগ পাবেন।
রাবারডাক

আপনার যদি থাকে: enum People { YOU, NPC, FOO, BAR }এবং একটি ফাংশন যা একটি (লোক) চায় int, আপনি কোনও সংখ্যা ব্যবহার না করে যা কিছু প্লাগ করতে পারেন।
ইভান কার্সলেকে

3
আপনি কি কোনও বিশেষ ভাষায় এই বিশেষ "এনাম" এর উদ্দেশ্য সম্পর্কে বা সাধারণভাবে এনামগুলির উদ্দেশ্য সম্পর্কে জিজ্ঞাসা করছেন? আমি প্রাক্তনটি ধরে
নিব

উত্তর:


56

একটি সুবিধাটি হ'ল সংকলকটি আপনাকে জানাতে পারে যে আপনি যদি দুর্ঘটনাক্রমে "অ্যাড্রেস" বা "ফিল্ডসেট" টাইপ করেন এবং রানটাইমে অযৌক্তিক আচরণ না করে পরিবর্তে আপনাকে তা ঠিক করার পরে ting

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


4
@ এমন: আপনি পারতেন, তবে এনামগুলি আপনাকে সংঘর্ষ না হওয়ার জন্য একটি কার্যকর ব্যবস্থা দেয়।
কিয়াসনাম

75
যে জায়গার জন্য আমি একবার কাজ করেছিলাম এমন এক মাসের জন্য এনাম, দুর্বল সম্পাদক ফন্টের পরিবর্তে স্ট্রিং কনস্ট্যান্টগুলি ব্যবহার করার জন্য কারও উজ্জ্বল ধারণা দ্বারা সৃষ্ট বাগের পিছনে পিছনে পিছনে পিছনে পিছনে ছুটতে হয়েছিল, এবং দুর্ঘটনাক্রমে একটি ক্ষেত্রের নাম দেওয়া হয়েছে"PROF1LE_"
রোবট

8
@ আমন গো ঠিক এটি করে। এনামগুলির সম্পর্কে একটি দুর্দান্ত বিষয়, তবে, সংকলকটি পরীক্ষা করতে পারে যে আপনার সুইচ স্টেটমেন্টটিতে প্রতিটি সম্ভাব্য এনাম মানের জন্য একটি মামলা রয়েছে।
weberc2

15
এই কোডটি 80 এর দশকে লেখা হয়েছিল। আপনি এটি বুঝতে পারেন না, তবে এটি এমন এক যুগে ছিল যখন কিছু বিকাশকারী শারীরিক টাইপরাইটারগুলিতে বিকাশ করতে শিখেছিল, যার কোনও একটি কীও ছিল না । যদিও আমি বুঝতে পেরেছি যে প্রশ্নটির স্ট্রিংটি ছিল "প্রোফাই 1 ই" ... পঁচিশ বছর হয়ে গেছে, তাই আমার স্মৃতি স্পষ্টতই নিখুঁত নয়।
রোবটটি

4
@ ড্যারেলহফম্যান: আমি অবাক হয়েছি যে আপনি অবাক হয়েছেন। পার্লে, আমি $1যখন বলতে চাইছি আমি প্রায়শই নিজেকে টাইপ করতে দেখি $i। (মঞ্জুর, আমি টাইপ না f1leপরিবর্তে file- $1ভুল যে দ্বারা primed হয় $1। পার্ল খুব সাধারণ - কিন্তু এখনও সমস্ত প্রকারের ভুল সাধারণ হয়তো দেব সঙ্গে একটি পাসওয়ার্ড ছিল prof1leতাতে ফলে mistype তাদের priming profileঅ-পাসওয়ার্ড প্রসঙ্গে in)
রুখ

22

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

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


1
"স্ব-ডকুমেন্টিং" সর্বাধিক গুরুত্বপূর্ণ অংশ। আমি তার status === GEOLOCATION_ACQUIREDচেয়ে অনেক বেশি পরীক্ষা করব status === 3, যাতে যে সফ্টওয়্যারটি বজায় রাখে সে বুঝতে পারে যে কি চলছে। যেমনটি আপনি বলেছেন, এটি অবৈধ মানগুলিও প্রতিরোধ করে।
নিকোলাস বাউলিয়ান

11

এনওপ্সের ওওপি-র সাথে কোনও সম্পর্ক নেই এবং জাভাস্ক্রিপ্টের এনাম নেই। পরিবর্তে, যখনই মানগুলির একটি নির্দিষ্ট সেটের মধ্যে পছন্দ থাকে তখন এনামগুলি ব্যবহৃত হয়। উদাহরণস্বরূপ, একটি বুলিয়ান সত্য এবং মিথ্যা মধ্যে একটি পছন্দ, যা হিসাবে প্রয়োগ করা যেতে পারে enum Bool { False, True }। একটি জিইউআই লাইব্রেরিতে, আমাদের সারিবদ্ধকরণের জন্য একটি এনাম থাকতে পারে:enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }

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

এখন অবধি, আমরা ঠিক পাশাপাশি ধ্রুবক ব্যবহার করতে পারতাম const int LEFT = -1, CENTER = 0, RIGHT = 1। তবে, একটি সংকলক জানে যে এনাম মানগুলি একত্রে অন্তর্ভুক্ত। সুতরাং যখন আমি এনাম মানগুলিতে স্যুইচ করি switch(value) {case LEFT: ...; case RIGHT: ...;}, সংকলক আমাকে সতর্ক করতে পারে যে আমি ভুলে গেছিCENTER । এটি একটি যথেষ্ট সময় সাশ্রয়কারী হতে পারে। এনামগুলি ব্যতীত বা সুইচ-কেস নির্মাণ ছাড়া ভাষাগুলিতে এটি ভিজিটর প্যাটার্নের সাথে সিমুলেটেড করা যায়, যদিও এটি স্ট্যাটিক টাইপিংয়ের উপস্থিতিতে আরও সহায়ক more

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

জাভাস্ক্রিপ্টে, আমরা এই সুবিধাগুলির কোনওটিই পাই না। প্রদত্ত উদাহরণ একটি এনাম হিসাবে বিবেচিত একটি অবজেক্টকে ঘোষণা করে। এটির প্রোগ্রামারটির কিছু সুবিধা রয়েছে, যেমন এটি ডকুমেন্টেশনকে সহজ করে তোলে, সমস্ত "ধ্রুবককে" একক বস্তুতে গ্রুপ করে,…। যাইহোক, এটি কেবল একটি কনভেনশন যে এই জাতীয় বস্তুটি এনামের মতো।

এখানে মূল বিষয়টি হ'ল এইচটিএমএলটিতে কেবলমাত্র একটি সীমাবদ্ধ এবং পরিচিত ট্যাগ রয়েছে। আপনি এইচটিএমএল 5 স্পেসিফিকেশনটি দেখতে পারেন এবং এই কোডটির নামগুলি আপনার কোডে এনাম হিসাবে রাখতে পারেন এবং তাই <blink>আপনার প্রোগ্রামে কোনও ট্যাগ ছিঁড়ে ফেলা আরও কঠিন করে তোলে । এই জ্ঞানটি এক জায়গায় এনকোড করা ভাল যে আপনার কোডটি বিশেষ স্ট্রিং লিটারেলগুলি (বা আরও খারাপ, যাদু সংখ্যার) সাথে লিটার করে দেওয়া।


সেক্ষেত্রে আমি <blink>জাভাস্ক্রিপ্টে কোনও পদ্ধতিতে পাস করলে কিছুই আমাকে ঠিক আটকাতে পারে না? তবে java
হ্যালোতে

@ কোডডোগি হ্যাঁ, কারণ জেএসের একটি স্ট্যাটিক টাইপ সিস্টেম নেই এবং বিশেষত এনাম ধরণের কোনও ধারণা নেই। যাইহোক, আমি কোনও পদ্ধতি প্যারামিটারটিকে "একটি ট্যাগনাম" হিসাবে নথিভুক্ত করতে পারি, যা কোনও প্রোগ্রামারকে এটি চাওয়ার জন্য নেতৃত্ব দেয় foo(TagName.STRONG)যা কিছুটা ভাল। ক্ষেত্রটির অস্তিত্ব না থাকলে জেএস অভিযোগ জানালে আরও ভাল হয়, তবে undefinedআমি চেষ্টা করলেই আমরা কেবল একটি পাই TagName.BLINK। এটি জেএস-তে খুব একটা মূল্যবান নয়, তবে এটি একটি শুরু।
আমন

হুম, আমি উপরে উল্লিখিত কোড লিঙ্কটি ক্লোজার সংকলক ব্যবহার করে তাই সেখানে বোঝা যায়।
কোডয়োগি

ক্লোজওর একটি কার্যকরী ভাষা তাই আমি নিশ্চিত না যে ওওপি প্রশ্নের সাথে কীভাবে প্রাসঙ্গিক তবে এ এনওমের মধ্যে পার্থক্য করা গুরুত্বপূর্ণ যা সাধারণত সংখ্যার সেট (ওও নয়) এবং 'টাইপসেফ এনাম' প্যাটার্ন যা ওও এবং যা জাভা সমর্থন করে।
জিমি জেমস

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

3

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

উদাহরণস্বরূপ আপনি জাভাস্ক্রিপ্টে কোনও বস্তুর আক্ষরিক মতো এনাম ব্যবহার করেন, আপনার সম্পাদক আপনাকে কোড সমাপ্তি দেবে এবং আপনার কোড জেএসহিন্ট বা জেএসলিন্টের মতো পরীক্ষক আপনাকে সতর্ক করবে, যদি আপনি ভুলবশত ভুল মান ব্যবহার করেন।


আমি মনে করি অন্যান্য প্রতিক্রিয়াগুলির অনেকগুলিই এই পয়েন্টটি মিস করে বা পরাজিত করে। একটি গতিশীল ভাষায় একটি 'ইমাম' ব্যবহার করা কোনও সংকলকের জন্য কিছু নাও করতে পারে তবে এটি কিছু আইডিই, ডকুমেন্টেশন সরঞ্জামগুলিতে সত্যই সহায়তা করতে পারে এবং কোডটি বোঝার চেষ্টা করা মানুষকেও ভুলে যায় না।
রবার্ট

2

এই জাতীয় এনামের মূল বিষয়টি হতে পারে জেএস এপি (গুগ) অনুমোদিত ট্যাগগুলির সেট / বান্ডেল। কোনটা? ডাব্লু 3 সি এইচটিএমএল 4.01 দ্বারা সংজ্ঞায়িত ( এনামের ডকুমেন্টেশন পরীক্ষা করে দেখুন )। সুতরাং এটি সেটিংস সীমানা।

এটি আসল লক্ষ্য হতে পারে বা নাও হতে পারে, তবে এ জাতীয় উদ্দেশ্যে এটি ঠিক কাজ করবে।

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

জাভাস্ক্রিপ্ট একদিকে রেখে, আমি মডেলিং এবং রাষ্ট্রীয় মেশিন পরিচালনার জন্য এনামগুলিকে প্রচুর ব্যবহার করি ।

শুরু >> IN_PROGPress> নিশ্চিত> সমাপ্ত> ...

জাভা সুইচ পারবেন enums তাই একটি মধ্যে বৈধকরণ রাজ্যের বেশ সহজ রাষ্ট্র মেশিন , লুপ সব enum ধরে জটিল enums করে অগ্রাধিকার নির্ধারণ করতে ...

আমি এগুলি টাইপড এবং অপ্রয়োজনীয় ধ্রুবকগুলির সংজ্ঞা দিতেও ব্যবহার করি:

  • হ্যাঁ না

জটিল এনামগুলি (যা নিরাপদ রূপান্তর / পার্সার করতে দেয়)

  • হ্যাঁ (1, সত্য), না (0, মিথ্যা)

এনামগুলি প্রায়শই আমার মডেল স্তর (মূল) এর সাথে সম্পর্কিত, এর বৈশিষ্ট্যগুলি সমস্ত সিস্টেমে অ্যাক্সেসযোগ্য তাই এটি কার্যকরী মডেল হয়ে যায় এবং আমি একটি কম সংযোগ রাখি।

এনামগুলি যা দেয় (অন্যান্য জিনিসগুলির মধ্যে রয়েছে) তা হ'ল সীমানা এবং প্রকরণ

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