বিপরীতমুখী নিয়ন্ত্রণ (আইওসি) এটির প্রথম সম্মুখীন হলে বেশ বিভ্রান্ত হতে পারে।
- এটা কি?
- এটি কোন সমস্যার সমাধান করে?
- কখন ব্যবহার করা উপযুক্ত এবং কখন নয়?
বিপরীতমুখী নিয়ন্ত্রণ (আইওসি) এটির প্রথম সম্মুখীন হলে বেশ বিভ্রান্ত হতে পারে।
উত্তর:
ইনভার্শন অফ কন্ট্রোল (আইওসি) এবং ডিপেন্ডেন্সি ইনজেকশন (ডিআই) নিদর্শনগুলি আপনার কোড থেকে নির্ভরতা অপসারণ সম্পর্কে।
উদাহরণস্বরূপ, বলুন আপনার অ্যাপ্লিকেশনে একটি পাঠ্য সম্পাদক উপাদান রয়েছে এবং আপনি বানান চেক সরবরাহ করতে চান। আপনার স্ট্যান্ডার্ড কোডটি এরকম কিছু দেখাচ্ছে:
public class TextEditor {
private SpellChecker checker;
public TextEditor() {
this.checker = new SpellChecker();
}
}
আমরা এখানে যা করেছি তা TextEditor
এবং এর মধ্যে একটি নির্ভরতা তৈরি করে SpellChecker
। আইওসি দৃশ্যে আমরা পরিবর্তে এরকম কিছু করব:
public class TextEditor {
private IocSpellChecker checker;
public TextEditor(IocSpellChecker checker) {
this.checker = checker;
}
}
প্রথম কোডের উদাহরণে আমরা ইনস্ট্যান্টিয়েট করছি SpellChecker
( this.checker = new SpellChecker();
) যার অর্থ TextEditor
ক্লাস সরাসরি ক্লাসের উপর নির্ভর করে SpellChecker
।
দ্বিতীয় কোডের উদাহরণে আমরা নির্ধারকের স্বাক্ষর (শ্রেণিতে নির্ভরতা শুরু না করে) SpellChecker
নির্ভরতা শ্রেণি রেখে বিমূর্ততা তৈরি করছি TextEditor
। এটি আমাদের নির্ভরতা কল করতে দেয় এবং তারপরে এটি পাঠ্যএডিটর শ্রেণিতে যেমন পাঠায়:
SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);
TextEditor
ক্লাস তৈরির ক্লায়েন্টের কোন SpellChecker
প্রয়োগটি ব্যবহার করা হবে তার নিয়ন্ত্রণ রয়েছে কারণ আমরা TextEditor
স্বাক্ষরটিতে নির্ভরতা ইনজেকশন করছি ।
কন্ট্রোলের বিপরীততা হ'ল আপনার প্রোগ্রাম কলব্যাকগুলি যেমন আপনি পাবেন যেমন একটি গুই প্রোগ্রামের মতো।
উদাহরণস্বরূপ, পুরানো স্কুল মেনুতে আপনার হতে পারে:
print "enter your name"
read name
print "enter your address"
read address
etc...
store in database
এর ফলে ব্যবহারকারীর মিথস্ক্রিয়া প্রবাহ নিয়ন্ত্রণ করে।
জিইউআই প্রোগ্রামে বা সামসুচে, পরিবর্তে আমরা বলি:
when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase
সুতরাং এখন নিয়ন্ত্রণটি উল্টে গেছে ... একটি স্থির ক্রমে কম্পিউটার গ্রহণের পরিবর্তে কম্পিউটারটি ডেটা প্রবেশ করাতে এবং ডাটাবেজে ডেটা সংরক্ষণ করার সময় ব্যবহারকারী নিয়ন্ত্রণ করে।
মূলত, ইভেন্ট লুপ, কলব্যাকস, বা ট্রিগারগুলি কার্যকর করে যে কোনও কিছু এই বিভাগে আসে।
বিপরীতমুখী নিয়ন্ত্রণ কী?
আপনি যদি এই দুটি সহজ পদক্ষেপ অনুসরণ করেন তবে আপনি নিয়ন্ত্রণের বিপরীতমুখী কাজটি করেছেন:
আপনি আপনার প্রয়োগের জন্য যে প্রযুক্তি / ভাষা ব্যবহার করছেন তার উপর ভিত্তি করে এই প্রতিটি পদক্ষেপের জন্য বেশ কয়েকটি কৌশল সম্ভব।
-
বিপর্যয় নিয়ন্ত্রণ ইনভার্সান (আইওসি) অংশ বিভ্রান্তিকর কাজ নয়; কারণ বিপরীতটি আপেক্ষিক শব্দ। আইওসি বোঝার সেরা উপায়টি সেই শব্দটি ভুলে যাওয়া!
-
উদাহরণ
what-to-do
এবংwhen-to-do
নিয়ন্ত্রণগুলির বিপরীততা উদ্বেগগুলি পৃথক করার বিষয়ে।
আইওসি ছাড়াই : আপনার কাছে একটি ল্যাপটপ কম্পিউটার রয়েছে এবং আপনি ঘটনাক্রমে স্ক্রিনটি ভেঙে ফেলেন। এবং ঘৃণা, আপনি একই মডেলের ল্যাপটপ স্ক্রিন বাজারে কোথাও খুঁজে পাবেন। সুতরাং আপনি আটকে আছেন।
আইওসি সহ : আপনার একটি ডেস্কটপ কম্পিউটার রয়েছে এবং আপনি ঘটনাক্রমে স্ক্রিনটি ভেঙে ফেলেছেন । আপনি দেখতে পান যে আপনি বাজার থেকে প্রায় কোনও ডেস্কটপ মনিটর দখল করতে পারেন, এবং এটি আপনার ডেস্কটপটির সাথে ভালভাবে কাজ করে।
আপনার ডেস্কটপ সফলভাবে এই ক্ষেত্রে আইওসি প্রয়োগ করে। এটি বিভিন্ন ধরণের মনিটর গ্রহণ করে, যখন ল্যাপটপটি না করে, ঠিক করার জন্য এটি একটি নির্দিষ্ট স্ক্রিনের প্রয়োজন।
ইনভার্সন অফ কন্ট্রোল, (বা আইওসি) স্বাধীনতা অর্জন সম্পর্কে (আপনি বিবাহ করেছেন, আপনি স্বাধীনতা হারিয়েছেন এবং আপনাকে নিয়ন্ত্রণ করা হচ্ছে You আপনি বিবাহবিচ্ছেদ করেছেন, আপনি সবেমাত্র নিয়ন্ত্রণের বিপরীকরণ বাস্তবায়ন করেছেন That's এটাকেই আমরা বলেছিলাম "ডিক্লুপড" Good গুড কম্পিউটার সিস্টেম কিছু খুব ঘনিষ্ঠ সম্পর্ককে নিরুৎসাহিত করে।) আরও নমনীয়তা (আপনার অফিসের রান্নাঘরটি কেবল পরিষ্কার ট্যাপের জল সরবরাহ করে, আপনি যখন পান করতে চান তবে এটিই আপনার পছন্দ। একটি নতুন কফি মেশিন স্থাপনের মাধ্যমে আপনার বস নিয়ন্ত্রণের বিপরীতাকে কার্যকর করেছিলেন Now এখন আপনি পান নলের জল বা কফি নির্বাচন করার নমনীয়তা)) এবং কম নির্ভরতা (আপনার অংশীদার একটি চাকরি আছে, আপনার কোন চাকরি নেই, আপনি আর্থিকভাবে আপনার সঙ্গীর উপর নির্ভর করেন, তাই আপনি নিয়ন্ত্রণিত হন You আপনি একটি কাজ খুঁজে পান, আপনি নিয়ন্ত্রণের বিপরীকরণ বাস্তবায়ন করেছেন Good ভাল কম্পিউটার সিস্টেম ইন-নির্ভরতাকে উত্সাহ দেয়))
আপনি যখন ডেস্কটপ কম্পিউটার ব্যবহার করেন, আপনি স্লেভ করেছেন (বা বলুন, নিয়ন্ত্রিত)। আপনাকে কোনও স্ক্রিনের আগে বসে এটি দেখতে হবে। টাইপ করতে কীবোর্ডটি ব্যবহার করে এবং নেভিগেট করতে মাউস ব্যবহার করে। এবং একটি খারাপভাবে লেখা সফ্টওয়্যার আপনাকে আরও বেশি দাস করতে পারে। আপনি যদি ল্যাপটপের সাহায্যে আপনার ডেস্কটপটি প্রতিস্থাপন করেন তবে আপনি কিছুটা উল্টানো নিয়ন্ত্রণ করুন। আপনি এটি সহজেই নিতে পারেন এবং চারপাশে ঘুরে আসতে পারেন। সুতরাং এখন আপনি নিজের কম্পিউটারটি নিয়ন্ত্রণ করার পরিবর্তে আপনি যেখানে আপনার কম্পিউটারের সাথে রয়েছেন তা নিয়ন্ত্রণ করতে পারেন।
ইনভার্শন অফ কন্ট্রোল প্রয়োগ করে, একটি সফ্টওয়্যার / অবজেক্ট গ্রাহক নিয়ন্ত্রণ করা বা কম বিকল্পের পরিবর্তে, সফ্টওয়্যার / অবজেক্টের উপর আরও নিয়ন্ত্রণ / বিকল্প পেতে পারে।
উপরের ধারণাগুলি মাথায় রেখে আমরা এখনও আইওসির একটি মূল অংশ মিস করছি। আইওসি-র দৃশ্যে, সফ্টওয়্যার / অবজেক্ট গ্রাহক একটি পরিশীলিত কাঠামো। তার মানে আপনি তৈরি কোডটি নিজে কল করেন না। এখন আসুন কীভাবে ওয়েব অ্যাপ্লিকেশনের জন্য এই পদ্ধতিটি আরও ভাল কাজ করে তা ব্যাখ্যা করি।
মনে করুন আপনার কোডটি শ্রমিকদের একটি গ্রুপ। তাদের গাড়ি তৈরি করা দরকার। এই শ্রমিকদের গাড়ি তৈরির জন্য একটি জায়গা এবং সরঞ্জাম (একটি সফ্টওয়্যার ফ্রেমওয়ার্ক) প্রয়োজন। একটি traditionalতিহ্যবাহী সফ্টওয়্যার কাঠামো অনেক সরঞ্জাম সহ গ্যারেজের মতো হবে। কাজেই শ্রমিকদের নিজেরাই একটি পরিকল্পনা করা এবং গাড়িটি তৈরিতে সরঞ্জামগুলি ব্যবহার করা দরকার। গাড়ি তৈরি করা সহজ ব্যবসা নয়, শ্রমিকদের যথাযথভাবে পরিকল্পনা করা এবং সহযোগিতা করা সত্যিই কঠিন হবে। একটি আধুনিকসফ্টওয়্যার ফ্রেমওয়ার্কটি একটি আধুনিক গাড়ী কারখানার মতো হবে যেখানে সমস্ত সুযোগ সুবিধা এবং ব্যবস্থাপক রয়েছে। শ্রমিকদের কোনও পরিকল্পনা করতে হবে না, পরিচালকদের (কাঠামোর অংশ, তারা সবচেয়ে স্মার্ট ব্যক্তি এবং সবচেয়ে পরিশীলিত পরিকল্পনা তৈরি করেছে) সমন্বয় করতে সহায়তা করবে যাতে কর্মীরা জানতে পারে যে কখন তাদের কাজ করা উচিত (ফ্রেমওয়ার্কটি আপনার কোডকে কল করে)। পরিচালকগণ তাদের যে কোনও সরঞ্জাম ব্যবহার করতে (ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে) কেবলমাত্র শ্রমিকদের যথেষ্ট নমনীয় হওয়া দরকার।
যদিও শ্রমিকরা শীর্ষ স্তরের প্রকল্প পরিচালনার নিয়ন্ত্রণ পরিচালকদের (কাঠামো) দেয় give তবে কিছু পেশাদারদের সাহায্য করা ভাল। এটি সত্যই আসল আইওসি ধারণাটি এসেছে।
এমভিসি আর্কিটেকচার সহ আধুনিক ওয়েব অ্যাপ্লিকেশনগুলি ইউআরএল রাউটিং করার ফ্রেমওয়ার্কের উপর নির্ভর করে এবং ফ্রেমওয়ার্কটি কল করার জন্য কন্ট্রোলারদের রাখে।
নির্ভরতা ইনজেকশন এবং নিয়ন্ত্রণের বিপরীততা সম্পর্কিত। নির্ভরতা ইনজেকশনটি মাইক্রো স্তরে এবং নিয়ন্ত্রণের বিপরীতটি ম্যাক্রো স্তরে থাকে at কোনও খাবার শেষ করতে (আইওসি প্রয়োগ করুন) আপনাকে প্রতিটি কামড় (ডিআই প্রয়োগ করুন) খেতে হবে।
ইনভার্সন অফ কন্ট্রোল ব্যবহার করার আগে আপনাকে এ সম্পর্কে ভালভাবে সচেতন হওয়া উচিত যে এর পক্ষে এর পক্ষে মতামত রয়েছে এবং এটি করা হলে আপনি কেন এটি ব্যবহার করছেন তা আপনার জানা উচিত।
পেশাদাররা:
কনস:
ব্যক্তিগতভাবে আমি আইওসি-র শক্তিশালী পয়েন্টগুলি দেখতে পাই এবং আমি সেগুলি সত্যই পছন্দ করি তবে আমি যখনই সম্ভব সম্ভব আইওসি এড়িয়ে চলি it এক্সএমএল কনফিগারেশন বা টীকা মেটাডেটা এবং এটি বাদে পড়ে (এবং পড়া) falls
উইকিপিডিয়া নিবন্ধ । আমার কাছে, নিয়ন্ত্রণের বিপরীতকরণটি আপনার ক্রমযুক্ত লিখিত কোডটি পরিণত করে এবং এটি একটি প্রতিনিধি কাঠামোয় পরিণত করছে। আপনার প্রোগ্রামটি স্পষ্টভাবে সমস্ত কিছু নিয়ন্ত্রণ করার পরিবর্তে, আপনার প্রোগ্রামটি নির্দিষ্ট কিছু ফাংশন সহ একটি শ্রেণি বা পাঠাগার স্থাপন করে যখন নির্দিষ্ট কিছু ঘটে থাকে।
এটি কোড সদৃশ সমাধান করে। উদাহরণস্বরূপ, পুরানো দিনগুলিতে আপনি নিজের ইভেন্ট লুপটি ম্যানুয়ালি লিখতেন, নতুন ইভেন্টের জন্য সিস্টেম লাইব্রেরিগুলিতে পোলিং করতেন। আজকাল, আপনি সর্বাধিক আধুনিক এপিআইগুলি কেবল আপনার লাইব্রেরিগুলিকে কী ইভেন্টগুলিতে আগ্রহী তা বলছেন এবং সেগুলি কখন ঘটে তা আপনাকে জানিয়ে দেবে।
কোডের অনুলিপিকে হ্রাস করার জন্য নিয়ন্ত্রণের বিপরীতকরণ একটি ব্যবহারিক উপায় এবং যদি আপনি নিজেকে একটি সম্পূর্ণ পদ্ধতি অনুলিপি করে এবং কেবল কোডের একটি ছোট অংশ পরিবর্তন করতে দেখেন তবে আপনি নিয়ন্ত্রণের বিপরীতে এটিকে মোকাবেলা করতে বিবেচনা করতে পারেন। প্রতিনিধি, ইন্টারফেস, এমনকি কাঁচা ফাংশন পয়েন্টারগুলির ধারণার মাধ্যমে অনেকগুলি ভাষায় নিয়ন্ত্রণের বিপরীতকরণকে সহজ করা যায়।
সব ক্ষেত্রেই এটি ব্যবহার করা উপযুক্ত নয়, কারণ কোনও প্রোগ্রামের প্রবাহটি এভাবে লেখার সময় অনুসরণ করা শক্ত হতে পারে। এটি একটি লাইব্রেরি লেখার সময় পদ্ধতিগুলি ডিজাইনের একটি কার্যকর উপায় যা পুনরায় ব্যবহার করা হবে, তবে এটি যদি আপনার কোডটির সদৃশ সমস্যাটি সত্যিই সমাধান না করে তবে আপনার নিজের প্রোগ্রামের মূল অংশে খুব কম ব্যবহার করা উচিত।
তবে আমি মনে করি এটির সাথে আপনাকে খুব সাবধানতা অবলম্বন করতে হবে। আপনি যদি এই প্যাটার্নটিকে অতিরিক্ত ব্যবহার করবেন তবে আপনি খুব জটিল ডিজাইন এবং আরও জটিল কোড তৈরি করবেন।
টেক্সটএডিটরের সাথে এই উদাহরণটির মতো: আপনার যদি কেবল একটি স্পেলচেকার থাকে তবে আইওসি ব্যবহার করা সত্যই প্রয়োজন হয় না? ইউনিট পরীক্ষা বা অন্য কিছু লেখার দরকার না থাকলে ...
যাইহোক: যুক্তিসঙ্গত হতে হবে। ডিজাইনের ধরণগুলি ভাল অনুশীলন তবে বাইবেল প্রচার করা যায় না। এটি সর্বত্র আটকাবেন না।
আমার কাছে আইওসি / ডিআই কলিং অবজেক্টের উপর নির্ভরতা বাড়িয়ে দিচ্ছে। সুপার সিম্পল
প্রযুক্তিবিহীন উত্তরটি আপনি এটি চালু করার আগেই একটি গাড়িতে একটি ইঞ্জিন বদল করতে সক্ষম হচ্ছেন। যদি সবকিছু ঠিকঠাক হয় (ইন্টারফেস), আপনি ভাল।
মনে করুন আপনি একটি বস্তু। এবং আপনি একটি রেস্টুরেন্ট যান:
আইওসি ছাড়াই : আপনি "আপেল" চাইবেন এবং আপনি আরও জিজ্ঞাসা করলে সর্বদা আপেল পরিবেশন করা হয়।
আইওসি সহ : আপনি "ফল" জিজ্ঞাসা করতে পারেন। প্রতিবার পরিবেশন করা হলে আপনি বিভিন্ন ফল পেতে পারেন। উদাহরণস্বরূপ, আপেল, কমলা বা জলের তরমুজ।
সুতরাং, স্পষ্টতই, আইওসি পছন্দ হয় যখন আপনি জাতগুলি পছন্দ করেন।
নিয়ন্ত্রণের বিপরীতমুখীতা সিস্টেমের উপাদানগুলি এবং স্তরগুলি ডিকপলিংয়ের জন্য ব্যবহৃত একটি প্যাটার্ন। প্যাটার্নটি তৈরি করা হয় যখন একটি উপাদান ইনজেকশন নির্ভরতা মাধ্যমে প্রয়োগ করা হয়। এই নির্ভরতা সাধারণত আরও ডিকপলিং এবং টেস্টিবিলিটি সমর্থন করার জন্য ইন্টারফেস হিসাবে সরবরাহ করা হয়। আইওসি / ডিআই পাত্রে যেমন ক্যাসল উইন্ডসর, ইউনিটি হ'ল সরঞ্জামগুলি (গ্রন্থাগার) যা IoC সরবরাহের জন্য ব্যবহার করা যেতে পারে। এই সরঞ্জামগুলি আজীবন, এওপি / ইন্টারসেপশন, নীতি, ইত্যাদি সহ সাধারণ নির্ভরতা পরিচালনার উপরে এবং বাইরেও বর্ধিত বৈশিষ্ট্য সরবরাহ করে
ক। কোনও উপাদানকে নির্ভরতা পরিচালনার জন্য দায়বদ্ধ হতে দূরে করে।
খ। বিভিন্ন পরিবেশে নির্ভরতা বাস্তবায়ন অদলবদল করার ক্ষমতা সরবরাহ করে।
গ। নির্ভরতা উপহাসের মাধ্যমে কোনও উপাদানকে পরীক্ষা করার অনুমতি দেয়।
ঘ। সমস্ত অ্যাপ্লিকেশন জুড়ে সংস্থান ভাগ করার জন্য একটি প্রক্রিয়া সরবরাহ করে।
ক। পরীক্ষা-চালিত বিকাশ করার সময় সমালোচক। আইওসি ব্যতীত এটি পরীক্ষা করা কঠিন হতে পারে, কারণ পরীক্ষার অধীনে থাকা উপাদানগুলি সিস্টেমের বাকী অংশগুলিতে অত্যন্ত মিলিত হয়।
খ। মডুলার সিস্টেম বিকাশ করার সময় সমালোচনামূলক। একটি মডুলার সিস্টেম এমন একটি সিস্টেম যার উপাদানগুলি পুনঃসংশোধনের প্রয়োজন ছাড়াই প্রতিস্থাপন করা যেতে পারে।
গ। সংক্ষেপে যদি এন্টারপ্রাইজ অ্যাপ্লিকেশনটিতে আংশিকভাবে সমাধানের প্রয়োজন এমন অনেক ক্রস কাটা উদ্বেগ রয়েছে।
শুধুমাত্র প্রথম অংশের উত্তর দেওয়া। এটা কি?
বিপরীতকরণের নিয়ন্ত্রণ (আইওসি) অর্থ প্রথম শ্রেণীর উদাহরণ তৈরি করার পরিবর্তে শ্রেণীর প্রথম এবং দ্বিতীয় শ্রেণীর নির্ভরতাগুলির (উদাহরণস্বরূপ কনস্ট্রাক্টরের মাধ্যমে তাদের ইনজেকশনের) উদাহরণ তৈরি করা এবং শ্রেণীর উদাহরণটি নির্ভরতার উদাহরণ তৈরি করে। সুতরাং, নিয়ন্ত্রণ বিপর্যয় inverts নিয়ন্ত্রণ প্রবাহ কর্মসূচির। পরিবর্তে callee নিয়ন্ত্রণ নিয়ন্ত্রণ প্রবাহ (একই নির্ভরতা তৈরি), আহ্বানকারী প্রোগ্রামের নিয়ন্ত্রণ প্রবাহ নিয়ন্ত্রণ করে ।
আমি এই দুটি পদ সম্পর্কে আমার সাধারণ বোঝার বিষয়টি লিখব:
For quick understanding just read examples*
ডিপেন্ডেন্সি ইনজেকশন (ডিআই):
নির্ভরতা ইনজেকশনটির অর্থ সাধারণত কোনও পদ্ধতির পরামিতি হিসাবে কোনও পদ্ধতির উপর নির্ভর করে কোনও অবজেক্টকে পাস করা, তার পরিবর্তে পদ্ধতিটি নির্ভর বস্তু তৈরি না করে ।
অনুশীলনে এর অর্থ যা হ'ল পদ্ধতিটি কোনও নির্দিষ্ট প্রয়োগের উপর সরাসরি নির্ভর করে না; প্রয়োজনীয়তা পূরণ করে যে কোনও বাস্তবায়ন পরামিতি হিসাবে পাস করা যেতে পারে।
এই বিষয়বস্তু সঙ্গে তার নির্ভরতা বলতে। এবং বসন্ত এটি উপলব্ধ করে তোলে।
এটি আলগাভাবে যুগল প্রয়োগের বিকাশের দিকে পরিচালিত করে।
Quick Example:EMPLOYEE OBJECT WHEN CREATED,
IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
(if address is defines as dependency by Employee object)
বিপরীতকরণের নিয়ন্ত্রণ (আইওসি) কনটেইনার:
এটি ফ্রেমওয়ার্কগুলির সাধারণ বৈশিষ্ট্য, আইওসি জাভা অবজেক্টগুলি পরিচালনা করে
- এর বিয়ানফ্যাক্ট্রির মাধ্যমে তাত্পর্য থেকে ধ্বংস পর্যন্ত।
-জোয়া উপাদানগুলি যা আইওসি ধারক দ্বারা তাত্ক্ষণিকভাবে সঞ্চারিত হয় তাকে বিনগুলি বলা হয়, এবং আইওসি পাত্রে একটি শিমের স্কোপ, লাইফাইসাইকেল ইভেন্টগুলি এবং এমন কোনও এওপি বৈশিষ্ট্য পরিচালনা করা হয় যার জন্য এটি কনফিগার করা এবং কোড করা হয়েছে।
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
।
ইনভার্শন অফ কন্ট্রোল প্রয়োগ করে, একটি সফ্টওয়্যার / অবজেক্ট গ্রাহক নিয়ন্ত্রণ করা বা কম বিকল্পের পরিবর্তে সফ্টওয়্যার / অবজেক্টের উপর আরও নিয়ন্ত্রণ / বিকল্পগুলি পান।
ডিজাইনের গাইডলাইন হিসাবে নিয়ন্ত্রণের বিপরীতে নিম্নলিখিত উদ্দেশ্যগুলি পরিবেশন করা হয়:
বাস্তবায়ন থেকে একটি নির্দিষ্ট কাজ কার্যকর করার একটি decoupling আছে।
প্রতিটি মডিউল এটির জন্য কীভাবে ডিজাইন করা হয়েছে তা ফোকাস করতে পারে।
মডিউলগুলি অন্যান্য সিস্টেমগুলি কী করে সে সম্পর্কে কোনও অনুমান করে না তবে তাদের চুক্তিতে নির্ভর করে।
মডিউলগুলি প্রতিস্থাপনের অন্যান্য মডিউলগুলির কোনও পার্শ্ব প্রতিক্রিয়া নেই
আমি জিনিসগুলি এখানে বিমূর্ত রাখব, আপনি বিষয়টির বিস্তারিত বোঝার জন্য নিম্নলিখিত লিঙ্কগুলিতে দেখতে পারেন।
উদাহরণ সহ একটি ভাল পড়া
আমি নীলবজেক্টের সাথে একমত , তবে আমি এটিতে যুক্ত করতে চাই:
যদি আপনি নিজেকে একটি সম্পূর্ণ পদ্ধতি অনুলিপি করে এবং কেবল কোডের একটি ছোট অংশ পরিবর্তন করতে দেখেন তবে আপনি নিয়ন্ত্রণের বিপরীতে এটিকে মোকাবেলা করতে বিবেচনা করতে পারেন
আপনি যদি নিজের চারপাশে কোড অনুলিপি এবং আটকানো দেখতে পান তবে আপনি প্রায় সর্বদা কিছু ভুল করছেন । একবার এবং কেবল একবার ডিজাইনের নীতি হিসাবে কোডেড ।
উদাহরণস্বরূপ, টাস্ক # 1 অবজেক্ট তৈরি করা। আইওসি ধারণা ব্যতীত # 1 টাস্কটি প্রোগ্রামার দ্বারা সম্পন্ন হওয়ার কথা। তবে আইওসি কনসেপ্টের সাহায্যে টাস্ক 1 1 কনটেইনার দ্বারা সম্পন্ন হবে।
সংক্ষেপে কন্ট্রোলটি প্রোগ্রামার থেকে ধারক হয়ে উল্টে যায়। সুতরাং, এটিকে নিয়ন্ত্রণের বিপরীত হিসাবে ডাকা হয়।
আমি এক ভাল উদাহরণ পাওয়া এখানে ।
বলার অপেক্ষা রাখে না যে আমরা কিছু হোটেলে কিছু সভা করি।
অনেক লোক, অনেক জল জল, অনেক প্লাস্টিকের কাপ।
যখন কেউ পান করতে চায়, সে কাপটি ভরাট করে, পানীয়টি পান করে মেঝেতে ফেলে দেয়।
ঘন্টা বা অন্য কিছু পরে আমাদের প্লাস্টিকের কাপ এবং জলে coveredাকা একটি মেঝে রয়েছে।
উল্টানো নিয়ন্ত্রণ যাক।
একই জায়গায় একই সভা, তবে প্লাস্টিকের কাপের পরিবর্তে আমাদের কাছে একটি গ্লাস কাপ (সিঙ্গেলটন) সহ ওয়েটার রয়েছে
এবং তিনি সমস্ত সময় অতিথিদের পান করার অফার করেন।
যখন কেউ পান করতে চায়, তখন সে ওয়েটারের গ্লাস থেকে পান করে পান করে ওয়েটারের কাছে ফিরিয়ে দেয়।
স্বাস্থ্যকর প্রশ্নটি বাদ দিয়ে মদ্যপান প্রক্রিয়া নিয়ন্ত্রণের শেষ ফর্মটি আরও কার্যকর এবং অর্থনৈতিক।
এবং এটি হ'ল বসন্ত (অন্য আইওসি ধারক, উদাহরণস্বরূপ: গুইস) এটি করে। নতুন কীওয়ার্ড (প্লাস্টিকের কাপ নেওয়া) ব্যবহারের জন্য প্রয়োজনীয় অ্যাপ্লিকেশনটি তৈরি করার পরিবর্তে, স্প্রিং আইওসি পাত্রে সমস্ত সময় একই জিনিস (সিঙ্গলটন) প্রয়োজনীয় বস্তুর (পানির গ্লাস) প্রয়োগ করার প্রস্তাব দেওয়া হয়।
নিজেকে এই জাতীয় সভার সংগঠক হিসাবে ভাবুন। আপনার হোটেল প্রশাসনের কাছে বার্তা দেওয়ার উপায়টি দরকার
সভায় সদস্যদের গ্লাস জলের প্রয়োজন হবে তবে কেকের টুকরো নয়।
উদাহরণ: -
public class MeetingMember {
private GlassOfWater glassOfWater;
...
public void setGlassOfWater(GlassOfWater glassOfWater){
this.glassOfWater = glassOfWater;
}
//your glassOfWater object initialized and ready to use...
//spring IoC called setGlassOfWater method itself in order to
//offer to meetingMember glassOfWater instance
}
উপকারী সংজুক:-
এটি "আইওসি" সংক্ষিপ্ত বিবরণ এবং এটির নাম যার জন্য এটি দাঁড়িয়েছে তা সম্পর্কে সবচেয়ে বিভ্রান্তিকর বিষয়টি এটি একটি নামটি প্রায় গ্ল্যামারাস - প্রায় একটি শব্দের নাম।
প্রক্রিয়াজাতীয় এবং ইভেন্ট চালিত প্রোগ্রামিংয়ের মধ্যে পার্থক্য বর্ণনা করার জন্য আমাদের কি আসলেই এমন একটি নাম দরকার? ঠিক আছে, যদি আমাদের প্রয়োজন হয় তবে কী আমাদের সমাধানের চেয়ে আরও বিভ্রান্ত করে এমন একটি "নতুন জীবনের চেয়ে বড়" নামটি নেওয়া উচিত?
যখন আপনি মুদি দোকানে যান এবং আপনার স্ত্রী আপনাকে কেনার পণ্যগুলির তালিকা দেয় তখন নিয়ন্ত্রণের বিপরীতটি হয়।
পদ প্রোগ্রামিং তিনি কলব্যাক ফাংশন পাস getProductList()
- ফাংশন আপনি নির্বাহ হয় doShopping()
।
এটি ফাংশনের ব্যবহারকারীকে এর কিছু অংশ সংজ্ঞায়িত করার অনুমতি দেয়, এটি আরও নমনীয় করে তোলে।
getProductList()
আপনাকে অর্থের জন্য উত্স খুঁজতে হবে, তার মানে নিয়ন্ত্রণ আপনার পাশে রয়েছে। বিপর্যয়ের ক্ষেত্রে, সে নিয়ন্ত্রণ করবে, অর্থ কেনার জন্য যে অর্থ প্রদান করবে তা বোঝায়।
আমি খুব স্পষ্ট উদাহরণ পাওয়া এখানে যা ব্যাখ্যা কিভাবে 'নিয়ন্ত্রণ উল্টানো হয়।
ক্লাসিক কোড (নির্ভরতা ইনজেকশন ছাড়াই)
এখানে ডিআই ব্যবহার না করে একটি কোড মোটামুটি কাজ করবে:
নির্ভরতা ইনজেকশন ব্যবহার করে
এখানে ডিআই ব্যবহার করে কোনও কোড মোটামুটি কাজ করবে:
নির্ভরশীলতার নিয়ন্ত্রণটি একটিকে কল করা থেকে ডাকা হয়ে যাওয়া থেকে বিপরীত হয়।
এটি কোন সমস্যার সমাধান করে?
নির্ভরতা ইনজেকশনটি ইনজেকশন শ্রেণীর বিভিন্ন প্রয়োগের সাথে অদলবদলকে সহজ করে তোলে। ইউনিট টেস্টিংয়ের সময় আপনি একটি ডামি বাস্তবায়ন ইনজেক্ট করতে পারেন, যা পরীক্ষাটি আরও সহজ করে তোলে।
উদাহরণস্বরূপ: ধরুন আপনার অ্যাপ্লিকেশনটি ব্যবহারকারী আপলোড করা ফাইলটি Google ড্রাইভে সঞ্চয় করে, ডিআই সহ আপনার কন্ট্রোলার কোডটি দেখতে দেখতে এটি দেখতে পারে:
class SomeController
{
private $storage;
function __construct(StorageServiceInterface $storage)
{
$this->storage = $storage;
}
public function myFunction ()
{
return $this->storage->getFile($fileName);
}
}
class GoogleDriveService implements StorageServiceInterface
{
public function authenticate($user) {}
public function putFile($file) {}
public function getFile($file) {}
}
যখন আপনার প্রয়োজনীয়তাগুলি পরিবর্তন হয়, Google ড্রাইভের পরিবর্তে আপনাকে ড্রপবক্স ব্যবহার করতে বলা হয়। আপনার কেবলমাত্র স্টোরেজ সার্ভিসআইন্টারফেসের জন্য একটি ড্রপবক্স বাস্তবায়ন লিখতে হবে। যতক্ষণ না ড্রপবক্স বাস্তবায়ন স্টোরেজ সার্ভিসআইন্টারফেসে মেনে চলে ততক্ষণ আপনি নিয়ন্ত্রণকারীতে কোনও পরিবর্তন আনবেন না।
পরীক্ষার সময় আপনি ডমি প্রয়োগের সাথে স্টোরেজ সার্ভিসআইন্টারফেসের জন্য মক তৈরি করতে পারেন যেখানে সমস্ত পদ্ধতি বাতিল হয়ে যায় (বা আপনার পরীক্ষার প্রয়োজনীয়তা অনুসারে কোনও পূর্বনির্ধারিত মান)।
পরিবর্তে যদি আপনার কাছে new
কীওয়ার্ড সহ স্টোরেজ অবজেক্টটি নির্মাণের জন্য নিয়ামক শ্রেণি থাকে :
class SomeController
{
private $storage;
function __construct()
{
$this->storage = new GoogleDriveService();
}
public function myFunction ()
{
return $this->storage->getFile($fileName);
}
}
আপনি যখন ড্রপবক্স প্রয়োগের সাথে পরিবর্তন করতে চান তখন আপনাকে new
Google লাইনড্রাইভ সার্ভিস অবজেক্ট নির্মিত সমস্ত রেখা প্রতিস্থাপন করতে হবে এবং ড্রপবক্স সার্ভিস ব্যবহার করতে হবে। সোমারকন্ট্রোলার ক্লাস পরীক্ষা করার সময় কনস্ট্রাক্টর সর্বদা গুগলড্রাইভ সার্ভিস ক্লাস এবং এই শ্রেণীর আসল পদ্ধতিগুলি ট্রিগার হওয়ার প্রত্যাশা করে।
এটি কখন উপযুক্ত এবং কখন নয়? আমার মতে আপনি ডিআই ব্যবহার করবেন যখন আপনি ভাবেন যে কোনও শ্রেণীর বিকল্প বাস্তবায়ন আছে (বা সেখানে থাকতে পারে)।
খুব সহজ লিখিত ব্যাখ্যা এখানে পাওয়া যাবে
http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html
এটা বলে -
"যে কোনও অনানুষ্ঠানিক অ্যাপ্লিকেশন দুটি বা ততোধিক শ্রেণীর সমন্বয়ে গঠিত হয় যা একে অপরের সাথে কিছু ব্যবসায়িক যুক্তি সম্পাদনের জন্য সহযোগিতা করে। কিছু বাহ্যিক সত্তা তৈরির সময় অবজেক্টগুলিকে তাদের নির্ভরতা দেয় যা সিস্টেমে প্রতিটি বস্তুকে সমন্বয় করে other অন্য কথায়, নির্ভরতাগুলি বস্তুগুলিতে ইনজেকশনের ব্যবস্থা করা হয়। "
নিয়ন্ত্রণের বিপরীতকরণ একটি জেনেরিক নীতি, অন্যদিকে নির্ভরতা ইনজেকশন এই নীতিটি অবজেক্ট গ্রাফ নির্মাণের জন্য নকশার প্যাটার্ন হিসাবে উপলব্ধি করে (যেমন কনফিগারেশন নিয়ন্ত্রণ করে যে কীভাবে বস্তুগুলি একে অপরের সাথে রেফারেন্স করছে, তার পরিবর্তে অবজেক্টটি অন্য কোনও বস্তুর রেফারেন্স কীভাবে পাবেন তা নিয়ন্ত্রণ করে)।
ইনভার্সন অফ কন্ট্রোলকে ডিজাইনের নিদর্শন হিসাবে দেখে আমাদের কী উল্টানো হচ্ছে তা আমাদের দেখতে হবে। নির্ভরতা ইনজেকশন বস্তুর গ্রাফ তৈরির নিয়ন্ত্রণকে উল্টে দেয়। যদি সাধারণ ব্যক্তির মেয়াদে বলা হয়, নিয়ন্ত্রণের বিপরীতকরণ প্রোগ্রামে নিয়ন্ত্রণের প্রবাহের পরিবর্তনকে বোঝায়। যেমন। Traditionalতিহ্যগত স্বতন্ত্র অ্যাপ্লিকেশনটিতে, আমাদের মূল পদ্ধতি রয়েছে, সেখান থেকে নিয়ন্ত্রণটি অন্যান্য তৃতীয় পক্ষের লাইব্রেরিতে স্থানান্তরিত হয় (যদি আমরা তৃতীয় পক্ষের লাইব্রেরির ফাংশন ব্যবহার করি) তবে নিয়ন্ত্রণের বিপরীতকরণের মাধ্যমে তৃতীয় পক্ষের লাইব্রেরি কোড থেকে আমাদের কোডে স্থানান্তরিত হয় , যেমন আমরা তৃতীয় পক্ষের গ্রন্থাগারের পরিষেবা নিচ্ছি। তবে এমন অন্যান্য দিক রয়েছে যা একটি প্রোগ্রামের মধ্যে উল্টানো দরকার - উদাহরণস্বরূপ কোডটি সম্পাদন করার জন্য পদ্ধতি এবং থ্রেডের অনুরোধ।
ইনভারসন অফ কন্ট্রোল সম্পর্কে আরও গভীরতার প্রতি আগ্রহীদের জন্য একটি কাগজ প্রকাশিত হয়েছে ডিজাইনের প্যাটার্ন হিসাবে ইনভারসন অফ কন্ট্রোলের আরও সম্পূর্ণ চিত্রের রূপরেখা প্রকাশ করে (অফিসফ্লোর: সফটওয়্যার ডিজাইনের উন্নতির জন্য অফিসের নিদর্শনগুলি ব্যবহার করে http://doi.acm.org/10.1145/ 2739011.2739013 একটি বিনামূল্যে সঙ্গে থেকে ডাউনলোড করতে পাওয়া কপি http://www.officefloor.net/about.html )।
যা চিহ্নিত তা হ'ল নিম্নলিখিত সম্পর্ক:
নিয়ন্ত্রণের বিপরীকরণ (পদ্ধতিগুলির জন্য) = নির্ভরতা (রাজ্য) ইনজেকশন + ধারাবাহিকতা ইনজেকশন + থ্রেড ইনজেকশন
বিপরীত নিয়ন্ত্রণের জন্য উপরের সম্পর্কের সংক্ষিপ্তসার উপলব্ধ - http://dzone.com/articles/inversion-of-coupling-control
আইওসি আপনার কোড এবং তৃতীয় পক্ষের কোডের (লাইব্রেরি / ফ্রেমওয়ার্ক) মধ্যে সম্পর্ক উল্টানোর বিষয়ে:
ডিআই (নির্ভরতা ইনজেকশন) অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণ কীভাবে প্রবাহিত হয় সে সম্পর্কে। Applicationতিহ্যবাহী ডেস্কটপ অ্যাপ্লিকেশনটিতে আপনার অ্যাপ্লিকেশন (মূল () পদ্ধতি) থেকে অন্যান্য গ্রন্থাগার পদ্ধতি কলগুলিতে নিয়ন্ত্রণ প্রবাহ ছিল, কিন্তু ডিআই নিয়ন্ত্রণ প্রবাহের সাথে উল্টে যায় যে ফ্রেমওয়ার্কটি আপনার অ্যাপ্লিকেশনটি শুরু করার, এটি আরম্ভ করার এবং যখনই প্রয়োজন হবে তখন আপনার পদ্ধতিগুলি আহ্বানের যত্ন নেয়।
শেষ পর্যন্ত আপনি সর্বদা জয় :)
আমি এই ব্যাখ্যাটি পছন্দ করি: http://joelabrahamsson.com/inversion-of-control-an-intr پيداوار-with-exferences-in-net/
এটি সহজ শুরু হয় এবং কোড উদাহরণগুলিও দেখায়।
গ্রাহক, এক্স, কিছু অর্জনের জন্য গ্রাহক, গ্রাহক শ্রেণীর প্রয়োজন। এগুলি সবই ভাল এবং প্রাকৃতিক, তবে এক্সের কি সত্যই এটি জানতে হবে যে এটি ওয়াই ব্যবহার করে?
কে যথেষ্ট জানেন না যে এটি ওয়াইয়ের আচরণ, পদ্ধতি, বৈশিষ্ট্যাদি ইত্যাদির সাথে ব্যবহার করে যা বাস্তবে কে বাস্তবায়ন করে তা না জেনে এটি ব্যবহার করে?
ওয়াইয়ের ক্ষেত্রে এক্স দ্বারা ব্যবহৃত আচরণের একটি বিমূর্ত সংজ্ঞাটি বের করে, আমি নীচে চিত্রিত করেছি, এবং ভোক্তার এক্স এর পরিবর্তে ওয়াইয়ের পরিবর্তে এর উদাহরণ ব্যবহার করতে পারি, এটি ওয়াই সম্পর্কে সুনির্দিষ্ট কিছু জানতে না পেরে যা করে তা চালিয়ে যেতে পারে
উপরের চিত্রে Y প্রয়োগ করে I এবং X I এর একটি উদাহরণ ব্যবহার করে While যদিও এটি যথেষ্ট সম্ভাবনা রয়েছে যে এক্স এখনও Y ব্যবহার করে যা আকর্ষণীয় তা X তা জানেন না। এটি কেবল জানে যে এটি এমন কিছু ব্যবহার করে যা I প্রয়োগ করে।
আরও তথ্য এবং সুবিধাগুলির বিবরণের জন্য নিবন্ধ পড়ুন যেমন:
...
আমি বুঝতে পারি যে উত্তরটি ইতিমধ্যে এখানে দেওয়া হয়েছে। তবে আমি এখনও মনে করি, নিয়ন্ত্রণের বিপর্যয় সম্পর্কে কিছু প্রাথমিক বিষয়গুলি ভবিষ্যতের পাঠকদের জন্য এখানে দীর্ঘ আলোচনা করা উচিত।
ইনভার্সন অফ কন্ট্রোল (আইওসি) হলিউড প্রিন্সিপাল নামে একটি খুব সাধারণ নীতিতে নির্মিত হয়েছে । এবং এটি বলে যে,
আমাদের ফোন করবেন না, আমরা আপনাকে কল করব
এর অর্থ হ'ল হলিউডে স্বপ্ন পূরণ করতে যাবেন না বরং আপনি যদি যোগ্য হন তবে হলিউড আপনাকে খুঁজে পাবে এবং আপনার স্বপ্নকে সত্য করে তুলবে। বেশ উল্টে গেছে, তাই না?
এখন যখন আমরা আইওসির নীতি সম্পর্কে আলোচনা করি, আমরা হলিউডের কথা ভুলে যেতে ব্যবহার করি। আইওসির জন্য তিনটি উপাদান থাকতে হবে, হলিউড, আপনি এবং আপনার স্বপ্ন পূরণের মতো একটি কাজ।
আমাদের প্রোগ্রামিং জগতে, হলিউড একটি জেনেরিক কাঠামোর প্রতিনিধিত্ব করে (আপনি বা অন্য কেউ লিখেছিলেন ), আপনি আপনার লিখেছেন এমন ইউজার কোড এবং টাস্কটি আপনার কোডটি সম্পাদন করতে চান তার প্রতিনিধিত্ব করে। এখন আপনি কখনও নিজের দ্বারা নিজের কাজটি ট্রিগার করতে যাবেন না, আইওসিতে নয়! বরং আপনি এমন সব কিছু ডিজাইন করেছেন যাতে আপনার কাঠামোটি আপনার জন্য আপনার কার্যকে ট্রিগার করে। সুতরাং আপনি একটি পুনর্ব্যবহারযোগ্য কাঠামো তৈরি করেছেন যা কাউকে নায়ক বা অন্য একজনকে খলনায়ক করে তুলতে পারে। তবে সেই কাঠামোটি সর্বদা দায়িত্বে থাকে, কখন কাউকে বাছাই করা এবং এটি কী হতে চায় তা কেবল কেউই জানেন knows
একটি বাস্তব জীবনের উদাহরণ এখানে দেওয়া হবে। মনে করুন, আপনি একটি ওয়েব অ্যাপ্লিকেশন বিকাশ করতে চান। সুতরাং, আপনি একটি ফ্রেমওয়ার্ক তৈরি করেন যা ওয়েব অ্যাপ্লিকেশনটির হ'ল HTTP অনুরোধ পরিচালনা করা, অ্যাপ্লিকেশন মেনু তৈরি করা, পৃষ্ঠাগুলি পরিবেশন করা, কুকিজ পরিচালনা করা, ইভেন্টগুলি ট্রিগার করা ইত্যাদি সমস্ত সাধারণ জিনিস পরিচালনা করে handle
এবং তারপরে আপনি আপনার ফ্রেমওয়ার্কে কিছু হুক রেখে যান যেখানে আপনি কাস্টম মেনু, পৃষ্ঠা, কুকিজ তৈরি করতে বা কোনও ব্যবহারকারীর ইভেন্ট লগ করার জন্য আরও কোড রাখতে পারেন etc. ব্রাউজারে।
সুতরাং, ধারণাটি বেশ সহজ। কোনও ব্যবহারকারী অ্যাপ্লিকেশন তৈরি করার পরিবর্তে যা সমস্ত কিছু নিয়ন্ত্রণ করে, প্রথমে আপনি একটি পুনঃব্যবহারযোগ্য কাঠামো তৈরি করেন যা সবকিছু নিয়ন্ত্রণ করে তারপরে আপনার কাস্টম কোডগুলি লিখবে এবং সময় মতো কার্যকর করতে ফ্রেমওয়ার্কটিতে এটি সংযুক্ত করবে।
লারাভেল এবং ইজেবি এই জাতীয় ফ্রেমওয়ার্কের উদাহরণ।
রেফারেন্স:
প্রোগ্রামিং স্পিচ
আইওসি সহজ শর্তে: এটি কোনও শ্রেণীর দ্বারা ব্যবহার করা যেতে পারে এমন কোনও ওয়াইল্ডকার্ড হিসাবে নির্দিষ্ট কিছু (যেমন ক্ষেত্র বা একটি পরামিতি) এর উপায় হিসাবে ইন্টারফেসের ব্যবহার। এটি কোডটির পুনরায় ব্যবহারের সুযোগ দেয়।
উদাহরণস্বরূপ, ধরা যাক যে আমাদের দুটি শ্রেণি রয়েছে: কুকুর এবং বিড়াল । উভয়ই একই গুণাবলী / রাজ্যগুলি ভাগ করে: বয়স, আকার, ওজন। সুতরাং কুকুর সার্ভিস এবং ক্যাটস সার্ভিস নামে একটি শ্রেণীর পরিষেবা তৈরির পরিবর্তে , আমি এনিমাল সার্ভিস নামে একটি একক তৈরি করতে পারি যা ডগ এবং ক্যাটকে কেবলমাত্র ইন্টারফেস আইআনিমাল ব্যবহার করলে তারা ব্যবহার করতে দেয় ।
তবে, ব্যবহারিকভাবে বলতে গেলে এর কিছুটা পিছনে রয়েছে।
ক) বেশিরভাগ বিকাশকারী এটি কীভাবে ব্যবহার করবেন তা জানেন না । উদাহরণস্বরূপ, আমি গ্রাহক নামে একটি শ্রেণি তৈরি করতে পারি এবং আমি স্বয়ংক্রিয়ভাবে (আইডিই এর সরঞ্জামগুলি ব্যবহার করে) আইসিস্টোমার নামের একটি ইন্টারফেস তৈরি করতে পারি । সুতরাং, ক্লাস এবং ইন্টারফেসে ভরা ফোল্ডারটি সন্ধান করা বিরল নয়, ইন্টারফেসগুলি পুনরায় ব্যবহার করা হবে কিনা তা বিবেচনা করা উচিত। একে ব্লাটেড বলা হয়। কিছু লোক তর্ক করতে পারে যে "ভবিষ্যতে হয়তো আমরা এটি ব্যবহার করতে পারি"। : - |
খ) এর কিছু সীমাবদ্ধতা রয়েছে। উদাহরণস্বরূপ, আসুন কুকুর এবং বিড়ালের ক্ষেত্রে কথা বলি এবং আমি কেবল কুকুরের জন্য একটি নতুন পরিষেবা (কার্যকারিতা) যুক্ত করতে চাই। ধরা যাক যে আমি কুকুরকে প্রশিক্ষণের জন্য যে দিনগুলি প্রয়োজন তা গণনা করতে চাই ( trainDays()
), বিড়ালের পক্ষে এটি অকেজো, বিড়ালদের প্রশিক্ষণ দেওয়া যায় না (আমি মজা করছি)।
খ .১) আমি যদি trainDays()
পরিষেবা অ্যানিমাল সার্ভিসে যুক্ত করি তবে এটি বিড়ালদের সাথেও কাজ করে এবং এটি মোটেও বৈধ নয়।
খ .২) আমি কোন শর্ত যুক্ত করতে পারি trainDays()
যেখানে এটি কোন শ্রেণিটি ব্যবহৃত হয় তা মূল্যায়ন করে। তবে এটি পুরোপুরি আইওসি ভেঙে যাবে।
খ .৩) আমি নতুন কার্যকারিতার জন্য ডগস সার্ভিস নামে একটি নতুন শ্রেণীর পরিষেবা তৈরি করতে পারি । তবে, এটি কোডটির রক্ষণাবেক্ষণযোগ্যতা বাড়িয়ে তুলবে কারণ কুকুরের জন্য আমাদের দুটি শ্রেণির পরিষেবা থাকবে (অনুরূপ কার্যকারিতা সহ) এবং এটি খারাপ।
আমি এর জন্য অনেক উত্তর পড়েছি তবে যদি কেউ এখনও বিভ্রান্ত থাকে এবং আইওসির ব্যাখ্যা দেওয়ার জন্য যদি একটি অতিরিক্ত আল্ট্রা "লেটম্যানস টার্ম" প্রয়োজন হয় তবে তা আমার গ্রহণযোগ্যতা:
কল্পনা করুন কোনও পিতা-মাতা এবং শিশু একে অপরের সাথে কথা বলছেন।
আইওসি ছাড়াই:
* পিতামাতা : আমি যখন আপনাকে প্রশ্ন করি তখন আপনি কেবল তখনই কথা বলতে পারবেন এবং আমি আপনাকে অনুমতি দিলে আপনি কেবল তখনই কাজ করতে পারবেন।
পিতা বা মাতা : এর অর্থ, আপনি আমাকে জিজ্ঞাসা করতে পারবেন না আপনি খেতে, খেলতে, বাথরুমে যেতে বা এমনকি আমি জিজ্ঞাসা না করে ঘুমাতে পার কিনা।
পিতামাতা : আপনি কি খেতে চান?
শিশু : না।
পিতা বা মাতা : ঠিক আছে, আমি ফিরে আসব। আমার জন্য অপেক্ষা করো.
শিশু : (খেলতে চায় তবে যেহেতু পিতামাতার কোনও প্রশ্ন নেই, তাই শিশু কিছুই করতে পারে না)।
1 ঘণ্টা পরে...
পিতা মাতা : আমি ফিরে এসেছি। তুমি কি খেলতে চাও?
শিশু : হ্যাঁ
পিতামাতা : অনুমতি মঞ্জুর।
শিশু : (অবশেষে খেলতে সক্ষম)
এই সাধারণ পরিস্থিতিটি ব্যাখ্যা করে যে নিয়ন্ত্রণটি পিতামাতার কেন্দ্রিক। সন্তানের স্বাধীনতা সীমাবদ্ধ এবং পিতামাতার প্রশ্নের উপর নির্ভর করে। শিশু যখন কথা বলার জন্য বলা হয় কেবল তখনই কথা বলতে পারে এবং অনুমতি পেলে কেবল কাজ করতে পারে ।
আইওসি সহ:
সন্তানের এখন প্রশ্ন জিজ্ঞাসা করার ক্ষমতা রয়েছে এবং পিতামাতার উত্তর এবং অনুমতি সহ প্রতিক্রিয়া জানাতে পারেন। সহজভাবে নিয়ন্ত্রণটি উল্টে গেছে! শিশু এখন যে কোনও সময় প্রশ্ন জিজ্ঞাসা করতে পারে এবং অনুমতি সম্পর্কে পিতামাতার সাথে এখনও নির্ভরতা থাকা সত্ত্বেও, সে প্রশ্ন করা / জিজ্ঞাসা করার পদ্ধতিতে নির্ভর করে না।
প্রযুক্তিগত উপায়ে ব্যাখ্যা করার ক্ষেত্রে এটি কনসোল / শেল / সেন্টিমিড বনাম জিইউআই মিথস্ক্রিয়াটির সাথে খুব মিল। (কোন নম্বর টপ উত্তরের উপরে মার্ক হ্যারিসনের উত্তর)। কনসোলে, আপনি যা জিজ্ঞাসা / প্রদর্শিত হচ্ছে তার উপর নির্ভরশীল এবং আপনি প্রথমে এর প্রশ্নের উত্তর না দিয়ে অন্যান্য মেনু এবং বৈশিষ্ট্যে ঝাঁপিয়ে উঠতে পারবেন না; একটি কঠোর অনুক্রমিক প্রবাহ অনুসরণ। (প্রোগ্রামগতভাবে এটি কোনও পদ্ধতি / ফাংশন লুপের মতো)। তবে জিইউআইয়ের সাথে মেনুগুলি এবং বৈশিষ্ট্যগুলি নির্ধারণ করা হয়েছে এবং ব্যবহারকারীরা যা কিছু প্রয়োজন তাই এটি নির্বাচন করতে পারেন যাতে আরও নিয়ন্ত্রণ এবং কম সীমাবদ্ধ থাকে। (প্রোগ্রামগতভাবে, মেনুগুলির নির্বাচিত হওয়ার পরে কলব্যাক থাকে এবং কোনও ক্রিয়া ঘটে)।
নিয়ন্ত্রণের বিপরীতমুখীকরণ ক্লায়েন্টের কাছ থেকে গ্রন্থাগার থেকে নিয়ন্ত্রণ স্থানান্তর সম্পর্কে। যখন আমরা এমন ক্লায়েন্টের কথা বলি যা একটি ফাংশনের মান (ল্যাম্বডা এক্সপ্রেশন )টিকে একটি উচ্চতর ক্রম (লাইব্রেরি ফাংশন) ইনজেক্ট করে যা গ্রন্থাগারের ফাংশনের আচরণকে নিয়ন্ত্রণ করে (পরিবর্তন করে)। গ্রাহক বা ফ্রেমওয়ার্ক যা লাইব্রেরিতে লাইব্রেরি নির্ভরতা (যা আচরণ বহন করে) ইনজেকশন দেয় তাকেও আইওসি হিসাবে বিবেচনা করা যেতে পারে
যেহেতু ইতিমধ্যে প্রশ্নের জন্য অনেক উত্তর রয়েছে তবে এগুলির কোনওটিই ইনভার্সন কন্ট্রোল শব্দটির ভাঙ্গন দেখায় না আমি আরও সংক্ষিপ্ত এবং দরকারী উত্তর দেওয়ার সুযোগ দেখছি।
বিপরীতমুখী নিয়ন্ত্রণ একটি প্যাটার্ন যা নির্ভরতা বিপরীতমুখী নীতি (ডিআইপি) প্রয়োগ করে। ডিআইপি নিম্নলিখিতটি জানিয়েছে: 1. উচ্চ-স্তরের মডিউলগুলি নিম্ন-স্তরের মডিউলগুলির উপর নির্ভর করবে না। উভয়ের বিমূর্ততা (যেমন ইন্টারফেস) উপর নির্ভর করা উচিত। ২. বিমূর্ততা বিশদগুলির উপর নির্ভর করবে না। বিশদ (কংক্রিট বাস্তবায়ন) বিমূর্তনের উপর নির্ভর করে।
নিয়ন্ত্রণের তিনটি ধরণের বিপরীত রয়েছে:
ইন্টারফেস বিপরীত সরবরাহকারীদের একটি ইন্টারফেস সংজ্ঞায়িত করা উচিত নয়। পরিবর্তে, ভোক্তার ইন্টারফেসটি সংজ্ঞায়িত করা উচিত এবং সরবরাহকারীরা এটি প্রয়োগ করতে হবে। ইন্টারফেস বিপর্যয় প্রতিটি সময় যখন নতুন সরবরাহকারী যুক্ত হয় তখন গ্রাহককে সংশোধন করার প্রয়োজনীয়তা অপসারণ করতে দেয়।
ফ্লো বিপর্যয় প্রবাহের নিয়ন্ত্রণ পরিবর্তন করে। উদাহরণস্বরূপ, আপনার কাছে একটি কনসোল অ্যাপ্লিকেশন রয়েছে যেখানে আপনি অনেকগুলি পরামিতি প্রবেশ করতে বলেছেন এবং প্রতিটি প্রবেশ করা প্যারামিটারের পরে আপনাকে এন্টার টিপতে বাধ্য করা হয়। আপনি এখানে ফ্লো ইনভার্জন প্রয়োগ করতে পারেন এবং একটি ডেস্কটপ অ্যাপ্লিকেশন প্রয়োগ করতে পারেন যেখানে ব্যবহারকারী পরামিতিগুলির প্রবেশের ক্রমটি চয়ন করতে পারে, ব্যবহারকারী পরামিতিগুলি সম্পাদনা করতে পারে এবং চূড়ান্ত ধাপে ব্যবহারকারীর কেবল একবার এন্টার টিপতে হবে।
উত্স বিবর্তন এটি নিম্নলিখিত নিদর্শন দ্বারা প্রয়োগ করা যেতে পারে: কারখানার প্যাটার্ন, পরিষেবা লোকেটার এবং নির্ভরতা ইনজেকশন। ক্রিয়া ইনভার্সন নির্ভরতা অবজেক্টগুলির প্রক্রিয়াকে এই ধরনের নির্ভরতা অবজেক্টগুলি ব্যবহার করে এমন প্রকারের বাইরে চলমান প্রকারের মধ্যে নির্ভরতা দূর করতে সহায়তা করে। নির্ভরতা খারাপ কেন? এখানে বেশ কয়েকটি উদাহরণ রয়েছে: আপনার কোডে একটি নতুন অবজেক্টের সরাসরি তৈরি পরীক্ষা আরও শক্ত করে তোলে; পুনঃসংশোধন ছাড়াই সমাবেশগুলিতে রেফারেন্স পরিবর্তন করা অসম্ভব (ওসিপি নীতি লঙ্ঘন); আপনি কোনও ওয়েব-ইউআই দ্বারা সহজে কোনও ডেস্কটপ-ইউআই প্রতিস্থাপন করতে পারবেন না।
সুতরাং উপরে 1 নম্বর । বিপরীতমুখী নিয়ন্ত্রণ কী?
রক্ষণাবেক্ষণ হ'ল এটি আমার পক্ষে এক নম্বর জিনিস সমাধান করে। এটি গ্যারান্টি দেয় যে আমি ইন্টারফেসগুলি ব্যবহার করছি যাতে দুটি ক্লাস একে অপরের সাথে অন্তরঙ্গ না হয়।
ক্যাসেল উইন্ডসর এর মতো ধারক ব্যবহার করার ক্ষেত্রে এটি রক্ষণাবেক্ষণের সমস্যাগুলি আরও ভাল সমাধান করে। কোডের একটি লাইন পরিবর্তন না করে ফাইল ভিত্তিক অধ্যবসায় ব্যবহার করে এমন একটি অংশের জন্য একটি ডাটাবেসে যে অংশটি সরিয়ে ফেলতে সক্ষম হবেন তা দুর্দান্ত (কনফিগারেশন পরিবর্তন, আপনি সম্পন্ন করেছেন) is
এবং একবার আপনি জেনেরিকাগুলিতে উঠলে এটি আরও ভাল হয়ে যায়। রেকর্ডগুলি গ্রহণ করে এবং বার্তা প্রকাশ করে এমন কোনও বার্তা প্রকাশক থাকার কথা ভাবুন। এটি কী প্রকাশ করে তা বিবেচ্য নয়, তবে রেকর্ড থেকে কোনও বার্তায় কিছু নেওয়ার জন্য ম্যাপারের প্রয়োজন।
public class MessagePublisher<RECORD,MESSAGE>
{
public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
{
//setup
}
}
আমি এটি একবার লিখেছি, তবে এখন আমি কোডের এই সেটটিতে অনেক ধরণের ইনজেকশন দিতে পারি যদি আমি বিভিন্ন ধরণের বার্তা প্রকাশ করি। আমি ম্যাপারগুলিও লিখতে পারি যা একই ধরণের রেকর্ড নেয় এবং এগুলি বিভিন্ন বার্তায় ম্যাপ করে। জেনারিকসের সাথে ডিআই ব্যবহার করে আমাকে অনেক কাজ সম্পাদনের জন্য খুব কম কোড লেখার ক্ষমতা দিয়েছে।
ওঁ হ্যাঁ, পরীক্ষার যোগ্যতা সম্পর্কিত উদ্বেগ রয়েছে তবে তারা আইওসি / ডিআই-র সুবিধার ক্ষেত্রে গৌণ।
আমি অবশ্যই আইওসি / ডিআইকে ভালবাসি।
ঘ। আপনার কিছুটা জটিলতার মাঝারি আকারের প্রকল্পের মিনিটে এটি আরও উপযুক্ত হয়ে ওঠে। আমি বলব আপনি যে মুহুর্তে ব্যথা অনুভব শুরু করবেন এটি উপযুক্ত হয়ে যায়।
ক্লাসের মধ্যে একটি অবজেক্ট তৈরি করাকে টাইট কাপলিং বলা হয়, স্প্রিং ডিজাইনের ধরণ (ডিআই / আইওসি) অনুসরণ করে এই নির্ভরতা সরিয়ে দেয়। কোন শ্রেণীতে ক্লাস তৈরির চেয়ে কনস্ট্রাক্টরে পাস করা বস্তু। আরও বেশি সাধারণ কাঠামো সংজ্ঞায়িত করার জন্য আমরা কনস্ট্রাক্টরে সুপার ক্লাসের রেফারেন্স ভেরিয়েবল দিই।