বিপরীতমুখী নিয়ন্ত্রণ কী?


1825

বিপরীতমুখী নিয়ন্ত্রণ (আইওসি) এটির প্রথম সম্মুখীন হলে বেশ বিভ্রান্ত হতে পারে।

  1. এটা কি?
  2. এটি কোন সমস্যার সমাধান করে?
  3. কখন ব্যবহার করা উপযুক্ত এবং কখন নয়?

292
এই উত্তরগুলির বেশিরভাগ ক্ষেত্রে ব্যবহৃত সমস্যাটি হ'ল ব্যবহৃত পরিভাষা। একটি পাত্রে কি? ইনভার্সান? নির্ভরতা? বড় শব্দ ছাড়াই সাধারণ ব্যক্তির সাথে এটি ব্যাখ্যা করুন।
kirk.burleson

13
প্রোগ্রামারগুলিতেও দেখুন SEএসই
ইজকাটা

8
এটি ডিপেন্ডেন্সি ইনজেকশন (ডিআই) - মার্টিন ফাউলারের স্বচ্ছতা এখানে দেখুন: মার্টিনফোলার
রিকার্ডো সানচেজ


এটি একটি বিশেষণ, বিশেষ্য নয়, এটি কোনও জিনিস নয়, এটি কোডে করা পরিবর্তনের বর্ণনা, যেখানে প্রবাহের নিয়ন্ত্রণ প্রতিনিধিতে থাকে, ধারক নয়।
মার্টিন স্প্যামার

উত্তর:


1522

ইনভার্শন অফ কন্ট্রোল (আইওসি) এবং ডিপেন্ডেন্সি ইনজেকশন (ডিআই) নিদর্শনগুলি আপনার কোড থেকে নির্ভরতা অপসারণ সম্পর্কে।

উদাহরণস্বরূপ, বলুন আপনার অ্যাপ্লিকেশনে একটি পাঠ্য সম্পাদক উপাদান রয়েছে এবং আপনি বানান চেক সরবরাহ করতে চান। আপনার স্ট্যান্ডার্ড কোডটি এরকম কিছু দেখাচ্ছে:

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স্বাক্ষরটিতে নির্ভরতা ইনজেকশন করছি ।


50
ভাল পরিষ্কার উদাহরণ। তবে, ধরুন, আইপেলের চেকার ইন্টারফেসটি অবজেক্টের কনস্ট্রাক্টরের কাছে পৌঁছে দেওয়ার পরিবর্তে, আমরা সেটেলটেবল সম্পত্তি (বা সেটস্পেলচেকার পদ্ধতি) হিসাবে প্রকাশ করেছি। এটি কি এখনও আইওসি গঠন করবে?
ডিভাইস 1

25
chainguy1337 - হ্যাঁ এটা হবে। কনস্ট্রাক্টর ইনজেকশন (উভয় নির্ভরতা ইনজেকশন কৌশল) এর বিপরীতে সেটার ব্যবহার করে সেটার ইনজেকশন বলা হয়। আইওসি একটি মোটামুটি জেনেরিক প্যাটার্ন, তবে নির্ভরতা ইনজেকশনটি আহরণ করে আইওসি
জ্যাক উক্লেজা

257
বহু আপ-ভোট থাকা সত্ত্বেও, এই উত্তরটি ভুল। দয়া করে martinfowler.com/articles/inication.html#InversionOfControl দেখুন । বিশেষত, "কন্ট্রোল অফ ইনভার্শন খুব সাধারণ শব্দ, এবং এইভাবে লোকেরা এটি বিভ্রান্তিকর বলে মনে করে the অংশটি নোট করুন various ফলস্বরূপ আমরা বিভিন্ন আইওসি অ্যাডভোকেটদের সাথে প্রচুর আলোচনার ফলস্বরূপ আমরা ডিপেন্ডেন্সি ইনজেকশন নামটি স্থির করেছি"।
রোগিরিও

45
আমি @ রোজারিয়ার সাথে একমত এটি কেন আইওসি বলা হয় তা ব্যাখ্যা করে না এবং আমি ভোটের সংখ্যা দেখে অবাক হয়েছি ;-)
অরবিন্দ ইয়াররাম

31
আমি @ রোজারিও এবং @ পাঙ্গিয়ার সাথে রয়েছি। এটি কনস্ট্রাক্টর ইনজেকশনের জন্য একটি ভাল উদাহরণ হতে পারে তবে মূল প্রশ্নের উত্তরের উত্তর নয়। আইওসি, ফোলার দ্বারা নির্ধারিত হিসাবে , কোনও ধরণের ইনজেকশন ব্যবহার না করেই উপলব্ধি করা যায়, যেমন কোনও সার্ভিস লোকেটার বা এমনকি সাধারণ উত্তরাধিকার ব্যবহার করে।
mtsz

642

কন্ট্রোলের বিপরীততা হ'ল আপনার প্রোগ্রাম কলব্যাকগুলি যেমন আপনি পাবেন যেমন একটি গুই প্রোগ্রামের মতো।

উদাহরণস্বরূপ, পুরানো স্কুল মেনুতে আপনার হতে পারে:

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

সুতরাং এখন নিয়ন্ত্রণটি উল্টে গেছে ... একটি স্থির ক্রমে কম্পিউটার গ্রহণের পরিবর্তে কম্পিউটারটি ডেটা প্রবেশ করাতে এবং ডাটাবেজে ডেটা সংরক্ষণ করার সময় ব্যবহারকারী নিয়ন্ত্রণ করে।

মূলত, ইভেন্ট লুপ, কলব্যাকস, বা ট্রিগারগুলি কার্যকর করে যে কোনও কিছু এই বিভাগে আসে।


161
এই লোকটিকে নিচে চিহ্নিত করবেন না প্রযুক্তিগতভাবে তিনি সঠিক আছেন মার্টিনফাউলর / ব্লিকি / ইনভার্জনওঅফকন্ট্রোল। html আইওসি খুব সাধারণ অধ্যক্ষ। নিয়ন্ত্রণের প্রবাহ নির্ভরতা ইনজেকশন দ্বারা "উল্টানো" কারণ আপনি কার্যকরভাবে কোনও বহিরাগত সিস্টেমের উপর নির্ভরশীলতা অর্পণ করেছেন (যেমন IoC ধারক)
জ্যাক উক্লেজা

38
স্নাইডারের মন্তব্যের সাথে একমত 5 ডাউনভোটস? মন বিচলিত হয়, যেহেতু এটিই একমাত্র উত্তর যা সত্যই সঠিক। ': দ্রষ্টব্য খোলার মত একটি GUI প্রোগ্রাম।' নির্ভরতা ইনজেকশনটি কেবলমাত্র আইওসি-র সর্বাধিক দেখা উপলব্ধি।
জেফ স্টার্নাল

40
প্রকৃতপক্ষে, এটি কয়েকটি সংখ্যক সঠিক আনোয়ার্সের মধ্যে একটি! বলছি, আইওসি নির্ভরতা সম্পর্কে মৌলিকভাবে নয় । একদমই না.
রোগিরিও

13
+1 - এটি মার্টিন ফোলারের নীচের বিবৃতিটির একটি ভাল বিবরণ (উদাহরণ সহ) - "প্রাথমিক ব্যবহারকারী ইন্টারফেসগুলি অ্যাপ্লিকেশন প্রোগ্রাম দ্বারা নিয়ন্ত্রিত হয়েছিল You প্রোগ্রামটি প্রম্পটগুলি চালিত করে এবং প্রতিটিটির প্রতিক্রিয়া বাছাই করে graph গ্রাফিকাল (বা এমনকি স্ক্রিন ভিত্তিক) ইউআই সহ ইউআই কাঠামোতে এই মূল লুপটি থাকে এবং আপনার প্রোগ্রামটি পরিবর্তে স্ক্রিনের বিভিন্ন ক্ষেত্রের জন্য ইভেন্ট হ্যান্ডলার সরবরাহ করে। এর প্রধান নিয়ন্ত্রণ প্রোগ্রামটি উল্টানো হয়েছিল, আপনার কাছ থেকে কাঠামোর দিকে সরানো হয়েছিল। "
আশীষ গুপ্ত

14
আমি এখন এটি পেয়েছি কেন মাঝে মাঝে এটি হলিউডের মূলনীতি: "আমাদেরকে ডাকবেন না, আমরা আপনাকে ডাকব না" হিসাবে
আখ্যায়িত করে কেন

419

বিপরীতমুখী নিয়ন্ত্রণ কী?

আপনি যদি এই দুটি সহজ পদক্ষেপ অনুসরণ করেন তবে আপনি নিয়ন্ত্রণের বিপরীতমুখী কাজটি করেছেন:

  1. কখন -করণীয় অংশ থেকে কী -করণীয় অংশটি আলাদা করুন ।
  2. নিশ্চিত করুন যে যখন অংশ হিসেবে জানে সামান্য সম্ভব সম্পর্কে কি অংশ; এবং বিপরীতভাবে.

আপনি আপনার প্রয়োগের জন্য যে প্রযুক্তি / ভাষা ব্যবহার করছেন তার উপর ভিত্তি করে এই প্রতিটি পদক্ষেপের জন্য বেশ কয়েকটি কৌশল সম্ভব।

-

বিপর্যয় নিয়ন্ত্রণ ইনভার্সান (আইওসি) অংশ বিভ্রান্তিকর কাজ নয়; কারণ বিপরীতটি আপেক্ষিক শব্দ। আইওসি বোঝার সেরা উপায়টি সেই শব্দটি ভুলে যাওয়া!

-

উদাহরণ

  • ইভেন্ট হ্যান্ডলিং। ইভেন্ট হ্যান্ডলার (কী করণীয় অংশ) - উত্থাপন ইভেন্টগুলি (কখন করণীয় অংশ)
  • ইন্টারফেস। কম্পোনেন্ট ক্লায়েন্ট (কখন করণীয় অংশ) - উপাদান ইন্টারফেস বাস্তবায়ন (কী করণীয় অংশ)
  • xUnit স্থিরতা। সেটআপ এবং টিয়ারডাউন (কী করণীয় অংশ) - xUnit ফ্রেমওয়ার্কগুলি শুরুতে সেটআপ এবং শেষে টিয়ারডাউনকে কল করে (কখন করণীয় অংশ)
  • টেমপ্লেট পদ্ধতি ডিজাইনের প্যাটার্ন। টেম্পলেট পদ্ধতি যখন করণীয় অংশ - আদিম সাবক্লাস বাস্তবায়ন কি করণীয় অংশ
  • সিওএমে ডিএলএল ধারক পদ্ধতি। DllMain, DllCanUnload, ইত্যাদি (কী করণীয় অংশ) - COM / OS (যখন করণীয় অংশ)

আপনি কীভাবে ইন্টারফেস বলছেন। কম্পোনেন্ট ক্লায়েন্ট (কখন করণীয় অংশ) "কখন" হিসাবে অর্থবোধ করে না যখন আমরা ইন্টারফেসগুলি ব্যবহার করি (উদা: নির্ভরতা ইনজেকশন), আমরা কেবল এটি বিমূর্ত করি এবং কোনও প্রয়োগ সংযোজন সম্পর্কে ক্লায়েন্টকে নমনীয়তা দিয়ে থাকি তবে "কখন" থাকে না সেখানে জড়িত ইভেন্ট হ্যান্ডলিংয়ের ইভেন্ট উত্থাপনের ক্ষেত্রে "কখন" আমি সম্মত।
ওল্ডস্কুল

'উপাদান ক্লায়েন্ট' দ্বারা আমি ইন্টারফেসের ব্যবহারকারী / ক্লায়েন্টকে বোঝাতে চাইছিলাম। উদ্দেশ্য কী কার্যকারিতা প্রসারিত করবে কিনা তা 'কখন কী করতে হবে' অংশটি ট্রিগার করতে ক্লায়েন্ট জানে।
আরপট্টবী

মার্টিন ফওলারের এই দুর্দান্ত নিবন্ধটি একবার দেখুন। তিনি দেখায় যে কীভাবে ইন্টারফেসগুলি নিয়ন্ত্রণের বিপরীতকরণের মৌলিক অংশটি করে: মার্টিনফোলার
ইনজেকশন

দুটি প্রথম বাক্য উজ্জ্বল। অসাধারণ !! কখন-করণ এবং কী করণীয় দ্বারা নির্ভুল পৃথকীকরণ !! আমি জানি না কেন অন্যান্য উত্তরগুলি কেন অনেকগুলি উপভোগ করে। তারা কেবল কোনও বোঝাপড়া ছাড়াই কোড কথা বলছে।
আমির জিয়ারতী

2
আমি ব্যাখ্যাটি পছন্দ করি what-to-doএবংwhen-to-do
KimchiMan

164

নিয়ন্ত্রণগুলির বিপরীততা উদ্বেগগুলি পৃথক করার বিষয়ে।

আইওসি ছাড়াই : আপনার কাছে একটি ল্যাপটপ কম্পিউটার রয়েছে এবং আপনি ঘটনাক্রমে স্ক্রিনটি ভেঙে ফেলেন। এবং ঘৃণা, আপনি একই মডেলের ল্যাপটপ স্ক্রিন বাজারে কোথাও খুঁজে পাবেন। সুতরাং আপনি আটকে আছেন।

আইওসি সহ : আপনার একটি ডেস্কটপ কম্পিউটার রয়েছে এবং আপনি ঘটনাক্রমে স্ক্রিনটি ভেঙে ফেলেছেন । আপনি দেখতে পান যে আপনি বাজার থেকে প্রায় কোনও ডেস্কটপ মনিটর দখল করতে পারেন, এবং এটি আপনার ডেস্কটপটির সাথে ভালভাবে কাজ করে।

আপনার ডেস্কটপ সফলভাবে এই ক্ষেত্রে আইওসি প্রয়োগ করে। এটি বিভিন্ন ধরণের মনিটর গ্রহণ করে, যখন ল্যাপটপটি না করে, ঠিক করার জন্য এটি একটি নির্দিষ্ট স্ক্রিনের প্রয়োজন।


1
@ লুও জিওং হুই নিস ব্যাখ্যা।
শচীন

3
বেশিরভাগ ডিজাইনের নিদর্শনগুলি যদি না হয় তবে আমাদের প্রাত্যহিক জীবনে তাদের সহযোজন রয়েছে যা আমরা দেখতে এবং বুঝতে পারি। ডিজাইনের ধরণটি বোঝার সর্বাধিক দক্ষ উপায় হ'ল তাদের দৈনন্দিন জীবনের অংশগুলি know এবং আমি বিশ্বাস করি অনেক আছে।
লুও জিওং হুই

6
ভুল উত্তর. আপনি নির্ভরতা ইঞ্জেকশনটি ব্যাখ্যা করছেন, আইওসি নয়। উপরে এই উত্তরের উপর
রোগেরিওর

2
আমি রাজী. এটি ডিআই, আইওসি নয়। তবুও এটিকে উপবিষ্ট করে তোলে, কারণ এটি একটি সহজ পদ্ধতির, তবুও বিষয়টির বোঝাপড়াটি প্রসারিত করতে সহায়তা করে।
মের

এটি নির্ভরতা ইনজেকশন ব্যাখ্যা করে। আইওসি নয় তবে সুন্দর এবং স্পষ্ট ব্যাখ্যা।
চামিন বিক্রমারথ্না

119

ইনভার্সন অফ কন্ট্রোল, (বা আইওসি) স্বাধীনতা অর্জন সম্পর্কে (আপনি বিবাহ করেছেন, আপনি স্বাধীনতা হারিয়েছেন এবং আপনাকে নিয়ন্ত্রণ করা হচ্ছে You আপনি বিবাহবিচ্ছেদ করেছেন, আপনি সবেমাত্র নিয়ন্ত্রণের বিপরীকরণ বাস্তবায়ন করেছেন That's এটাকেই আমরা বলেছিলাম "ডিক্লুপড" Good গুড কম্পিউটার সিস্টেম কিছু খুব ঘনিষ্ঠ সম্পর্ককে নিরুৎসাহিত করে।) আরও নমনীয়তা (আপনার অফিসের রান্নাঘরটি কেবল পরিষ্কার ট্যাপের জল সরবরাহ করে, আপনি যখন পান করতে চান তবে এটিই আপনার পছন্দ। একটি নতুন কফি মেশিন স্থাপনের মাধ্যমে আপনার বস নিয়ন্ত্রণের বিপরীতাকে কার্যকর করেছিলেন Now এখন আপনি পান নলের জল বা কফি নির্বাচন করার নমনীয়তা)) এবং কম নির্ভরতা (আপনার অংশীদার একটি চাকরি আছে, আপনার কোন চাকরি নেই, আপনি আর্থিকভাবে আপনার সঙ্গীর উপর নির্ভর করেন, তাই আপনি নিয়ন্ত্রণিত হন You আপনি একটি কাজ খুঁজে পান, আপনি নিয়ন্ত্রণের বিপরীকরণ বাস্তবায়ন করেছেন Good ভাল কম্পিউটার সিস্টেম ইন-নির্ভরতাকে উত্সাহ দেয়))

আপনি যখন ডেস্কটপ কম্পিউটার ব্যবহার করেন, আপনি স্লেভ করেছেন (বা বলুন, নিয়ন্ত্রিত)। আপনাকে কোনও স্ক্রিনের আগে বসে এটি দেখতে হবে। টাইপ করতে কীবোর্ডটি ব্যবহার করে এবং নেভিগেট করতে মাউস ব্যবহার করে। এবং একটি খারাপভাবে লেখা সফ্টওয়্যার আপনাকে আরও বেশি দাস করতে পারে। আপনি যদি ল্যাপটপের সাহায্যে আপনার ডেস্কটপটি প্রতিস্থাপন করেন তবে আপনি কিছুটা উল্টানো নিয়ন্ত্রণ করুন। আপনি এটি সহজেই নিতে পারেন এবং চারপাশে ঘুরে আসতে পারেন। সুতরাং এখন আপনি নিজের কম্পিউটারটি নিয়ন্ত্রণ করার পরিবর্তে আপনি যেখানে আপনার কম্পিউটারের সাথে রয়েছেন তা নিয়ন্ত্রণ করতে পারেন।

ইনভার্শন অফ কন্ট্রোল প্রয়োগ করে, একটি সফ্টওয়্যার / অবজেক্ট গ্রাহক নিয়ন্ত্রণ করা বা কম বিকল্পের পরিবর্তে, সফ্টওয়্যার / অবজেক্টের উপর আরও নিয়ন্ত্রণ / বিকল্প পেতে পারে।

উপরের ধারণাগুলি মাথায় রেখে আমরা এখনও আইওসির একটি মূল অংশ মিস করছি। আইওসি-র দৃশ্যে, সফ্টওয়্যার / অবজেক্ট গ্রাহক একটি পরিশীলিত কাঠামো। তার মানে আপনি তৈরি কোডটি নিজে কল করেন না। এখন আসুন কীভাবে ওয়েব অ্যাপ্লিকেশনের জন্য এই পদ্ধতিটি আরও ভাল কাজ করে তা ব্যাখ্যা করি।

মনে করুন আপনার কোডটি শ্রমিকদের একটি গ্রুপ। তাদের গাড়ি তৈরি করা দরকার। এই শ্রমিকদের গাড়ি তৈরির জন্য একটি জায়গা এবং সরঞ্জাম (একটি সফ্টওয়্যার ফ্রেমওয়ার্ক) প্রয়োজন। একটি traditionalতিহ্যবাহী সফ্টওয়্যার কাঠামো অনেক সরঞ্জাম সহ গ্যারেজের মতো হবে। কাজেই শ্রমিকদের নিজেরাই একটি পরিকল্পনা করা এবং গাড়িটি তৈরিতে সরঞ্জামগুলি ব্যবহার করা দরকার। গাড়ি তৈরি করা সহজ ব্যবসা নয়, শ্রমিকদের যথাযথভাবে পরিকল্পনা করা এবং সহযোগিতা করা সত্যিই কঠিন হবে। একটি আধুনিকসফ্টওয়্যার ফ্রেমওয়ার্কটি একটি আধুনিক গাড়ী কারখানার মতো হবে যেখানে সমস্ত সুযোগ সুবিধা এবং ব্যবস্থাপক রয়েছে। শ্রমিকদের কোনও পরিকল্পনা করতে হবে না, পরিচালকদের (কাঠামোর অংশ, তারা সবচেয়ে স্মার্ট ব্যক্তি এবং সবচেয়ে পরিশীলিত পরিকল্পনা তৈরি করেছে) সমন্বয় করতে সহায়তা করবে যাতে কর্মীরা জানতে পারে যে কখন তাদের কাজ করা উচিত (ফ্রেমওয়ার্কটি আপনার কোডকে কল করে)। পরিচালকগণ তাদের যে কোনও সরঞ্জাম ব্যবহার করতে (ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে) কেবলমাত্র শ্রমিকদের যথেষ্ট নমনীয় হওয়া দরকার।

যদিও শ্রমিকরা শীর্ষ স্তরের প্রকল্প পরিচালনার নিয়ন্ত্রণ পরিচালকদের (কাঠামো) দেয় give তবে কিছু পেশাদারদের সাহায্য করা ভাল। এটি সত্যই আসল আইওসি ধারণাটি এসেছে।

এমভিসি আর্কিটেকচার সহ আধুনিক ওয়েব অ্যাপ্লিকেশনগুলি ইউআরএল রাউটিং করার ফ্রেমওয়ার্কের উপর নির্ভর করে এবং ফ্রেমওয়ার্কটি কল করার জন্য কন্ট্রোলারদের রাখে।

নির্ভরতা ইনজেকশন এবং নিয়ন্ত্রণের বিপরীততা সম্পর্কিত। নির্ভরতা ইনজেকশনটি মাইক্রো স্তরে এবং নিয়ন্ত্রণের বিপরীতটি ম্যাক্রো স্তরে থাকে at কোনও খাবার শেষ করতে (আইওসি প্রয়োগ করুন) আপনাকে প্রতিটি কামড় (ডিআই প্রয়োগ করুন) খেতে হবে।


20
আমি বিবাহের সাথে তুলনামূলক ডিআই এবং আইওসির বিবাহবিচ্ছেদের পক্ষে ভোট দিয়েছি।
মারেক বার

"যদিও শ্রমিকরা শীর্ষ স্তরের প্রকল্প পরিচালনার নিয়ন্ত্রণ ম্যানেজারকে দেয় (কাঠামো)। তবে কিছু পেশাদারকে সাহায্য করা ভাল। আইওসি এর ধারণাটি সত্যই এসেছে।" - প্রথমত নিয়ন্ত্রণটি হ'ল ম্যানেজারের সাথে আপনি কী ব্যাখ্যা করতে পারেন যে নিয়ন্ত্রণটি কীভাবে উল্টে যায়? পেশাদারদের সহায়তায় (কোন ধরণের পেশাদার)? কীভাবে?
ইসতিয়াক আহমেদ

@ ইসতিয়াক আহমেদ, এমন একটি গ্যারেজের সাথে তুলনা করছেন যেখানে কর্মীদের সমস্ত কিছুর পুরোপুরি নিয়ন্ত্রণ রয়েছে, আধুনিক গাড়ি কারখানার পরিচালকরা উত্পাদন নিয়ন্ত্রণ করে। সুতরাং এখন শ্রমিকরা নিয়ন্ত্রণের পরিবর্তে নিয়ন্ত্রিত। সচেতন হন, এই প্রসঙ্গে পরিচালকগণ আধুনিক গাড়ি কারখানার অংশ, শ্রমিকদের অংশ নয়। পেশাদাররা হলেন পরিচালকরা যারা গাড়ি পরিকল্পনায় এবং তৈরিতে পেশাদার।
লুও জিওং হুই

1
বিবাহিতদের উদ্দেশ্যে বার্তা: এখনই বিবাহবিচ্ছেদ করবেন না, আপনার শিশু ক্লাসগুলিও আইওসি প্রয়োগ করতে পারে।
জুলিয়ান

হ্যাঁ, বিবাহ সম্পর্কে এটিই আমার দৃষ্টি
আইওসি

94

ইনভার্সন অফ কন্ট্রোল ব্যবহার করার আগে আপনাকে এ সম্পর্কে ভালভাবে সচেতন হওয়া উচিত যে এর পক্ষে এর পক্ষে মতামত রয়েছে এবং এটি করা হলে আপনি কেন এটি ব্যবহার করছেন তা আপনার জানা উচিত।

পেশাদাররা:

  • আপনার কোডটি ডিকপল হয়ে যায় যাতে আপনি বিকল্প প্রয়োগের সাথে সহজেই কোনও ইন্টারফেসের প্রয়োগগুলি বিনিময় করতে পারেন
  • এটি বাস্তবায়নের পরিবর্তে ইন্টারফেসের বিরুদ্ধে কোডিংয়ের জন্য শক্তিশালী প্রেরণা
  • আপনার কোডের জন্য ইউনিট পরীক্ষাগুলি লেখা খুব সহজ কারণ এটি এর নির্মাতা / সেটারগুলিতে গ্রহণযোগ্য বস্তুর চেয়ে অন্য কোনও কিছুর উপর নির্ভর করে এবং আপনি সহজেই বিচ্ছিন্নভাবে সঠিক বস্তুগুলির সাহায্যে এগুলি সূচনা করতে পারেন।

কনস:

  • আইওসি কেবল আপনার প্রোগ্রামের নিয়ন্ত্রণ প্রবাহকেই উল্টে দেয় না, এটি যথেষ্ট মেঘলাও করে। এর অর্থ আপনি আর আপনার কোডটি পড়তে পারবেন না এবং এক জায়গা থেকে অন্য স্থানে লাফিয়ে উঠতে পারবেন না কারণ যে সংযোগগুলি সাধারণত আপনার কোডে থাকবে সেগুলি আর কোডে নেই। পরিবর্তে এটি এক্সএমএল কনফিগারেশন ফাইল বা টীকাগুলিতে এবং আপনার আইওসি ধারকটির কোডে রয়েছে যা এই মেটাডেটার ব্যাখ্যা করে।
  • একটি নতুন শ্রেণীর বাগ রয়েছে যেখানে আপনি আপনার এক্সএমএল কনফিগারেশনটি পেয়েছেন বা আপনার এন্টোটেশনগুলি ভুল হয়ে যায় এবং নির্দিষ্ট আইনে আপনার আইওসি কনটেইনারটি কেন আপনার কোনও বস্তুর মধ্যে নাল রেফারেন্স দেয় কেন তা জানতে আপনি প্রচুর সময় ব্যয় করতে পারেন।

ব্যক্তিগতভাবে আমি আইওসি-র শক্তিশালী পয়েন্টগুলি দেখতে পাই এবং আমি সেগুলি সত্যই পছন্দ করি তবে আমি যখনই সম্ভব সম্ভব আইওসি এড়িয়ে চলি it এক্সএমএল কনফিগারেশন বা টীকা মেটাডেটা এবং এটি বাদে পড়ে (এবং পড়া) falls


3
প্রথম কোণটি ভুল। আদর্শভাবে আপনার কোডটিতে আইওসি পাত্রে কেবল 1 টি ব্যবহার থাকতে হবে এবং এটিই আপনার মূল পদ্ধতি। অন্য সব কিছু সেখান থেকে
ছিটকে

23
আমি মনে করি তার অর্থ কী, আপনি কেবল পড়তে পারবেন না: মাই সার্ভিস.ডোসোমিংথিং () এবং ডোসোমিংথিংয়ের সংজ্ঞাতে যান, কারণ আইওসি-র সাথে মাই সার্ভিসিংটি কেবল একটি ইন্টারফেস এবং আপনার প্রকৃত বাস্তবায়ন আপনার অজানা, আপনি যদি না তাকান এটি এক্সএমএল কনফিগারেশন ফাইল বা মূল পদ্ধতিতে যেখানে আপনার আইওসি সেটআপ হয়।
ক্রিসমাসি

7
এইখানেই রিশার্পার সাহায্য করে - ইন্টারফেসের বিরুদ্ধে "প্রয়োগে যান" ক্লিক করুন। আইওসি এড়ানো (বা আপনার উদাহরণ থেকে আরও নির্দিষ্ট করে ডিআই) সম্ভবত
এটিরও

10
পুনরায়: এটি আপনার সফ্টওয়্যারটিকে ক্লাসের সংকলনে পরিণত করে যা আর "আসল" প্রোগ্রাম গঠন করে না তবে এক্সএমএল কনফিগারেশন বা টীকা মেটাডেটা দ্বারা একসাথে রাখা দরকার এবং এটি ছাড়াই পতিত (এবং পড়ে) - আমার মনে হয় এটি খুব বিভ্রান্তিকর। ফ্রেমওয়ার্কের উপরে লেখা যে কোনও প্রোগ্রামের ক্ষেত্রেও একই কথা বলা যেতে পারে। একটি ভাল আইওসি ধারকটির সাথে পার্থক্য হ'ল আপনি যদি সক্ষম হবেন যে আপনার প্রোগ্রামটি যদি খুব ভালভাবে ডিজাইন করে এবং লিখিত হয় তবে আপনার কোডের নূন্যতম পরিবর্তনগুলি নিয়ে এটিকে বের করে আনা এবং আইওসি পুরোপুরি টস আউট এবং আপনার জিনিসগুলি হাত দিয়ে তৈরি করতে সক্ষম হবেন ।
অগ্নি বিয়ার

7
এই মত একটি বাস্তব বিশ্বের উত্তর দেখতে ভাল! আমি মনে করি যে প্রচুর অভিজ্ঞ প্রোগ্রামার রয়েছে, অবজেক্ট ওরিয়েন্টেটেড ডিজাইন এবং টিডিডি অনুশীলনের সাথে স্বাচ্ছন্দ্যযুক্ত, ইতিমধ্যে ইন্টারফেস, কারখানার নিদর্শনগুলি, ইভেন্ট চালিত মডেলগুলি ব্যবহার করে এবং এটি "আইওসি" বাজওয়ার্ড উদ্ভাবনের আগে বিদ্রূপ করার অর্থ কোথায় তা উপস্থাপিত হয়েছিল। দুর্ভাগ্যক্রমে অনেকগুলি বিকাশকারী / "স্থপতি" যদি আপনি তাদের পছন্দের ফ্রেমওয়ার্ক ব্যবহার না করেন তবে খারাপ অনুশীলনের দাবি করে। জটিলতার একটি ভগ্নাংশের সাথে একই লক্ষ্য অর্জনের জন্য আমি আরও ভাল নকশা, অন্তর্নির্মিত ভাষা ধারণা এবং সরঞ্জামগুলির ব্যবহার পছন্দ করি, যেমন: আপনি বলছেন তেমন বাস্তবায়নে "ক্লাউডিং" না করে :-)
টনি ওয়াল

68
  1. উইকিপিডিয়া নিবন্ধ । আমার কাছে, নিয়ন্ত্রণের বিপরীতকরণটি আপনার ক্রমযুক্ত লিখিত কোডটি পরিণত করে এবং এটি একটি প্রতিনিধি কাঠামোয় পরিণত করছে। আপনার প্রোগ্রামটি স্পষ্টভাবে সমস্ত কিছু নিয়ন্ত্রণ করার পরিবর্তে, আপনার প্রোগ্রামটি নির্দিষ্ট কিছু ফাংশন সহ একটি শ্রেণি বা পাঠাগার স্থাপন করে যখন নির্দিষ্ট কিছু ঘটে থাকে।

  2. এটি কোড সদৃশ সমাধান করে। উদাহরণস্বরূপ, পুরানো দিনগুলিতে আপনি নিজের ইভেন্ট লুপটি ম্যানুয়ালি লিখতেন, নতুন ইভেন্টের জন্য সিস্টেম লাইব্রেরিগুলিতে পোলিং করতেন। আজকাল, আপনি সর্বাধিক আধুনিক এপিআইগুলি কেবল আপনার লাইব্রেরিগুলিকে কী ইভেন্টগুলিতে আগ্রহী তা বলছেন এবং সেগুলি কখন ঘটে তা আপনাকে জানিয়ে দেবে।

  3. কোডের অনুলিপিকে হ্রাস করার জন্য নিয়ন্ত্রণের বিপরীতকরণ একটি ব্যবহারিক উপায় এবং যদি আপনি নিজেকে একটি সম্পূর্ণ পদ্ধতি অনুলিপি করে এবং কেবল কোডের একটি ছোট অংশ পরিবর্তন করতে দেখেন তবে আপনি নিয়ন্ত্রণের বিপরীতে এটিকে মোকাবেলা করতে বিবেচনা করতে পারেন। প্রতিনিধি, ইন্টারফেস, এমনকি কাঁচা ফাংশন পয়েন্টারগুলির ধারণার মাধ্যমে অনেকগুলি ভাষায় নিয়ন্ত্রণের বিপরীতকরণকে সহজ করা যায়।

    সব ক্ষেত্রেই এটি ব্যবহার করা উপযুক্ত নয়, কারণ কোনও প্রোগ্রামের প্রবাহটি এভাবে লেখার সময় অনুসরণ করা শক্ত হতে পারে। এটি একটি লাইব্রেরি লেখার সময় পদ্ধতিগুলি ডিজাইনের একটি কার্যকর উপায় যা পুনরায় ব্যবহার করা হবে, তবে এটি যদি আপনার কোডটির সদৃশ সমস্যাটি সত্যিই সমাধান না করে তবে আপনার নিজের প্রোগ্রামের মূল অংশে খুব কম ব্যবহার করা উচিত।


37
আমি খুঁজে পাই যে উইকিপিডিয়া নিবন্ধটি খুব বিভ্রান্তিকর এবং ঠিক করার দরকার রয়েছে। হাসির জন্য আলোচনার পৃষ্ঠাটি দেখুন।
ডিভাইস 1

আপনার নিজের ইভেন্টের লুপটি লেখালেখি করা এখনও নিয়ন্ত্রণের বিপরীত হতে পারে, যদি ইভেন্ট ইভেন্টটি লুপটি একটি কাঠামোর জায়গা নেয় এবং বাকী কোডটি আইওসি নীতিটি ব্যবহার করে আপনি কেবল নিজের ফ্রেমওয়ার্কটি লিখেছেন। এটি আসলে কোনও খারাপ জিনিস নয়, এটি কেবলমাত্র কিছুটা বেশি কোডিংয়ের দামে পঠনযোগ্যতা বৃদ্ধি করে (এটি সর্বদা উপযুক্তও নয়)।
লিজাত

45

তবে আমি মনে করি এটির সাথে আপনাকে খুব সাবধানতা অবলম্বন করতে হবে। আপনি যদি এই প্যাটার্নটিকে অতিরিক্ত ব্যবহার করবেন তবে আপনি খুব জটিল ডিজাইন এবং আরও জটিল কোড তৈরি করবেন।

টেক্সটএডিটরের সাথে এই উদাহরণটির মতো: আপনার যদি কেবল একটি স্পেলচেকার থাকে তবে আইওসি ব্যবহার করা সত্যই প্রয়োজন হয় না? ইউনিট পরীক্ষা বা অন্য কিছু লেখার দরকার না থাকলে ...

যাইহোক: যুক্তিসঙ্গত হতে হবে। ডিজাইনের ধরণগুলি ভাল অনুশীলন তবে বাইবেল প্রচার করা যায় না। এটি সর্বত্র আটকাবেন না।


3
আপনি কীভাবে জানবেন যে আপনার কাছে কেবল একটি স্পেলচেকার থাকবে?
ট্রেস করুন

@ ট্রেস আপনি জানতে পারবেন যে প্রোগ্রামটি আপনি লিখতে যাচ্ছেন তা উদাহরণস্বরূপ ব্যবহৃত হতে চলেছে। এখনও কিছু কৌশল যেমন নির্ভরতা ইনজেকশন এত সস্তা যে খুব কমই এরকম কোনও ক্ষেত্রে এগুলি ব্যবহার না করার কারণ রয়েছে।
লিজাত

44

আমার কাছে আইওসি / ডিআই কলিং অবজেক্টের উপর নির্ভরতা বাড়িয়ে দিচ্ছে। সুপার সিম্পল

প্রযুক্তিবিহীন উত্তরটি আপনি এটি চালু করার আগেই একটি গাড়িতে একটি ইঞ্জিন বদল করতে সক্ষম হচ্ছেন। যদি সবকিছু ঠিকঠাক হয় (ইন্টারফেস), আপনি ভাল।


44

মনে করুন আপনি একটি বস্তু। এবং আপনি একটি রেস্টুরেন্ট যান:

আইওসি ছাড়াই : আপনি "আপেল" চাইবেন এবং আপনি আরও জিজ্ঞাসা করলে সর্বদা আপেল পরিবেশন করা হয়।

আইওসি সহ : আপনি "ফল" জিজ্ঞাসা করতে পারেন। প্রতিবার পরিবেশন করা হলে আপনি বিভিন্ন ফল পেতে পারেন। উদাহরণস্বরূপ, আপেল, কমলা বা জলের তরমুজ।

সুতরাং, স্পষ্টতই, আইওসি পছন্দ হয় যখন আপনি জাতগুলি পছন্দ করেন।


26
  1. নিয়ন্ত্রণের বিপরীতমুখীতা সিস্টেমের উপাদানগুলি এবং স্তরগুলি ডিকপলিংয়ের জন্য ব্যবহৃত একটি প্যাটার্ন। প্যাটার্নটি তৈরি করা হয় যখন একটি উপাদান ইনজেকশন নির্ভরতা মাধ্যমে প্রয়োগ করা হয়। এই নির্ভরতা সাধারণত আরও ডিকপলিং এবং টেস্টিবিলিটি সমর্থন করার জন্য ইন্টারফেস হিসাবে সরবরাহ করা হয়। আইওসি / ডিআই পাত্রে যেমন ক্যাসল উইন্ডসর, ইউনিটি হ'ল সরঞ্জামগুলি (গ্রন্থাগার) যা IoC সরবরাহের জন্য ব্যবহার করা যেতে পারে। এই সরঞ্জামগুলি আজীবন, এওপি / ইন্টারসেপশন, নীতি, ইত্যাদি সহ সাধারণ নির্ভরতা পরিচালনার উপরে এবং বাইরেও বর্ধিত বৈশিষ্ট্য সরবরাহ করে

  2. ক। কোনও উপাদানকে নির্ভরতা পরিচালনার জন্য দায়বদ্ধ হতে দূরে করে।
    খ। বিভিন্ন পরিবেশে নির্ভরতা বাস্তবায়ন অদলবদল করার ক্ষমতা সরবরাহ করে।
    গ। নির্ভরতা উপহাসের মাধ্যমে কোনও উপাদানকে পরীক্ষা করার অনুমতি দেয়।
    ঘ। সমস্ত অ্যাপ্লিকেশন জুড়ে সংস্থান ভাগ করার জন্য একটি প্রক্রিয়া সরবরাহ করে।

  3. ক। পরীক্ষা-চালিত বিকাশ করার সময় সমালোচক। আইওসি ব্যতীত এটি পরীক্ষা করা কঠিন হতে পারে, কারণ পরীক্ষার অধীনে থাকা উপাদানগুলি সিস্টেমের বাকী অংশগুলিতে অত্যন্ত মিলিত হয়।
    খ। মডুলার সিস্টেম বিকাশ করার সময় সমালোচনামূলক। একটি মডুলার সিস্টেম এমন একটি সিস্টেম যার উপাদানগুলি পুনঃসংশোধনের প্রয়োজন ছাড়াই প্রতিস্থাপন করা যেতে পারে।
    গ। সংক্ষেপে যদি এন্টারপ্রাইজ অ্যাপ্লিকেশনটিতে আংশিকভাবে সমাধানের প্রয়োজন এমন অনেক ক্রস কাটা উদ্বেগ রয়েছে।


2
আসলে, আইওসি মূলত নির্ভরতা পরিচালনার বিষয়ে নয়। দয়া করে martinfowler.com/articles/inication.html#InversionOfControl দেখুন অংশটি নোট করুন "নিয়ন্ত্রণের বিপরীত পরিবর্তন খুব সাধারণ শব্দ, এবং এইভাবে লোকেরা এটিকে বিভ্রান্তিকর বলে মনে করে। ফলস্বরূপ বিভিন্ন আইওসি অ্যাডভোকেটদের সাথে প্রচুর আলোচনার ফলস্বরূপ আমরা Dependency Injection "নামে স্থির হয়েছিলেন on
রোগিরিও

26

শুধুমাত্র প্রথম অংশের উত্তর দেওয়া। এটা কি?

বিপরীতকরণের নিয়ন্ত্রণ (আইওসি) অর্থ প্রথম শ্রেণীর উদাহরণ তৈরি করার পরিবর্তে শ্রেণীর প্রথম এবং দ্বিতীয় শ্রেণীর নির্ভরতাগুলির (উদাহরণস্বরূপ কনস্ট্রাক্টরের মাধ্যমে তাদের ইনজেকশনের) উদাহরণ তৈরি করা এবং শ্রেণীর উদাহরণটি নির্ভরতার উদাহরণ তৈরি করে। সুতরাং, নিয়ন্ত্রণ বিপর্যয় inverts নিয়ন্ত্রণ প্রবাহ কর্মসূচির। পরিবর্তে callee নিয়ন্ত্রণ নিয়ন্ত্রণ প্রবাহ (একই নির্ভরতা তৈরি), আহ্বানকারী প্রোগ্রামের নিয়ন্ত্রণ প্রবাহ নিয়ন্ত্রণ করে


এটি শ্রেণি বা অবজেক্ট তৈরি সম্পর্কে নয়, এই মার্টিনফোলার
রাঘবেন্দ্র সিং

22

আমি এই দুটি পদ সম্পর্কে আমার সাধারণ বোঝার বিষয়টি লিখব:

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 আছে।
প্রতিটি মডিউল এটির জন্য কীভাবে ডিজাইন করা হয়েছে তা ফোকাস করতে পারে।
মডিউলগুলি অন্যান্য সিস্টেমগুলি কী করে সে সম্পর্কে কোনও অনুমান করে না তবে তাদের চুক্তিতে নির্ভর করে।
মডিউলগুলি প্রতিস্থাপনের অন্যান্য মডিউলগুলির কোনও পার্শ্ব প্রতিক্রিয়া নেই
আমি জিনিসগুলি এখানে বিমূর্ত রাখব, আপনি বিষয়টির বিস্তারিত বোঝার জন্য নিম্নলিখিত লিঙ্কগুলিতে দেখতে পারেন।
উদাহরণ সহ একটি ভাল পড়া

বিস্তারিত ব্যাখ্যা


17

আমি নীলবজেক্টের সাথে একমত , তবে আমি এটিতে যুক্ত করতে চাই:

যদি আপনি নিজেকে একটি সম্পূর্ণ পদ্ধতি অনুলিপি করে এবং কেবল কোডের একটি ছোট অংশ পরিবর্তন করতে দেখেন তবে আপনি নিয়ন্ত্রণের বিপরীতে এটিকে মোকাবেলা করতে বিবেচনা করতে পারেন

আপনি যদি নিজের চারপাশে কোড অনুলিপি এবং আটকানো দেখতে পান তবে আপনি প্রায় সর্বদা কিছু ভুল করছেন । একবার এবং কেবল একবার ডিজাইনের নীতি হিসাবে কোডেড ।


17

উদাহরণস্বরূপ, টাস্ক # 1 অবজেক্ট তৈরি করা। আইওসি ধারণা ব্যতীত # 1 টাস্কটি প্রোগ্রামার দ্বারা সম্পন্ন হওয়ার কথা। তবে আইওসি কনসেপ্টের সাহায্যে টাস্ক 1 1 কনটেইনার দ্বারা সম্পন্ন হবে।

সংক্ষেপে কন্ট্রোলটি প্রোগ্রামার থেকে ধারক হয়ে উল্টে যায়। সুতরাং, এটিকে নিয়ন্ত্রণের বিপরীত হিসাবে ডাকা হয়।

আমি এক ভাল উদাহরণ পাওয়া এখানে


কনটেইনারটি আইওসি-তে একটি ধারণা যেখানে নির্ভরতা ("ব্যবহারকারী" অবজেক্ট এবং "ব্যবহৃত" অবজেক্টের মধ্যে সম্পর্ক) এবং অবজেক্টের উদাহরণগুলি সহ অবজেক্ট মডেল থাকে, থাকে এবং পরিচালিত হয় - যেমন, অন্তর্ভুক্ত। ধারকটি সাধারণত আইওসি ফ্রেমওয়ার্ক দ্বারা সরবরাহ করা হয়, যেমন স্প্রিং। আপনার অ্যাপ্লিকেশন তৈরি করে এমন বস্তুর জন্য এটি রানটাইম সংগ্রহস্থল হিসাবে ভাবেন।
অজানারি বিয়ার

17

বলার অপেক্ষা রাখে না যে আমরা কিছু হোটেলে কিছু সভা করি।

অনেক লোক, অনেক জল জল, অনেক প্লাস্টিকের কাপ।

যখন কেউ পান করতে চায়, সে কাপটি ভরাট করে, পানীয়টি পান করে মেঝেতে ফেলে দেয়।

ঘন্টা বা অন্য কিছু পরে আমাদের প্লাস্টিকের কাপ এবং জলে 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

}

উপকারী সংজুক:-


সিঙ্গলেটস স্ট্যাটিক টাইপ অবজেক্টস না?
গকিগুকস

16

এটি "আইওসি" সংক্ষিপ্ত বিবরণ এবং এটির নাম যার জন্য এটি দাঁড়িয়েছে তা সম্পর্কে সবচেয়ে বিভ্রান্তিকর বিষয়টি এটি একটি নামটি প্রায় গ্ল্যামারাস - প্রায় একটি শব্দের নাম।

প্রক্রিয়াজাতীয় এবং ইভেন্ট চালিত প্রোগ্রামিংয়ের মধ্যে পার্থক্য বর্ণনা করার জন্য আমাদের কি আসলেই এমন একটি নাম দরকার? ঠিক আছে, যদি আমাদের প্রয়োজন হয় তবে কী আমাদের সমাধানের চেয়ে আরও বিভ্রান্ত করে এমন একটি "নতুন জীবনের চেয়ে বড়" নামটি নেওয়া উচিত?


1
আইওসি! = ইভেন্ট চালিত। সাদৃশ্যগুলি (এবং কিছু ক্ষেত্রে ওভারল্যাপ হয়) তবে তারা মূলত একই দৃষ্টান্ত নয়।
অজানারি বিয়ার

ভাল প্রশ্ন. ইভেন্ট চালিত প্রোগ্রামিং অবশ্যই আইওসি। আমরা ইভেন্ট হ্যান্ডলারগুলি লিখি এবং তারা ইভেন্ট লুপ থেকে কল পায়। তবে, ইভেন্ট চালিত প্রোগ্রামিংয়ের চেয়ে আইওসি আরও জেনেরিক ধারণা .. আপনি যদি সাবক্লাসে কোনও পদ্ধতিকে ওভাররাইড করেন তবে এটি এক ধরণের আইওসিও। আপনি এমন একটি কোড লিখুন যা যথাযথ রেফারেন্স (উদাহরণ) ব্যবহারের সময় অনুরোধ করা হবে।
vi.su.

15

যখন আপনি মুদি দোকানে যান এবং আপনার স্ত্রী আপনাকে কেনার পণ্যগুলির তালিকা দেয় তখন নিয়ন্ত্রণের বিপরীতটি হয়।

পদ প্রোগ্রামিং তিনি কলব্যাক ফাংশন পাস getProductList()- ফাংশন আপনি নির্বাহ হয় doShopping()

এটি ফাংশনের ব্যবহারকারীকে এর কিছু অংশ সংজ্ঞায়িত করার অনুমতি দেয়, এটি আরও নমনীয় করে তোলে।


5
আমার স্ত্রী সাধারণত আমার সাথে দোকান করেন তবে আমি এই বক্তব্যের সাথে একমত হই।
ha9u63ar

1
@ ha9u63ar আপনার স্ত্রী আপনার সাথে দোকান আছে? আচ্ছা এটি তখন সমষ্টি বলে।
জুলিয়ান

2
যদি সে টাকাটি দেয় তবে তাকে ডিআই বলে।
সান

1
উল্টো শব্দটি - উল্টোদিকে এসেছিল, যখন আপনার স্ত্রী getProductList()আপনাকে অর্থের জন্য উত্স খুঁজতে হবে, তার মানে নিয়ন্ত্রণ আপনার পাশে রয়েছে। বিপর্যয়ের ক্ষেত্রে, সে নিয়ন্ত্রণ করবে, অর্থ কেনার জন্য যে অর্থ প্রদান করবে তা বোঝায়।
সান

13

আমি খুব স্পষ্ট উদাহরণ পাওয়া এখানে যা ব্যাখ্যা কিভাবে 'নিয়ন্ত্রণ উল্টানো হয়।

ক্লাসিক কোড (নির্ভরতা ইনজেকশন ছাড়াই)

এখানে ডিআই ব্যবহার না করে একটি কোড মোটামুটি কাজ করবে:

  • অ্যাপ্লিকেশনটির ফু প্রয়োজন (যেমন একটি নিয়ামক), তাই:
  • অ্যাপ্লিকেশন ফু তৈরি করে
  • অ্যাপ্লিকেশন কল Foo
    • ফু এর বার দরকার (যেমন একটি পরিষেবা), সুতরাং:
    • ফু তৈরি করে বার
    • ফু ফোন বার
      • বারের জন্য বিমের প্রয়োজন (একটি পরিষেবা, একটি ভান্ডার,…), ​​সুতরাং:
      • বার বিম তৈরি করে
      • বার কিছু করে

নির্ভরতা ইনজেকশন ব্যবহার করে

এখানে ডিআই ব্যবহার করে কোনও কোড মোটামুটি কাজ করবে:

  • অ্যাপ্লিকেশনটির জন্য ফু প্রয়োজন, যার বার প্রয়োজন, যার বিম প্রয়োজন, তাই:
  • অ্যাপ্লিকেশন বিম তৈরি করে
  • অ্যাপ্লিকেশন বার তৈরি করে এবং এটি বিম দেয়
  • অ্যাপ্লিকেশন ফু তৈরি করে এবং এটি বার দেয়
  • অ্যাপ্লিকেশন কল Foo
    • ফু ফোন বার
      • বার কিছু করে

নির্ভরশীলতার নিয়ন্ত্রণটি একটিকে কল করা থেকে ডাকা হয়ে যাওয়া থেকে বিপরীত হয়।

এটি কোন সমস্যার সমাধান করে?

নির্ভরতা ইনজেকশনটি ইনজেকশন শ্রেণীর বিভিন্ন প্রয়োগের সাথে অদলবদলকে সহজ করে তোলে। ইউনিট টেস্টিংয়ের সময় আপনি একটি ডামি বাস্তবায়ন ইনজেক্ট করতে পারেন, যা পরীক্ষাটি আরও সহজ করে তোলে।

উদাহরণস্বরূপ: ধরুন আপনার অ্যাপ্লিকেশনটি ব্যবহারকারী আপলোড করা ফাইলটি 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);
    }
}

আপনি যখন ড্রপবক্স প্রয়োগের সাথে পরিবর্তন করতে চান তখন আপনাকে newGoogle লাইনড্রাইভ সার্ভিস অবজেক্ট নির্মিত সমস্ত রেখা প্রতিস্থাপন করতে হবে এবং ড্রপবক্স সার্ভিস ব্যবহার করতে হবে। সোমারকন্ট্রোলার ক্লাস পরীক্ষা করার সময় কনস্ট্রাক্টর সর্বদা গুগলড্রাইভ সার্ভিস ক্লাস এবং এই শ্রেণীর আসল পদ্ধতিগুলি ট্রিগার হওয়ার প্রত্যাশা করে।

এটি কখন উপযুক্ত এবং কখন নয়? আমার মতে আপনি ডিআই ব্যবহার করবেন যখন আপনি ভাবেন যে কোনও শ্রেণীর বিকল্প বাস্তবায়ন আছে (বা সেখানে থাকতে পারে)।


এটি সবচেয়ে সঠিক উত্তর হওয়া উচিত কারণ কেবলমাত্র "নিয়ন্ত্রণ" কীভাবে বিপরীত হয় তা ব্যাখ্যা করা হয়।
ইয়ারিমাদম

এখন পর্যন্ত সেরা ব্যাখ্যা
Ali80

12

খুব সহজ লিখিত ব্যাখ্যা এখানে পাওয়া যাবে

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

এটা বলে -

"যে কোনও অনানুষ্ঠানিক অ্যাপ্লিকেশন দুটি বা ততোধিক শ্রেণীর সমন্বয়ে গঠিত হয় যা একে অপরের সাথে কিছু ব্যবসায়িক যুক্তি সম্পাদনের জন্য সহযোগিতা করে। কিছু বাহ্যিক সত্তা তৈরির সময় অবজেক্টগুলিকে তাদের নির্ভরতা দেয় যা সিস্টেমে প্রতিটি বস্তুকে সমন্বয় করে other অন্য কথায়, নির্ভরতাগুলি বস্তুগুলিতে ইনজেকশনের ব্যবস্থা করা হয়। "


12

নিয়ন্ত্রণের বিপরীতকরণ একটি জেনেরিক নীতি, অন্যদিকে নির্ভরতা ইনজেকশন এই নীতিটি অবজেক্ট গ্রাফ নির্মাণের জন্য নকশার প্যাটার্ন হিসাবে উপলব্ধি করে (যেমন কনফিগারেশন নিয়ন্ত্রণ করে যে কীভাবে বস্তুগুলি একে অপরের সাথে রেফারেন্স করছে, তার পরিবর্তে অবজেক্টটি অন্য কোনও বস্তুর রেফারেন্স কীভাবে পাবেন তা নিয়ন্ত্রণ করে)।

ইনভার্সন অফ কন্ট্রোলকে ডিজাইনের নিদর্শন হিসাবে দেখে আমাদের কী উল্টানো হচ্ছে তা আমাদের দেখতে হবে। নির্ভরতা ইনজেকশন বস্তুর গ্রাফ তৈরির নিয়ন্ত্রণকে উল্টে দেয়। যদি সাধারণ ব্যক্তির মেয়াদে বলা হয়, নিয়ন্ত্রণের বিপরীতকরণ প্রোগ্রামে নিয়ন্ত্রণের প্রবাহের পরিবর্তনকে বোঝায়। যেমন। Traditionalতিহ্যগত স্বতন্ত্র অ্যাপ্লিকেশনটিতে, আমাদের মূল পদ্ধতি রয়েছে, সেখান থেকে নিয়ন্ত্রণটি অন্যান্য তৃতীয় পক্ষের লাইব্রেরিতে স্থানান্তরিত হয় (যদি আমরা তৃতীয় পক্ষের লাইব্রেরির ফাংশন ব্যবহার করি) তবে নিয়ন্ত্রণের বিপরীতকরণের মাধ্যমে তৃতীয় পক্ষের লাইব্রেরি কোড থেকে আমাদের কোডে স্থানান্তরিত হয় , যেমন আমরা তৃতীয় পক্ষের গ্রন্থাগারের পরিষেবা নিচ্ছি। তবে এমন অন্যান্য দিক রয়েছে যা একটি প্রোগ্রামের মধ্যে উল্টানো দরকার - উদাহরণস্বরূপ কোডটি সম্পাদন করার জন্য পদ্ধতি এবং থ্রেডের অনুরোধ।

ইনভারসন অফ কন্ট্রোল সম্পর্কে আরও গভীরতার প্রতি আগ্রহীদের জন্য একটি কাগজ প্রকাশিত হয়েছে ডিজাইনের প্যাটার্ন হিসাবে ইনভারসন অফ কন্ট্রোলের আরও সম্পূর্ণ চিত্রের রূপরেখা প্রকাশ করে (অফিসফ্লোর: সফটওয়্যার ডিজাইনের উন্নতির জন্য অফিসের নিদর্শনগুলি ব্যবহার করে http://doi.acm.org/10.1145/ 2739011.2739013 একটি বিনামূল্যে সঙ্গে থেকে ডাউনলোড করতে পাওয়া কপি http://www.officefloor.net/about.html )।

যা চিহ্নিত তা হ'ল নিম্নলিখিত সম্পর্ক:

নিয়ন্ত্রণের বিপরীকরণ (পদ্ধতিগুলির জন্য) = নির্ভরতা (রাজ্য) ইনজেকশন + ধারাবাহিকতা ইনজেকশন + থ্রেড ইনজেকশন

বিপরীত নিয়ন্ত্রণের জন্য উপরের সম্পর্কের সংক্ষিপ্তসার উপলব্ধ - http://dzone.com/articles/inversion-of-coupling-control


এটি একটি খুব স্পষ্ট উত্তর। ব্যাখ্যার জন্য ধন্যবাদ.
কুনইউ সোই

11

আইওসি আপনার কোড এবং তৃতীয় পক্ষের কোডের (লাইব্রেরি / ফ্রেমওয়ার্ক) মধ্যে সম্পর্ক উল্টানোর বিষয়ে:

  • সাধারণ s / w বিকাশে আপনি মূল () পদ্ধতিটি লিখেন এবং "লাইব্রেরি" পদ্ধতিগুলি কল করেন। আপনি নিয়ন্ত্রণে আছেন :)
  • আইওসিতে "ফ্রেমওয়ার্ক" প্রধান () নিয়ন্ত্রণ করে এবং আপনার পদ্ধতিগুলি কল করে। ফ্রেমওয়ার্ক নিয়ন্ত্রণ করা হয় :(

ডিআই (নির্ভরতা ইনজেকশন) অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণ কীভাবে প্রবাহিত হয় সে সম্পর্কে। Applicationতিহ্যবাহী ডেস্কটপ অ্যাপ্লিকেশনটিতে আপনার অ্যাপ্লিকেশন (মূল () পদ্ধতি) থেকে অন্যান্য গ্রন্থাগার পদ্ধতি কলগুলিতে নিয়ন্ত্রণ প্রবাহ ছিল, কিন্তু ডিআই নিয়ন্ত্রণ প্রবাহের সাথে উল্টে যায় যে ফ্রেমওয়ার্কটি আপনার অ্যাপ্লিকেশনটি শুরু করার, এটি আরম্ভ করার এবং যখনই প্রয়োজন হবে তখন আপনার পদ্ধতিগুলি আহ্বানের যত্ন নেয়।

শেষ পর্যন্ত আপনি সর্বদা জয় :)


10

আমি এই ব্যাখ্যাটি পছন্দ করি: http://joelabrahamsson.com/inversion-of-control-an-intr پيداوار-with-exferences-in-net/

এটি সহজ শুরু হয় এবং কোড উদাহরণগুলিও দেখায়।

এখানে চিত্র বর্ণনা লিখুন

গ্রাহক, এক্স, কিছু অর্জনের জন্য গ্রাহক, গ্রাহক শ্রেণীর প্রয়োজন। এগুলি সবই ভাল এবং প্রাকৃতিক, তবে এক্সের কি সত্যই এটি জানতে হবে যে এটি ওয়াই ব্যবহার করে?

কে যথেষ্ট জানেন না যে এটি ওয়াইয়ের আচরণ, পদ্ধতি, বৈশিষ্ট্যাদি ইত্যাদির সাথে ব্যবহার করে যা বাস্তবে কে বাস্তবায়ন করে তা না জেনে এটি ব্যবহার করে?

ওয়াইয়ের ক্ষেত্রে এক্স দ্বারা ব্যবহৃত আচরণের একটি বিমূর্ত সংজ্ঞাটি বের করে, আমি নীচে চিত্রিত করেছি, এবং ভোক্তার এক্স এর পরিবর্তে ওয়াইয়ের পরিবর্তে এর উদাহরণ ব্যবহার করতে পারি, এটি ওয়াই সম্পর্কে সুনির্দিষ্ট কিছু জানতে না পেরে যা করে তা চালিয়ে যেতে পারে

এখানে চিত্র বর্ণনা লিখুন

উপরের চিত্রে Y প্রয়োগ করে I এবং X I এর একটি উদাহরণ ব্যবহার করে While যদিও এটি যথেষ্ট সম্ভাবনা রয়েছে যে এক্স এখনও Y ব্যবহার করে যা আকর্ষণীয় তা X তা জানেন না। এটি কেবল জানে যে এটি এমন কিছু ব্যবহার করে যা I প্রয়োগ করে।

আরও তথ্য এবং সুবিধাগুলির বিবরণের জন্য নিবন্ধ পড়ুন যেমন:

  • এক্স আর ওয়াইয়ের উপর নির্ভরশীল নয়
  • আরও নমনীয়, বাস্তবায়ন রানটাইম স্থির করা যেতে পারে
  • কোড ইউনিটের বিচ্ছিন্নতা, সহজ পরীক্ষা

...


লিঙ্কটি খুব সহায়ক। সত্যিই ধন্যবাদ :)
এম ফুয়াত নুরোলা জুলু

10

আমি বুঝতে পারি যে উত্তরটি ইতিমধ্যে এখানে দেওয়া হয়েছে। তবে আমি এখনও মনে করি, নিয়ন্ত্রণের বিপর্যয় সম্পর্কে কিছু প্রাথমিক বিষয়গুলি ভবিষ্যতের পাঠকদের জন্য এখানে দীর্ঘ আলোচনা করা উচিত।

ইনভার্সন অফ কন্ট্রোল (আইওসি) হলিউড প্রিন্সিপাল নামে একটি খুব সাধারণ নীতিতে নির্মিত হয়েছে । এবং এটি বলে যে,

আমাদের ফোন করবেন না, আমরা আপনাকে কল করব

এর অর্থ হ'ল হলিউডে স্বপ্ন পূরণ করতে যাবেন না বরং আপনি যদি যোগ্য হন তবে হলিউড আপনাকে খুঁজে পাবে এবং আপনার স্বপ্নকে সত্য করে তুলবে। বেশ উল্টে গেছে, তাই না?

এখন যখন আমরা আইওসির নীতি সম্পর্কে আলোচনা করি, আমরা হলিউডের কথা ভুলে যেতে ব্যবহার করি। আইওসির জন্য তিনটি উপাদান থাকতে হবে, হলিউড, আপনি এবং আপনার স্বপ্ন পূরণের মতো একটি কাজ।

আমাদের প্রোগ্রামিং জগতে, হলিউড একটি জেনেরিক কাঠামোর প্রতিনিধিত্ব করে (আপনি বা অন্য কেউ লিখেছিলেন ), আপনি আপনার লিখেছেন এমন ইউজার কোড এবং টাস্কটি আপনার কোডটি সম্পাদন করতে চান তার প্রতিনিধিত্ব করে। এখন আপনি কখনও নিজের দ্বারা নিজের কাজটি ট্রিগার করতে যাবেন না, আইওসিতে নয়! বরং আপনি এমন সব কিছু ডিজাইন করেছেন যাতে আপনার কাঠামোটি আপনার জন্য আপনার কার্যকে ট্রিগার করে। সুতরাং আপনি একটি পুনর্ব্যবহারযোগ্য কাঠামো তৈরি করেছেন যা কাউকে নায়ক বা অন্য একজনকে খলনায়ক করে তুলতে পারে। তবে সেই কাঠামোটি সর্বদা দায়িত্বে থাকে, কখন কাউকে বাছাই করা এবং এটি কী হতে চায় তা কেবল কেউই জানেন knows

একটি বাস্তব জীবনের উদাহরণ এখানে দেওয়া হবে। মনে করুন, আপনি একটি ওয়েব অ্যাপ্লিকেশন বিকাশ করতে চান। সুতরাং, আপনি একটি ফ্রেমওয়ার্ক তৈরি করেন যা ওয়েব অ্যাপ্লিকেশনটির হ'ল HTTP অনুরোধ পরিচালনা করা, অ্যাপ্লিকেশন মেনু তৈরি করা, পৃষ্ঠাগুলি পরিবেশন করা, কুকিজ পরিচালনা করা, ইভেন্টগুলি ট্রিগার করা ইত্যাদি সমস্ত সাধারণ জিনিস পরিচালনা করে handle

এবং তারপরে আপনি আপনার ফ্রেমওয়ার্কে কিছু হুক রেখে যান যেখানে আপনি কাস্টম মেনু, পৃষ্ঠা, কুকিজ তৈরি করতে বা কোনও ব্যবহারকারীর ইভেন্ট লগ করার জন্য আরও কোড রাখতে পারেন etc. ব্রাউজারে।

সুতরাং, ধারণাটি বেশ সহজ। কোনও ব্যবহারকারী অ্যাপ্লিকেশন তৈরি করার পরিবর্তে যা সমস্ত কিছু নিয়ন্ত্রণ করে, প্রথমে আপনি একটি পুনঃব্যবহারযোগ্য কাঠামো তৈরি করেন যা সবকিছু নিয়ন্ত্রণ করে তারপরে আপনার কাস্টম কোডগুলি লিখবে এবং সময় মতো কার্যকর করতে ফ্রেমওয়ার্কটিতে এটি সংযুক্ত করবে।

লারাভেল এবং ইজেবি এই জাতীয় ফ্রেমওয়ার্কের উদাহরণ।

রেফারেন্স:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control


1
আমি এখানে সবচেয়ে উপযুক্ত উত্তর খুঁজে পেয়েছি।
নীলরে

8

প্রোগ্রামিং স্পিচ

আইওসি সহজ শর্তে: এটি কোনও শ্রেণীর দ্বারা ব্যবহার করা যেতে পারে এমন কোনও ওয়াইল্ডকার্ড হিসাবে নির্দিষ্ট কিছু (যেমন ক্ষেত্র বা একটি পরামিতি) এর উপায় হিসাবে ইন্টারফেসের ব্যবহার। এটি কোডটির পুনরায় ব্যবহারের সুযোগ দেয়।

উদাহরণস্বরূপ, ধরা যাক যে আমাদের দুটি শ্রেণি রয়েছে: কুকুর এবং বিড়াল । উভয়ই একই গুণাবলী / রাজ্যগুলি ভাগ করে: বয়স, আকার, ওজন। সুতরাং কুকুর সার্ভিস এবং ক্যাটস সার্ভিস নামে একটি শ্রেণীর পরিষেবা তৈরির পরিবর্তে , আমি এনিমাল সার্ভিস নামে একটি একক তৈরি করতে পারি যা ডগ এবং ক্যাটকে কেবলমাত্র ইন্টারফেস আইআনিমাল ব্যবহার করলে তারা ব্যবহার করতে দেয়

তবে, ব্যবহারিকভাবে বলতে গেলে এর কিছুটা পিছনে রয়েছে।

ক) বেশিরভাগ বিকাশকারী এটি কীভাবে ব্যবহার করবেন তা জানেন না । উদাহরণস্বরূপ, আমি গ্রাহক নামে একটি শ্রেণি তৈরি করতে পারি এবং আমি স্বয়ংক্রিয়ভাবে (আইডিই এর সরঞ্জামগুলি ব্যবহার করে) আইসিস্টোমার নামের একটি ইন্টারফেস তৈরি করতে পারি । সুতরাং, ক্লাস এবং ইন্টারফেসে ভরা ফোল্ডারটি সন্ধান করা বিরল নয়, ইন্টারফেসগুলি পুনরায় ব্যবহার করা হবে কিনা তা বিবেচনা করা উচিত। একে ব্লাটেড বলা হয়। কিছু লোক তর্ক করতে পারে যে "ভবিষ্যতে হয়তো আমরা এটি ব্যবহার করতে পারি"। : - |

খ) এর কিছু সীমাবদ্ধতা রয়েছে। উদাহরণস্বরূপ, আসুন কুকুর এবং বিড়ালের ক্ষেত্রে কথা বলি এবং আমি কেবল কুকুরের জন্য একটি নতুন পরিষেবা (কার্যকারিতা) যুক্ত করতে চাই। ধরা যাক যে আমি কুকুরকে প্রশিক্ষণের জন্য যে দিনগুলি প্রয়োজন তা গণনা করতে চাই ( trainDays()), বিড়ালের পক্ষে এটি অকেজো, বিড়ালদের প্রশিক্ষণ দেওয়া যায় না (আমি মজা করছি)।

খ .১) আমি যদি trainDays()পরিষেবা অ্যানিমাল সার্ভিসে যুক্ত করি তবে এটি বিড়ালদের সাথেও কাজ করে এবং এটি মোটেও বৈধ নয়।

খ .২) আমি কোন শর্ত যুক্ত করতে পারি trainDays()যেখানে এটি কোন শ্রেণিটি ব্যবহৃত হয় তা মূল্যায়ন করে। তবে এটি পুরোপুরি আইওসি ভেঙে যাবে।

খ .৩) আমি নতুন কার্যকারিতার জন্য ডগস সার্ভিস নামে একটি নতুন শ্রেণীর পরিষেবা তৈরি করতে পারি । তবে, এটি কোডটির রক্ষণাবেক্ষণযোগ্যতা বাড়িয়ে তুলবে কারণ কুকুরের জন্য আমাদের দুটি শ্রেণির পরিষেবা থাকবে (অনুরূপ কার্যকারিতা সহ) এবং এটি খারাপ।


পুষ্পিত ক্লাস / ইন্টারফেস সম্পর্কে: আপনাকে সর্বদা প্রতিটি একক ইন্টারফেসটি পুনরায় ব্যবহার করতে হবে না। কখনও কখনও এটি কেবলমাত্র কার্যকরী সীমানা দেখার জন্য একটি বৃহত ইন্টারফেসটিকে অনেকগুলি ছোট করে বিভক্ত করে তোলে। অন্যান্য বাস্তবায়নগুলিতে ছোট ইন্টারফেসগুলি পুনরায় ব্যবহার করা সহজ। এছাড়াও এটি আপনাকে ইন্টারফেসে কোড করার জন্য উত্সাহ দেয় যেখানে এটি বোধগম্য হয়। "ইন্টারফেস বিভাজন" বিবেচনা করুন। আপনি কেবল ইন্টারফেস ব্যবহার করছেন বলেই আপনি ডিউলড হয়ে গেছেন না। একটি একক ফ্যাট ইন্টারফেস অকেজো। - মাত্র আমার 2 সেন্ট :)
এমকে

7

আমি এর জন্য অনেক উত্তর পড়েছি তবে যদি কেউ এখনও বিভ্রান্ত থাকে এবং আইওসির ব্যাখ্যা দেওয়ার জন্য যদি একটি অতিরিক্ত আল্ট্রা "লেটম্যানস টার্ম" প্রয়োজন হয় তবে তা আমার গ্রহণযোগ্যতা:

কল্পনা করুন কোনও পিতা-মাতা এবং শিশু একে অপরের সাথে কথা বলছেন।

আইওসি ছাড়াই:

* পিতামাতা : আমি যখন আপনাকে প্রশ্ন করি তখন আপনি কেবল তখনই কথা বলতে পারবেন এবং আমি আপনাকে অনুমতি দিলে আপনি কেবল তখনই কাজ করতে পারবেন।

পিতা বা মাতা : এর অর্থ, আপনি আমাকে জিজ্ঞাসা করতে পারবেন না আপনি খেতে, খেলতে, বাথরুমে যেতে বা এমনকি আমি জিজ্ঞাসা না করে ঘুমাতে পার কিনা।

পিতামাতা : আপনি কি খেতে চান?

শিশু : না।

পিতা বা মাতা : ঠিক আছে, আমি ফিরে আসব। আমার জন্য অপেক্ষা করো.

শিশু : (খেলতে চায় তবে যেহেতু পিতামাতার কোনও প্রশ্ন নেই, তাই শিশু কিছুই করতে পারে না)।

1 ঘণ্টা পরে...

পিতা মাতা : আমি ফিরে এসেছি। তুমি কি খেলতে চাও?

শিশু : হ্যাঁ

পিতামাতা : অনুমতি মঞ্জুর।

শিশু : (অবশেষে খেলতে সক্ষম)

এই সাধারণ পরিস্থিতিটি ব্যাখ্যা করে যে নিয়ন্ত্রণটি পিতামাতার কেন্দ্রিক। সন্তানের স্বাধীনতা সীমাবদ্ধ এবং পিতামাতার প্রশ্নের উপর নির্ভর করে। শিশু যখন কথা বলার জন্য বলা হয় কেবল তখনই কথা বলতে পারে এবং অনুমতি পেলে কেবল কাজ করতে পারে ।

আইওসি সহ:

সন্তানের এখন প্রশ্ন জিজ্ঞাসা করার ক্ষমতা রয়েছে এবং পিতামাতার উত্তর এবং অনুমতি সহ প্রতিক্রিয়া জানাতে পারেন। সহজভাবে নিয়ন্ত্রণটি উল্টে গেছে! শিশু এখন যে কোনও সময় প্রশ্ন জিজ্ঞাসা করতে পারে এবং অনুমতি সম্পর্কে পিতামাতার সাথে এখনও নির্ভরতা থাকা সত্ত্বেও, সে প্রশ্ন করা / জিজ্ঞাসা করার পদ্ধতিতে নির্ভর করে না।

প্রযুক্তিগত উপায়ে ব্যাখ্যা করার ক্ষেত্রে এটি কনসোল / শেল / সেন্টিমিড বনাম জিইউআই মিথস্ক্রিয়াটির সাথে খুব মিল। (কোন নম্বর টপ উত্তরের উপরে মার্ক হ্যারিসনের উত্তর)। কনসোলে, আপনি যা জিজ্ঞাসা / প্রদর্শিত হচ্ছে তার উপর নির্ভরশীল এবং আপনি প্রথমে এর প্রশ্নের উত্তর না দিয়ে অন্যান্য মেনু এবং বৈশিষ্ট্যে ঝাঁপিয়ে উঠতে পারবেন না; একটি কঠোর অনুক্রমিক প্রবাহ অনুসরণ। (প্রোগ্রামগতভাবে এটি কোনও পদ্ধতি / ফাংশন লুপের মতো)। তবে জিইউআইয়ের সাথে মেনুগুলি এবং বৈশিষ্ট্যগুলি নির্ধারণ করা হয়েছে এবং ব্যবহারকারীরা যা কিছু প্রয়োজন তাই এটি নির্বাচন করতে পারেন যাতে আরও নিয়ন্ত্রণ এবং কম সীমাবদ্ধ থাকে। (প্রোগ্রামগতভাবে, মেনুগুলির নির্বাচিত হওয়ার পরে কলব্যাক থাকে এবং কোনও ক্রিয়া ঘটে)।


6

নিয়ন্ত্রণের বিপরীতমুখীকরণ ক্লায়েন্টের কাছ থেকে গ্রন্থাগার থেকে নিয়ন্ত্রণ স্থানান্তর সম্পর্কে। যখন আমরা এমন ক্লায়েন্টের কথা বলি যা একটি ফাংশনের মান (ল্যাম্বডা এক্সপ্রেশন )টিকে একটি উচ্চতর ক্রম (লাইব্রেরি ফাংশন) ইনজেক্ট করে যা গ্রন্থাগারের ফাংশনের আচরণকে নিয়ন্ত্রণ করে (পরিবর্তন করে)। গ্রাহক বা ফ্রেমওয়ার্ক যা লাইব্রেরিতে লাইব্রেরি নির্ভরতা (যা আচরণ বহন করে) ইনজেকশন দেয় তাকেও আইওসি হিসাবে বিবেচনা করা যেতে পারে


5

যেহেতু ইতিমধ্যে প্রশ্নের জন্য অনেক উত্তর রয়েছে তবে এগুলির কোনওটিই ইনভার্সন কন্ট্রোল শব্দটির ভাঙ্গন দেখায় না আমি আরও সংক্ষিপ্ত এবং দরকারী উত্তর দেওয়ার সুযোগ দেখছি।

বিপরীতমুখী নিয়ন্ত্রণ একটি প্যাটার্ন যা নির্ভরতা বিপরীতমুখী নীতি (ডিআইপি) প্রয়োগ করে। ডিআইপি নিম্নলিখিতটি জানিয়েছে: 1. উচ্চ-স্তরের মডিউলগুলি নিম্ন-স্তরের মডিউলগুলির উপর নির্ভর করবে না। উভয়ের বিমূর্ততা (যেমন ইন্টারফেস) উপর নির্ভর করা উচিত। ২. বিমূর্ততা বিশদগুলির উপর নির্ভর করবে না। বিশদ (কংক্রিট বাস্তবায়ন) বিমূর্তনের উপর নির্ভর করে।

নিয়ন্ত্রণের তিনটি ধরণের বিপরীত রয়েছে:

ইন্টারফেস বিপরীত সরবরাহকারীদের একটি ইন্টারফেস সংজ্ঞায়িত করা উচিত নয়। পরিবর্তে, ভোক্তার ইন্টারফেসটি সংজ্ঞায়িত করা উচিত এবং সরবরাহকারীরা এটি প্রয়োগ করতে হবে। ইন্টারফেস বিপর্যয় প্রতিটি সময় যখন নতুন সরবরাহকারী যুক্ত হয় তখন গ্রাহককে সংশোধন করার প্রয়োজনীয়তা অপসারণ করতে দেয়।

ফ্লো বিপর্যয় প্রবাহের নিয়ন্ত্রণ পরিবর্তন করে। উদাহরণস্বরূপ, আপনার কাছে একটি কনসোল অ্যাপ্লিকেশন রয়েছে যেখানে আপনি অনেকগুলি পরামিতি প্রবেশ করতে বলেছেন এবং প্রতিটি প্রবেশ করা প্যারামিটারের পরে আপনাকে এন্টার টিপতে বাধ্য করা হয়। আপনি এখানে ফ্লো ইনভার্জন প্রয়োগ করতে পারেন এবং একটি ডেস্কটপ অ্যাপ্লিকেশন প্রয়োগ করতে পারেন যেখানে ব্যবহারকারী পরামিতিগুলির প্রবেশের ক্রমটি চয়ন করতে পারে, ব্যবহারকারী পরামিতিগুলি সম্পাদনা করতে পারে এবং চূড়ান্ত ধাপে ব্যবহারকারীর কেবল একবার এন্টার টিপতে হবে।

উত্স বিবর্তন এটি নিম্নলিখিত নিদর্শন দ্বারা প্রয়োগ করা যেতে পারে: কারখানার প্যাটার্ন, পরিষেবা লোকেটার এবং নির্ভরতা ইনজেকশন। ক্রিয়া ইনভার্সন নির্ভরতা অবজেক্টগুলির প্রক্রিয়াকে এই ধরনের নির্ভরতা অবজেক্টগুলি ব্যবহার করে এমন প্রকারের বাইরে চলমান প্রকারের মধ্যে নির্ভরতা দূর করতে সহায়তা করে। নির্ভরতা খারাপ কেন? এখানে বেশ কয়েকটি উদাহরণ রয়েছে: আপনার কোডে একটি নতুন অবজেক্টের সরাসরি তৈরি পরীক্ষা আরও শক্ত করে তোলে; পুনঃসংশোধন ছাড়াই সমাবেশগুলিতে রেফারেন্স পরিবর্তন করা অসম্ভব (ওসিপি নীতি লঙ্ঘন); আপনি কোনও ওয়েব-ইউআই দ্বারা সহজে কোনও ডেস্কটপ-ইউআই প্রতিস্থাপন করতে পারবেন না।


3
  1. সুতরাং উপরে 1 নম্বর । বিপরীতমুখী নিয়ন্ত্রণ কী?

  2. রক্ষণাবেক্ষণ হ'ল এটি আমার পক্ষে এক নম্বর জিনিস সমাধান করে। এটি গ্যারান্টি দেয় যে আমি ইন্টারফেসগুলি ব্যবহার করছি যাতে দুটি ক্লাস একে অপরের সাথে অন্তরঙ্গ না হয়।

ক্যাসেল উইন্ডসর এর মতো ধারক ব্যবহার করার ক্ষেত্রে এটি রক্ষণাবেক্ষণের সমস্যাগুলি আরও ভাল সমাধান করে। কোডের একটি লাইন পরিবর্তন না করে ফাইল ভিত্তিক অধ্যবসায় ব্যবহার করে এমন একটি অংশের জন্য একটি ডাটাবেসে যে অংশটি সরিয়ে ফেলতে সক্ষম হবেন তা দুর্দান্ত (কনফিগারেশন পরিবর্তন, আপনি সম্পন্ন করেছেন) is

এবং একবার আপনি জেনেরিকাগুলিতে উঠলে এটি আরও ভাল হয়ে যায়। রেকর্ডগুলি গ্রহণ করে এবং বার্তা প্রকাশ করে এমন কোনও বার্তা প্রকাশক থাকার কথা ভাবুন। এটি কী প্রকাশ করে তা বিবেচ্য নয়, তবে রেকর্ড থেকে কোনও বার্তায় কিছু নেওয়ার জন্য ম্যাপারের প্রয়োজন।

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

আমি এটি একবার লিখেছি, তবে এখন আমি কোডের এই সেটটিতে অনেক ধরণের ইনজেকশন দিতে পারি যদি আমি বিভিন্ন ধরণের বার্তা প্রকাশ করি। আমি ম্যাপারগুলিও লিখতে পারি যা একই ধরণের রেকর্ড নেয় এবং এগুলি বিভিন্ন বার্তায় ম্যাপ করে। জেনারিকসের সাথে ডিআই ব্যবহার করে আমাকে অনেক কাজ সম্পাদনের জন্য খুব কম কোড লেখার ক্ষমতা দিয়েছে।

ওঁ হ্যাঁ, পরীক্ষার যোগ্যতা সম্পর্কিত উদ্বেগ রয়েছে তবে তারা আইওসি / ডিআই-র সুবিধার ক্ষেত্রে গৌণ।

আমি অবশ্যই আইওসি / ডিআইকে ভালবাসি।

ঘ। আপনার কিছুটা জটিলতার মাঝারি আকারের প্রকল্পের মিনিটে এটি আরও উপযুক্ত হয়ে ওঠে। আমি বলব আপনি যে মুহুর্তে ব্যথা অনুভব শুরু করবেন এটি উপযুক্ত হয়ে যায়।



3

ক্লাসের মধ্যে একটি অবজেক্ট তৈরি করাকে টাইট কাপলিং বলা হয়, স্প্রিং ডিজাইনের ধরণ (ডিআই / আইওসি) অনুসরণ করে এই নির্ভরতা সরিয়ে দেয়। কোন শ্রেণীতে ক্লাস তৈরির চেয়ে কনস্ট্রাক্টরে পাস করা বস্তু। আরও বেশি সাধারণ কাঠামো সংজ্ঞায়িত করার জন্য আমরা কনস্ট্রাক্টরে সুপার ক্লাসের রেফারেন্স ভেরিয়েবল দিই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.