নির্ভরতা ইনজেকশন করার সর্বোত্তম উপায় সম্পর্কে একটি পুরানো, পুরানো চলমান বিতর্ক রয়েছে।
বসন্তের আসল কাটটি একটি সরল বস্তু ইনস্ট্যান্টিয়েটেড করে এবং তারপরে সেটার পদ্ধতিগুলির পরে নির্ভরতা ইনজেকশন করে।
কিন্তু তারপরে লোকেরা একটি বৃহত আকস্মিকতা জোর দিয়েছিল যে কনস্ট্রাক্টর প্যারামিটারগুলির মাধ্যমে ইনজেকশন নির্ভরতা হ'ল এটি করার সঠিক উপায়।
তারপরে, ইদানীং, প্রতিবিম্বটি ব্যবহার করা আরও সাধারণ হয়ে উঠলে বেসরকারী সদস্যদের মান নির্ধারণ, সেটটার বা কনস্ট্রাক্টর আরগস ছাড়াই রাগ হয়ে যায়।
সুতরাং আপনার প্রথম নির্মাতা নির্ভরতা ইনজেকশনের দ্বিতীয় পদ্ধতির সাথে সামঞ্জস্যপূর্ণ। এটি আপনাকে পরীক্ষার জন্য মজ ইনজেক্টের মতো দুর্দান্ত জিনিসগুলি করতে দেয়।
তবে নো-আর্গুমেন্ট কনস্ট্রাক্টরের এই সমস্যা রয়েছে। যেহেতু এটি বাস্তবায়ন ক্লাসগুলির জন্য ইনস্ট্যান্ট করছে PaypalCreditCardProcessor
এবং DatabaseTransactionLog
, এটি পেপাল এবং ডেটাবেসগুলিতে একটি কঠিন, সংকলন-সময় নির্ভরতা তৈরি করে। সম্পূর্ণ নির্ভরশীলতা গাছটি সঠিকভাবে তৈরি এবং কনফিগার করার জন্য এটি দায়িত্ব গ্রহণ করে।
কল্পনা করুন যে পেপেই প্রসেসরটি একটি সত্যই জটিল সাবসিস্টেম, এবং অতিরিক্ত সমর্থন লাইব্রেরিগুলিতেও টানছে। সেই বাস্তবায়ন শ্রেণীর উপর একটি সংকলন-সময় নির্ভরতা তৈরি করে আপনি সেই পুরো নির্ভরতা গাছের সাথে একটি অলঙ্ঘনীয় লিঙ্ক তৈরি করছেন। আপনার অবজেক্ট গ্রাফের জটিলতা সবেমাত্র মাত্রার ক্রম দিয়ে লাফিয়ে উঠেছে, সম্ভবত দুটি।
নির্ভরতা গাছের সেই সমস্ত আইটেম স্বচ্ছ হবে তবে তাদের অনেকগুলি তাত্ক্ষণিক হওয়া দরকার to মতভেদগুলি হল, আপনি কেবলমাত্র একটি ইনস্ট্যান্ট করতে সক্ষম হবেন না PaypalCreditCardProcessor
।
ইনস্ট্যান্টেশন ছাড়াও, প্রতিটি বস্তুর জন্য কনফিগারেশন থেকে প্রয়োগ হওয়া বৈশিষ্ট্যের প্রয়োজন হবে।
যদি আপনার কেবল ইন্টারফেসের উপর নির্ভরশীলতা থাকে এবং কোনও বহিরাগত কারখানাকে নির্ভরতা তৈরি করতে এবং ইনজেকশনের অনুমতি দেয় তবে তারা আপনাকে পুরো পেপাল নির্ভরতা গাছ কেটে দেয় এবং আপনার কোডের জটিলতা ইন্টারফেসে থামে।
অন্যান্য সুবিধা রয়েছে যেমন কনফিগারেশনে বাস্তবায়ন ক্লাস নির্দিষ্ট করা (যেমন রচনা সময়ে সংকলনের পরিবর্তে রানটাইমের সময়), বা আরও গতিশীল নির্ভরশীলতার স্পেসিফিকেশন রয়েছে যা পরিবর্তিত হয়, বলুন পরিবেশ অনুসারে (পরীক্ষা, সংহতকরণ, উত্পাদন)।
উদাহরণস্বরূপ, ধরা যাক যে পেপালপ্রসেসরের 3 টি নির্ভরশীল অবজেক্ট ছিল এবং সেই সমস্ত নির্ভরতার প্রত্যেকটির আরও দুটি ছিল। এবং এই সমস্ত বস্তুর কনফিগারেশন থেকে বৈশিষ্ট্য টানতে হবে। কোডটি হ'ল এই সমস্তটি তৈরি করার, কনফিগারেশন থেকে বৈশিষ্ট্য নির্ধারণ ইত্যাদির দায়িত্ব গ্রহণ করবে - ডিআই কাঠামো যে সমস্ত উদ্বেগের যত্ন নেবে।
আপনি ডিআই ফ্রেমওয়ার্ক ব্যবহার করে নিজেকে কী রক্ষা করছেন তা প্রথমে স্পষ্ট না মনে হতে পারে তবে এটি যুক্ত হয়ে যায় এবং সময়ের সাথে সাথে বেদনাদায়ক স্পষ্ট হয়ে ওঠে। (আমি খুব কঠিনভাবে এটি করার চেষ্টা করার অভিজ্ঞতা থেকে বলছি)
...
অনুশীলনে, এমনকি একটি অতি ক্ষুদ্র প্রোগ্রামের জন্যও আমি ডিআই শৈলীতে লেখার সমাপ্তি খুঁজে পেয়েছি এবং ক্লাসগুলি বাস্তবায়ন / কারখানার জোড়ায় ভাগ করে নিই। এটি, যদি আমি স্প্রিংয়ের মতো কোনও ডিআই ফ্রেমওয়ার্ক ব্যবহার না করে থাকি তবে আমি কয়েকটি সহজ কারখানার ক্লাস একসাথে ফেলে দিই।
এটি উদ্বেগের বিচ্ছেদকে সরবরাহ করে যাতে আমার ক্লাসটি কেবল এটিই করতে পারে এবং কারখানা শ্রেণি স্টাফ তৈরি এবং কনফিগার করার দায়িত্ব গ্রহণ করে।
প্রয়োজনীয় পদ্ধতির নয়, তবে এফডাব্লুআইডাব্লু
...
আরও সাধারণভাবে, ডিআই / ইন্টারফেস প্যাটার্ন দুটি কোড করে আপনার কোডের জটিলতা হ্রাস করে:
সর্বোপরি, যেহেতু অবজেক্ট ইনস্ট্যান্টেশন এবং কনফিগারেশন একটি খুব পরিচিত কাজ, তাই ডিআই ফ্রেমওয়ার্ক স্ট্যান্ডার্ডযুক্ত স্বরলিপি এবং প্রতিবিম্বের মতো কৌশল ব্যবহার করে প্রচুর পরিমাণে অর্থনীতি অর্জন করতে পারে। ক্লাসের চারপাশে সেই একই উদ্বেগ ছড়িয়ে দেওয়া শেষ পর্যন্ত যে কোনও ব্যক্তির ভাবেন না তার চেয়ে অনেক বেশি গোলমাল যুক্ত হয়।