ঠিক আছে, আমি মনে করি এটি যথেষ্ট ভাল এবং যথেষ্ট মধ্যে পার্থক্য ডান ।
বেশিরভাগ ক্ষেত্রে আপনি অন্যান্য প্যাটার্নগুলি (কৌশল বা সম্ভবত ফ্লাইওয়েট) প্রয়োগ করে ধ্রুবকের ব্যবহার এড়াতে পারবেন, এমন একটি ধারণা রয়েছে যা একটি ধারণার প্রতিনিধিত্ব করার জন্য আরও অর্ধ ডজন অন্যান্য শ্রেণীর প্রয়োজন হয় না। আমি মনে করি এটি কীভাবে ফুটে উঠেছে, অন্যান্য ধ্রুবকগুলির প্রয়োজনের কতটা সম্ভাবনা রয়েছে। অন্য কথায়, ইন্টারফেসে ধ্রুবক দ্বারা সরবরাহ করা ENUM বাড়ানোর দরকার আছে কি? আপনি যদি এটি প্রসারিত করার প্রয়োজনের পূর্বাভাস দিতে পারেন তবে আরও আনুষ্ঠানিক প্যাটার্ন নিয়ে যান। যদি তা না হয় তবে এটি পর্যাপ্ত হতে পারে (এটি যথেষ্ট ভাল হবে, এবং তাই লিখতে এবং পরীক্ষার জন্য কোড কম হবে)। এখানে যথেষ্ট ভাল এবং খারাপ ব্যবহারের উদাহরণ রয়েছে:
খারাপ:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
যথেষ্ট:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
এখন, যে কারণগুলি আমি এই উদাহরণগুলি বেছে নিয়েছি তা সহজ। User
ইন্টারফেস ব্যবহারকারী ধরনের একটি enum সংজ্ঞা করা হয়। এটি সময়ের সাথে সাথে প্রসারিত হওয়ার খুব সম্ভবত এবং এটি অন্য প্যাটার্নের দ্বারা আরও উপযুক্ত। তবে এটি HTTPRequest_1_1
একটি শালীন ব্যবহারের ক্ষেত্রে, যেহেতু এনামটি আরএফসি 2616 দ্বারা সংজ্ঞায়িত হয়েছে এবং শ্রেণীর আজীবন পরিবর্তিত হবে না।
সাধারণভাবে, আমি ধ্রুবক এবং শ্রেণি ধ্রুবকদের সমস্যাটি বিশ্বব্যাপী সমস্যা হিসাবে দেখছি না । আমি এটিকে নির্ভরতার সমস্যা হিসাবে দেখছি। এটি একটি সংকীর্ণ পার্থক্য, তবে একটি নির্দিষ্ট। আমি বৈশ্বিক সমস্যাগুলি যেমন বৈশ্বিক পরিবর্তনশীলগুলির মতো দেখতে পাই যা প্রয়োগ করা হয় না এবং এর ফলে একটি নরম বৈশ্বিক নির্ভরতা তৈরি হয়। তবে একটি হার্ড-কোডেড শ্রেণি একটি বলপূর্বক নির্ভরতা তৈরি করে এবং এর ফলে একটি শক্ত বৈশ্বিক নির্ভরতা তৈরি হয়। সুতরাং উভয়ই নির্ভরতা। তবে আমি প্রয়োগ করি না বলে বিশ্বব্যাপীটিকে আরও খারাপ হিসাবে বিবেচনা করি ... এজন্য আমি একই ব্যানারে বিশ্বব্যাপী নির্ভরতা সহ শ্রেণি নির্ভরতা লম্পট করতে পছন্দ করি না ...
আপনি যদি লিখেন MyClass::FOO
, আপনি বাস্তবায়নের বিশদটি কঠোরভাবে কোডেড MyClass
। এটি একটি হার্ড-কাপলিং তৈরি করে, যা আপনার কোডকে কম নমনীয় করে তোলে এবং এড়ানো উচিত। তবে ঠিক এই ধরণের সংযোগের অনুমতি দেওয়ার জন্য ইন্টারফেস রয়েছে। অতএব MyInterface::FOO
কোনও কংক্রিট মিলনের পরিচয় দেয় না। এই বলে যে, আমি কোনও ইন্টারফেসের সাথে এটির ধ্রুবক যোগ করার জন্য প্রবর্তন করব না।
সুতরাং আপনি যদি ইন্টারফেস ব্যবহার করে থাকেন এবং আপনি খুব নিশ্চিত হন যে আপনার (বা অন্য কারও জন্য) অতিরিক্ত মানের প্রয়োজন হবে না, তবে আমি সত্যিই ইন্টারফেসের ধ্রুবকগুলির সাথে একটি বিশাল সমস্যাটি দেখতে পাচ্ছি না ... সেরা ডিজাইনে কোনও ধ্রুবক বা শর্তসাপেক্ষিক বা যাদু-সংখ্যা বা যাদু-স্ট্রিং বা হার্ড-কোডড কোনও কিছুই অন্তর্ভুক্ত থাকবে না। যাইহোক, এটি বিকাশে অতিরিক্ত সময় যুক্ত করে, যেমন আপনাকে অবশ্যই ব্যবহারগুলি বিবেচনা করতে হবে। আমার দৃষ্টিভঙ্গি হ'ল বেশিরভাগ সময় একটি দুর্দান্ত শক্ত নকশা তৈরি করতে অতিরিক্ত সময় নেওয়া একেবারেই উপযুক্ত। তবে এমন অনেক সময় আসে যখন যথেষ্ট পরিমাণে সত্যিই গ্রহণযোগ্য হয় (এবং এটির অভিজ্ঞতাকে বুঝতে পারলে অভিজ্ঞ বিকাশকারী লাগে) এবং এই ক্ষেত্রে এটি ঠিক আছে।
আবার, এটি সম্পর্কে আমার দৃষ্টিভঙ্গি ...