আমি বেশ বাস্তববাদী, তবে এখানে আমার প্রধান উদ্বেগটি হ'ল আপনি ConfigBlock
সম্ভবত এটি সম্ভবত আপনার খারাপ ইন্টারফেসের নকশাকে আধিপত্য বিস্তার করতে দিচ্ছেন। আপনার যখন এই জাতীয় কিছু থাকে:
explicit MyGreatClass(const ConfigBlock& config);
... আরও উপযুক্ত ইন্টারফেস এর মত হতে পারে:
MyGreatClass(int foo, float bar, const string& baz);
... এই foo/bar/baz
ক্ষেত্রগুলিকে প্রচুর পরিমাণে চেরি-বাছাইয়ের বিপরীতে ConfigBlock
।
অলস ইন্টারফেস ডিজাইন
প্লাস পাশে, এই ধরণের ডিজাইনটি আপনার নির্মাণকারীর জন্য একটি স্থিতিশীল ইন্টারফেস ডিজাইন করা সহজ করে তোলে, যেমন, যেহেতু আপনার যদি নতুন কোনও প্রয়োজনের প্রয়োজন হয় তবে আপনি কেবল ConfigBlock
এটিকে লোড করতে পারেন (সম্ভবত কোনও কোড পরিবর্তন ছাড়াই) এবং পরে চেরি- কোনও ধরণের ইন্টারফেস পরিবর্তন ছাড়াই আপনার যা প্রয়োজন নতুন জিনিসগুলি বেছে নিন, কেবলমাত্র প্রয়োগের পরিবর্তন MyGreatClass
।
সুতরাং এটি উভয় ধরণের প্রো এবং কন যে এটি আপনাকে আরও সতর্কতার সাথে চিন্তা-ভাবনা ইন্টারফেস ডিজাইনে মুক্তি দেয় যা কেবলমাত্র এটির প্রয়োজনীয় ইনপুট গ্রহণ করে। এটি এই মানসিকতার প্রয়োগ করে, "কেবলমাত্র আমাকে এই বিশাল অঙ্কের ডেটা দিন, আমি এর থেকে আমার যা প্রয়োজন তা তা তুলে নেব" এর মতো আরও কিছু এর বিপরীতে, "এই স্পেসিফিক কাজের জন্য এই নির্দিষ্ট পরামিতিগুলির প্রয়োজন" "
সুতরাং এখানে অবশ্যই কিছু পক্ষ রয়েছে, তবে এগুলি কনস দ্বারা খুব বেশি ভারী হতে পারে।
সংযোজন
এই দৃশ্যে, ConfigBlock
উদাহরণস্বরূপ তৈরি হওয়া এই জাতীয় সমস্ত শ্রেণিগুলির নির্ভরতাগুলি দেখতে এরকম হয়:
এটি পিটাতে পরিণত হতে পারে, উদাহরণস্বরূপ, যদি আপনি Class2
এই চিত্রটিতে বিচ্ছিন্নভাবে পরীক্ষা করতে চান । ConfigBlock
প্রাসঙ্গিক ক্ষেত্রগুলি সহ বিভিন্ন ইনপুটগুলি আপনাকে পর্যাপ্তরূপে অনুকরণ Class2
করতে হতে পারে বিভিন্ন শর্তে এটি পরীক্ষা করতে সক্ষম হতে আগ্রহী।
যে কোনও নতুন প্রসঙ্গে (ইউনিট পরীক্ষা বা পুরো নতুন প্রকল্প যাই হোক না কেন), এই জাতীয় কোনও শ্রেণি (পুনরায়) ব্যবহারের বোঝা হয়ে উঠতে পারে, যেহেতু আমরা সর্বদা ConfigBlock
যাত্রায় যাত্রা চালিয়ে আসি এবং সেটআপ করি সেই অনুযায়ী।
পুনর্ব্যাবহার্যোগ্যতা / Deployability / Testability
পরিবর্তে আপনি যদি এই ইন্টারফেসগুলি যথাযথভাবে ডিজাইন করেন তবে আমরা সেগুলি ডিকুয়াল করে এ জাতীয় ConfigBlock
কিছু দিয়ে শেষ করতে পারি:
আপনি যদি এই উপরের চিত্রটিতে লক্ষ্য করেন তবে সমস্ত শ্রেণিগুলি স্বতন্ত্র হয়ে উঠবে (তাদের অভিজাত / বহির্গামী দম্পতিরা 1 দ্বারা হ্রাস পাবে)।
এটি অনেক বেশি স্বতন্ত্র শ্রেণীর দিকে পরিচালিত করে (কমপক্ষে স্বতন্ত্র ConfigBlock
) যা নতুন পরিস্থিতিতে / প্রকল্পগুলিতে পুনরায় ব্যবহার / পরীক্ষা করা সহজ হতে পারে।
এখন এই Client
কোডটি এমন একটির সমাপ্তি ঘটে যা সমস্ত কিছুর উপর নির্ভর করে এবং সমস্ত একসাথে একত্রিত করতে হয়। এ থেকে উপযুক্ত ক্ষেত্রগুলি পড়তে ConfigBlock
এবং পরামিতি হিসাবে যথাযথ শ্রেণিতে পাস করার জন্য বোঝাটি এই ক্লায়েন্ট কোডটিতে স্থানান্তরিত হয় । তবুও এই জাতীয় ক্লায়েন্ট কোডটি সাধারণত একটি নির্দিষ্ট প্রেক্ষাপটের জন্য সংকীর্ণভাবে ডিজাইন করা হয় এবং এর পুনরায় ব্যবহারের সম্ভাবনা সাধারণত জিলচ বা বন্ধ হয়ে যায় (এটি আপনার অ্যাপ্লিকেশনটির main
প্রবেশ পয়েন্ট ফাংশন বা এর মতো কিছু হতে পারে )।
সুতরাং পুনঃব্যবহারযোগ্যতা এবং পরীক্ষার দৃষ্টিকোণ থেকে, এই শ্রেণিগুলিকে আরও স্বাধীন করতে সহায়তা করতে পারে। আপনার ক্লাসগুলি যারা ব্যবহার করছেন তাদের ইন্টারফেসের দিক থেকে এটি স্পষ্টভাবে বলতে সাহায্য করতে পারে যে কেবলমাত্র একটি বৃহত্তর পরিবর্তে তাদের প্রয়োজনীয় প্যারামিটারগুলি ConfigBlock
যা সমস্ত কিছুর জন্য প্রয়োজনীয় ডেটা ফিল্ডগুলির পুরো বিশ্বজগতকে মডেল করে।
উপসংহার
সাধারণভাবে, এই ধরণের শ্রেণিকেন্দ্রিক নকশা যা একটি মনোলিথের উপর নির্ভর করে যার মধ্যে প্রয়োজনীয় সমস্ত কিছু রয়েছে এই ধরণের বৈশিষ্ট্যগুলি। তাদের প্রয়োগযোগ্যতা, ব্যবহারযোগ্যতা, পুনরায় ব্যবহারযোগ্যতা, পরীক্ষাযোগ্যতা ইত্যাদি ফলস্বরূপ উল্লেখযোগ্যভাবে হ্রাস পেতে পারে। তবুও তারা ধরণের ইন্টারফেস ডিজাইনকে সহজ করতে পারে যদি আমরা এটির উপর ইতিবাচক স্পিন চেষ্টা করি। আপনার পক্ষে সেই সমস্ত উপকারিতা এবং বিপরীতে পরিমাপ করা এবং ট্রেড-অফগুলি উপযুক্ত কিনা তা স্থির করে নেওয়া আপনার পক্ষে up সাধারণত এই ধরণের ডিজাইনের বিরুদ্ধে ভুল করা অনেক বেশি নিরাপদ যেখানে আপনি ক্লাসগুলির একরঙা থেকে চেরি-বাছাই করছেন যা সাধারণত আরও সাধারণ এবং ব্যাপকভাবে প্রয়োগযোগ্য ডিজাইনের মডেল করার উদ্দেশ্যে তৈরি হয়।
সর্বশেষ তবে কম নয়:
extern CodingBlock MyCodingBlock;
... নির্ভরতা ইনজেকশন পদ্ধতির চেয়ে উপরে বর্ণিত বৈশিষ্ট্যের দিক থেকে এটি সম্ভবত আরও খারাপ (আরও স্কিউড?), কারণ এটি কেবল আপনার ক্লাসগুলিকেই সংযুক্ত করে না ConfigBlocks
, কেবল এটির একটি নির্দিষ্ট উদাহরণেও যুক্ত হয়। এটি আরও প্রযোজ্যতা / প্রয়োগযোগ্যতা / পরীক্ষার যোগ্যতা হ্রাস করে।
আমার সাধারণ পরামর্শটি ইন্টারফেসগুলি ডিজাইনের পক্ষে ভ্রান্ত হতে হবে যা আপনার পরামিতিগুলি সরবরাহ করার জন্য এই ধরণের মনোলিথগুলির উপর নির্ভর করে না, আপনি সাধারণত ডিজাইন করেন এমন সাধারণভাবে প্রয়োগযোগ্য ক্লাসগুলির জন্য। এবং নির্ভরতা ইনজেকশন ছাড়াই বিশ্বব্যাপী দৃষ্টিভঙ্গি এড়িয়ে চলুন যদি আপনি না পারেন যদি আপনি সত্যই এটির এড়াতে না চান এমন একটি দৃ strong় এবং আত্মবিশ্বাসী কারণ না থাকে।