"নির্ভরতা ইনজেকশন" এবং "নিয়ন্ত্রণের বিপরীতমুখী" প্রায়শই ওয়েব ফ্রেমওয়ার্কগুলি বিকাশের জন্য স্প্রিং ফ্রেমওয়ার্ক ব্যবহারের প্রাথমিক সুবিধা হিসাবে উল্লেখ করা হয়
যদি কেউ সম্ভব হয় তবে এটি উদাহরণের সাথে খুব সাধারণ পদে কী তা ব্যাখ্যা করতে পারে?
"নির্ভরতা ইনজেকশন" এবং "নিয়ন্ত্রণের বিপরীতমুখী" প্রায়শই ওয়েব ফ্রেমওয়ার্কগুলি বিকাশের জন্য স্প্রিং ফ্রেমওয়ার্ক ব্যবহারের প্রাথমিক সুবিধা হিসাবে উল্লেখ করা হয়
যদি কেউ সম্ভব হয় তবে এটি উদাহরণের সাথে খুব সাধারণ পদে কী তা ব্যাখ্যা করতে পারে?
উত্তর:
উদাহরণস্বরূপ : ধরুন আমরা একটি বস্তু আছে Employee
এবং এটি বস্তুর উপর নির্ভরশীলতার হয়েছে Address
। আমরা এর সাথে সম্পর্কিত একটি শিমকে Employee
সংজ্ঞায়িত করব যা বস্তুর উপর তার নির্ভরতা নির্ধারণ করবে Address
।
স্প্রিং যখন কোনও Employee
বস্তু তৈরি করার চেষ্টা করবে, তখন এটি দেখতে পাবে Employee
যেটির উপর নির্ভরতা রয়েছে Address
, তাই এটি প্রথমে Address
বস্তুটি (নির্ভরশীল বস্তু) তৈরি করবে এবং তারপরে এটি Employee
বস্তুকে ইনজেক্ট করবে ।
ইনভার্সন অফ কন্ট্রোল ( আইওসি ) এবং ডিপেন্ডেন্সি ইনজেকশন ( ডিআই ) একে অপরটির পরিবর্তে ব্যবহৃত হয়। আইওসি ডিআইয়ের মাধ্যমে অর্জন করা হয়। ডিআই নির্ভরতা প্রদানের প্রক্রিয়া এবং আইওসি হ'ল ডিআই এর শেষ ফলাফল। ( দ্রষ্টব্য: আইওসি অর্জনের একমাত্র উপায়ই ডিআই নয় There এছাড়াও অন্যান্য উপায়ও রয়েছে ))
ডিআই দ্বারা, বস্তু তৈরির দায়িত্বটি আমাদের অ্যাপ্লিকেশন কোড থেকে স্প্রিং পাত্রে স্থানান্তরিত হয়েছে; এই ঘটনাটিকে আইওসি বলা হয়।
আমি এই দুটি পদ সম্পর্কে আমার সাধারণ বোঝার বিষয়টি লিখব: (দ্রুত বোঝার জন্য কেবল উদাহরণগুলি পড়ুন)
ডিপেন্ডেন্সি ইনজেকশন (ডিআই):
নির্ভরতা ইনজেকশনটির অর্থ সাধারণত কোনও নির্ভরশীল অবজেক্টটিকে কোনও প্যারামিটার হিসাবে কোনও পদ্ধতিতে পাস করার পরিবর্তে পদ্ধতিটি নির্ভর অবজেক্ট তৈরি করা নয় ।
অনুশীলনে এর অর্থ যা হ'ল পদ্ধতিটি নির্দিষ্ট প্রয়োগের উপর সরাসরি নির্ভরতা রাখে না; প্রয়োজনীয়তা পূরণ করে যে কোনও বাস্তবায়ন পরামিতি হিসাবে পাস করা যেতে পারে।
বস্তুর এই প্রয়োগের সাথে তাদের নির্ভরতা নির্ধারণ করে। এবং বসন্ত এটি উপলব্ধ করে তোলে।
এটি আলগাভাবে যুগল প্রয়োগের বিকাশের দিকে পরিচালিত করে।
দ্রুত উদাহরণ: কর্মচারী ওবিজেট যখন তৈরি করা হবে, এটি স্বয়ংক্রিয়ভাবে ঠিকানা তৈরি করবে AD
বিপরীতকরণের নিয়ন্ত্রণ (আইওসি) কনটেইনার:
এটি ফ্রেমওয়ার্কগুলির সাধারণ বৈশিষ্ট্য, আইওসি জাভা অবজেক্টগুলি পরিচালনা করে
- এর বিয়ানফ্যাক্ট্রির মাধ্যমে ইনস্ট্যান্টেশন থেকে ধ্বংস পর্যন্ত।
- জাভা উপাদানগুলি যা আইওসি ধারক দ্বারা তাত্ক্ষণিকভাবে সঞ্চারিত হয় তাকে বিনগুলি বলা হয় এবং আইওসি পাত্রে একটি শিমের স্কোপ, লাইফাইসাইকেল ইভেন্টগুলি এবং এমন কোনও এওপি বৈশিষ্ট্য পরিচালনা করা হয় যার জন্য এটি কনফিগার করা এবং কোড করা হয়েছে। QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it
।
ইনভার্শন অফ কন্ট্রোল প্রয়োগ করে, একটি সফ্টওয়্যার / অবজেক্ট গ্রাহক নিয়ন্ত্রণ করা বা কম বিকল্পের পরিবর্তে সফ্টওয়্যার / অবজেক্টের উপর আরও নিয়ন্ত্রণ / বিকল্পগুলি পান।
ডিজাইনের গাইডলাইন হিসাবে নিয়ন্ত্রণের বিপরীতে নিম্নলিখিত উদ্দেশ্যগুলি পরিবেশন করা হয়:
- বাস্তবায়ন থেকে একটি নির্দিষ্ট কাজ সম্পাদনের একটি ডিকপলিং রয়েছে।
- প্রতিটি মডিউল এটির জন্য কীভাবে ডিজাইন করা হয়েছে তাতে ফোকাস করতে পারে।
- মডিউলগুলি অন্যান্য সিস্টেমগুলি কী করে সে সম্পর্কে কোনও অনুমান করে না তবে তাদের চুক্তিতে নির্ভর করে।
- মডিউলগুলি প্রতিস্থাপনের অন্যান্য মডিউলগুলির কোনও পার্শ্ব প্রতিক্রিয়া নেই
আমি জিনিসগুলি এখানে বিমূর্ত রাখব, আপনি বিষয়টির বিস্তারিত বোঝার জন্য নিম্নলিখিত লিঙ্কগুলিতে দেখতে পারেন।
স্প্রিং অবজেক্টে আলগাভাবে মিলিত হয় অর্থাৎ প্রতিটি শ্রেণি একে অপরের থেকে স্বতন্ত্র থাকে যাতে প্রতিটি জিনিস পৃথকভাবে পরীক্ষা করা যায়। কিন্তু এই ক্লাসগুলি ব্যবহার করার সময়, কোনও শ্রেণি অন্যান্য শ্রেণীর উপর নির্ভরশীল হতে পারে যা প্রথমে ইনস্ট্যান্ট করা দরকার।
সুতরাং, আমরা বসন্তকে বলি যে ক্লাস এ ক্লাস বি এর উপর নির্ভরশীল, সুতরাং, ক্লাস এ এর জন্য শিম (বর্গের মতো) তৈরি করার সময়, এটি ক্লাস এ এর আগে বি শ্রেণিকে ইনস্ট্যান্ট করে এবং সেটার বা কনস্ট্রাক্টর ডিআই পদ্ধতি ব্যবহার করে ক্লাস এতে ইনজেকশন দেয়। অর্থাৎ, আমরা রান-টাইমে বসন্তকে নির্ভরতা বলছি। এটি ডিআই।
যেহেতু, আমরা অবজেক্ট (মটরশুটি) তৈরির জন্য, সেগুলি রক্ষণাবেক্ষণের জন্য এবং তাদের একীকরণগুলিকে হার্ড-কোডিংয়ের পরিবর্তে বসন্তের জন্য দায়িত্ব অর্পণ করছি, আমরা এটিকে ইনভার্শন অফ কন্ট্রোল (আইওসি) বলি।
বিপরীতকরণ নিয়ন্ত্রণ (আইওসি):
আইওসি হ'ল একটি নকশার প্যাটার্ন যা কোনও সিস্টেমে নিয়ন্ত্রণের প্রবাহকে উল্টোপাল্টে বর্ণনা করে, তাই সম্পাদনের প্রবাহ কোডের একটি কেন্দ্রীয় টুকরা দ্বারা নিয়ন্ত্রণ করা হয় না। এর অর্থ হ'ল উপাদানগুলি কেবলমাত্র অন্যান্য উপাদানগুলির বিমূর্ততার উপর নির্ভরশীল এবং নির্ভরশীল অবজেক্টগুলির তৈরি পরিচালনা করার জন্য দায়বদ্ধ নয়। পরিবর্তে, অবলম্বন ইনজেকশন (ডিআই) এর মাধ্যমে আইওসি পাত্রে রানটাইমের সময় অবজেক্টের দৃষ্টান্ত সরবরাহ করা হয়।
আইওসি আরও ভাল সফ্টওয়্যার ডিজাইন সক্ষম করে যা পুনরায় ব্যবহার, আলগা দম্পতি এবং সফ্টওয়্যার উপাদানগুলির সহজ পরীক্ষার সুবিধার্থে।
নির্ভরতা ইনজেকশন (ডিআই):
ডিআই হ'ল একটি অবজেক্টের কনস্ট্রাক্টরের উপর নির্ভরতা পাস করার একটি কৌশল। যদি ধারকটি থেকে বস্তুটি লোড করা হয়ে থাকে তবে তার নির্ভরতাগুলি স্বয়ংক্রিয়ভাবে ধারক দ্বারা সরবরাহ করা হবে। এটি আপনাকে ম্যানুয়ালি কোনও উদাহরণ তৈরি না করে নির্ভরতা গ্রাস করতে দেয়। এটি সংযুক্তিকে হ্রাস করে এবং আপনাকে অবজেক্টের দৃষ্টান্তগুলির আজীবন বৃহত্তর নিয়ন্ত্রণ দেয়।
বসন্ত: বসন্তটি জাভা প্ল্যাটফর্মের জন্য "নিয়ন্ত্রণের বিপরীতমুখী" ধারক।
ইনভার্শন অফ কন্ট্রোল (আইওসি): ইনভার্শন অফ কন্ট্রোল (আইওসি) হ'ল একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং অনুশীলন, যার মাধ্যমে অবজেক্ট কাপলিং রানটাইমগুলিতে "এসেম্ববলার" অবজেক্ট দ্বারা আবদ্ধ হয় এবং স্থির বিশ্লেষণ ব্যবহার করে সংকলনের সময় সাধারণত জানা যায় না।
নির্ভরতা ইনজেকশন (ডিআই): "নির্ভরতা ইনজেকশন এমন একটি সফ্টওয়্যার ডিজাইন প্যাটার্ন যা হার্ড-কোডেড নির্ভরতাগুলি অপসারণের অনুমতি দেয় এবং রান-টাইমে বা সংকলন-কালীন সময়ে তা পরিবর্তন করা সম্ভব করে তোলে।" -wiki।
নিয়ন্ত্রণের বিপরীকরণ - এর অর্থ বসন্ত আইওসি পাত্রে বসন্ত শিম তৈরি এবং ইনস্ট্যান্ট করার নিয়ন্ত্রণ দেওয়া এবং বিকাশকারী একমাত্র কাজটি বসন্তের এক্সএমএল ফাইলটিতে মটরশুটি কনফিগার করে।
নির্ভরতা ইনজেকশন-
একটি শ্রেণীর কর্মচারী বিবেচনা করুন
class Employee {
private int id;
private String name;
private Address address;
Employee() {
id = 10;
name="name";
address = new Address();
}
}
এবং শ্রেণীর ঠিকানা বিবেচনা করুন
class Address {
private String street;
private String city;
Address() {
street="test";
city="test1";
}
}
উপরের কোডে ঠিকানা শ্রেণীর মানগুলি কেবলমাত্র তখনই সেট করা হবে যখন কর্মচারী শ্রেণি তাত্ক্ষণিকভাবে চালু করা হবে, যা কর্মী শ্রেণীর উপর ঠিকানা শ্রেণির নির্ভরতা। এবং বসন্ত এই নির্ভরতা ইনজেকশনের দুটি উপায় সরবরাহ করে নির্ভরতা ইনজেকশন ধারণাটি ব্যবহার করে এই সমস্যার সমাধান করে।
কর্মী শ্রেণিতে সেটার পদ্ধতি যা ঠিকানা শ্রেণির একটি রেফারেন্স নিয়ে থাকে
public void setAddress(Address addr) {
this.address = addr;
}
কর্মচারী শ্রেণিতে কনস্ট্রাক্টর যা ঠিকানা গ্রহণ করে
Employee(Address addr) {
this.address = addr;
}
এইভাবে ঠিকানা শ্রেণীর মানগুলি সেটার / কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করে স্বাধীনভাবে সেট করা যায়।
বিপরীতকরণ নিয়ন্ত্রণ সফ্টওয়্যার আর্কিটেকচারের জেনেরিক ডিজাইনের নীতি যা পুনরায় ব্যবহারযোগ্য, মডিউলার সফ্টওয়্যার ফ্রেমওয়ার্কগুলি বজায় রাখা সহজ যা সহায়তা করতে সহায়তা করে।
এটি এমন একটি নকশার নীতি যাতে জেনেরিক-লিখিত গ্রন্থাগার বা পুনরায় ব্যবহারযোগ্য কোড থেকে নিয়ন্ত্রণের ফ্লো "প্রাপ্ত" করা হয়েছে।
এটি আরও ভালভাবে বুঝতে, আমাদের কোডিংয়ের আগের দিনগুলিতে আমরা কীভাবে কোড ব্যবহার করতাম তা দেখতে দিন। পদ্ধতিগত / traditionalতিহ্যবাহী ভাষায়, ব্যবসায়িক যুক্তি সাধারণত অ্যাপ্লিকেশনটির প্রবাহ এবং জেনেরিক বা পুনরায় ব্যবহারযোগ্য কোড / ফাংশনগুলিকে "কল" নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, একটি সাধারণ কনসোল অ্যাপ্লিকেশনটিতে, আমার নিয়ন্ত্রণের প্রবাহটি আমার প্রোগ্রামের নির্দেশাবলী দ্বারা নিয়ন্ত্রিত হয়, এতে কিছু সাধারণ পুনরায় ব্যবহারযোগ্য ফাংশনে কল অন্তর্ভুক্ত থাকতে পারে।
print ("Please enter your name:");
scan (&name);
print ("Please enter your DOB:");
scan (&dob);
//More print and scan statements
<Do Something Interesting>
//Call a Library function to find the age (common code)
print Age
বিপরীতে আইওসি-র সাথে ফ্রেমওয়ার্কগুলি পুনরায় ব্যবহারযোগ্য কোড যা ব্যবসায়িক যুক্তি "কল" করে।
উদাহরণস্বরূপ, উইন্ডোজ ভিত্তিক সিস্টেমে বোতাম, মেনু, উইন্ডো এবং ডায়লগ বাক্সের মতো ইউআই উপাদান তৈরি করার জন্য একটি কাঠামো ইতিমধ্যে উপলব্ধ। যখন আমি আমার অ্যাপ্লিকেশনটির ব্যবসায়িক যুক্তি লিখি, তখন এটি ফ্রেমওয়ার্কের ইভেন্টগুলি হবে যা আমার ব্যবসায়িক লজিক কোডকে কল করবে (যখন কোনও ইভেন্ট চালিত হয়) এবং তার বিপরীতে নয়।
যদিও, ফ্রেমওয়ার্কের কোডটি আমার ব্যবসায়ের যুক্তি সম্পর্কে অবগত নয়, এটি এখনও আমার কোডটি কল করতে হবে। ইভেন্ট / প্রতিনিধি, কলব্যাক ইত্যাদি ব্যবহার করে এটি অর্জন করা হয় Here এখানে প্রবাহের নিয়ন্ত্রণটি "বিপরীত"।
সুতরাং, স্থিতিশীলভাবে আবদ্ধ বস্তুর উপর নিয়ন্ত্রণের প্রবাহ নির্ভর করার পরিবর্তে প্রবাহ সামগ্রিক অবজেক্ট গ্রাফ এবং বিভিন্ন বস্তুর মধ্যে সম্পর্কের উপর নির্ভর করে।
নির্ভরতা ইনজেকশন হ'ল একটি নকশার প্যাটার্ন যা বস্তুর নির্ভরতা নিরসনের জন্য আইওসি নীতি প্রয়োগ করে।
সহজ কথায়, আপনি কোড লেখার চেষ্টা করার সময় আপনি বিভিন্ন ক্লাস তৈরি এবং ব্যবহার করবেন। একটি শ্রেণি (ক্লাস এ) অন্যান্য ক্লাস (ক্লাস বি এবং / অথবা ডি) ব্যবহার করতে পারে। সুতরাং, ক্লাস বি এবং ডি ক্লাস এ এর নির্ভরতা are
একটি সাধারণ উপমা একটি ক্লাস কার হবে। একটি গাড়ি অন্যান্য ক্লাসের মতো ইঞ্জিন, টায়ার এবং আরও অনেক কিছুর উপর নির্ভর করে।
নির্ভরতা ইনজেকশন পরামর্শ দেয় যে ডিপেন্ডেন্ট ক্লাসগুলির পরিবর্তে (ক্লাস কার এখানে) তার নির্ভরতা (ক্লাস ইঞ্জিন এবং ক্লাস টায়ার) তৈরি করার পরিবর্তে ক্লাসকে নির্ভরতার দৃ concrete় উদাহরণ দিয়ে ইঞ্জেকশন করা উচিত।
আরও ব্যবহারিক উদাহরণ দিয়ে বুঝতে দেয়। বিবেচনা করুন যে আপনি নিজের টেক্সটএডিটর লিখছেন। অন্যান্য জিনিসের মধ্যে আপনার কাছে একটি বানানচেকার থাকতে পারে যা ব্যবহারকারীকে তার পাঠ্যের টাইপগুলি পরীক্ষা করতে একটি সুবিধা সরবরাহ করে। এই জাতীয় কোডের একটি সাধারণ বাস্তবায়ন হতে পারে:
Class TextEditor
{
//Lot of rocket science to create the Editor goes here
EnglishSpellChecker objSpellCheck;
String text;
public void TextEditor()
{
objSpellCheck = new EnglishSpellChecker();
}
public ArrayList <typos> CheckSpellings()
{
//return Typos;
}
}
প্রথম দর্শনে, সমস্ত গোলাপী দেখায়। ব্যবহারকারী কিছু লেখা লিখবেন। বিকাশকারী পাঠ্যটি ক্যাপচার করবে এবং চেকস্পিলিং ফাংশনটি কল করবে এবং টাইপসের একটি তালিকা খুঁজে পাবে যা সে ব্যবহারকারীর কাছে প্রদর্শন করবে।
যখন কোনও ব্যবহারকারী সম্পাদকে ফরাসী লেখা শুরু করে তখন একটি দুর্দান্ত দিন পর্যন্ত সবকিছু দুর্দান্ত কাজ করবে বলে মনে হচ্ছে।
আরও ভাষার জন্য সমর্থন সরবরাহ করতে, আমাদের আরও স্পেলচেকার থাকতে হবে। সম্ভবত ফরাসি, জার্মান, স্প্যানিশ ইত্যাদি
এখানে, আমরা "টেক্সটএডিটর শ্রেণীর সাথে দৃ English়ভাবে মিলিত হয়ে" ইংলিশ "স্পেলচেকার সহ একটি শক্তভাবে সংযুক্ত কোড তৈরি করেছি, যার অর্থ আমাদের টেক্সটএডিটর শ্রেণিটি ইংলিশস্পেলচিকারের উপর নির্ভরশীল বা অন্য কথায় ইংরাজীস্পেলচিকার টেক্সটএডিটরের নির্ভরতা। আমাদের এই নির্ভরতা অপসারণ করতে হবে। তদুপরি, আমাদের পাঠ্য সম্পাদককে চালকের সময়ে বিকাশকারীদের বিবেচনার ভিত্তিতে যেকোনও বানান পরীক্ষকের কংক্রিট রেফারেন্স ধরে রাখার একটি উপায় প্রয়োজন।
সুতরাং, আমরা যেমন ডিআই-এর প্রবর্তন দেখেছি, এটি সুপারিশ করে যে ক্লাসটি তার নির্ভরতাগুলির সাথে ইঞ্জেকশন করা উচিত। সুতরাং, কল করা কোডের দায়িত্ব হওয়া উচিত শ্রেণিবদ্ধ কোড / কোডের সমস্ত নির্ভরতা ইনজেকশনের জন্য। সুতরাং আমরা হিসাবে আমাদের কোড পুনর্গঠন করতে পারেন
interface ISpellChecker
{
Arraylist<typos> CheckSpelling(string Text);
}
Class EnglishSpellChecker : ISpellChecker
{
public override Arraylist<typos> CheckSpelling(string Text)
{
//All Magic goes here.
}
}
Class FrenchSpellChecker : ISpellChecker
{
public override Arraylist<typos> CheckSpelling(string Text)
{
//All Magic goes here.
}
}
আমাদের উদাহরণে, টেক্সটএডিটর শ্রেণীর ISpellChecker প্রকারের কংক্রিট উদাহরণ পাওয়া উচিত।
এখন, নির্ভরতা কন্সট্রাক্টর, একটি পাবলিক সম্পত্তি বা কোনও পদ্ধতিতে ইনজেকশন দেওয়া যেতে পারে।
কনস্ট্রাক্টর ডিআই ব্যবহার করে আমাদের ক্লাস পরিবর্তন করার চেষ্টা করি। পরিবর্তিত টেক্সটএডিটর শ্রেণিটি এরকম কিছু দেখবে:
Class TextEditor
{
ISpellChecker objSpellChecker;
string Text;
public void TextEditor(ISpellChecker objSC)
{
objSpellChecker = objSC;
}
public ArrayList <typos> CheckSpellings()
{
return objSpellChecker.CheckSpelling();
}
}
যাতে কলিং কোডটি পাঠ্য সম্পাদক তৈরি করার সময় পাঠ্যপরিচয়কারীর উদাহরণে যথাযথ বানানচিকার প্রকারটি ইনজেক্ট করতে পারে।
আপনি এখানে সম্পূর্ণ নিবন্ধটি পড়তে পারেন
কর্মচারীতে ঠিকানা উদাহরণ পাওয়ার .তিহ্যগত উপায় হ'ল ঠিকানা শ্রেণীর একটি নতুন উদাহরণ তৈরি করা S স্প্রিং আমাদের উপর নির্ভরশীল সমস্ত বস্তু তৈরি করে তাই আমাদের উদ্দেশ্য সম্পর্কে চিন্তা করার দরকার নেই।
সুতরাং বসন্তে আমরা কেবল বসন্তের ধারকটির উপর নির্ভর করি যা আমাদের নির্ভরতা অবজেক্ট সরবরাহ করে।