ইনভার্সন অফ কন্ট্রোলটিকে কেন এভাবে নামকরণ করা হয়েছে?


98

শব্দ invertবা controlএ সব ব্যবহার করা হয় না সংজ্ঞা যে আমি দেখা করেছি নিয়ন্ত্রণ ইনভার্সান সংজ্ঞায়িত করতে।

সংজ্ঞা

উইকিপিডিয়া

ইনভার্শন অফ কন্ট্রোল (আইওসি) হ'ল একটি প্রোগ্রামিং কৌশল, যা এখানে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের ক্ষেত্রে প্রকাশ করা হয়, যেখানে অবজেক্ট কাপলিং কোনও এসেম্বারার অবজেক্ট দ্বারা রান সময়ে আবদ্ধ হয় এবং স্থির বিশ্লেষণ ব্যবহার করে সংকলন সময়ে সাধারণত পরিচিত হয় না। ~ http://en.wikedia.org/wiki/Inversion_of_control

মার্টিন ফাউলার

জাভা সম্প্রদায়ের নিয়ন্ত্রণ বিপরীতকরণ একটি সাধারণ প্যাটার্ন যা তারের হালকা ওজনের পাত্রে বা বিভিন্ন প্রকল্প থেকে উপাদানগুলিকে একত্রিত অ্যাপ্লিকেশন হিসাবে একত্রিত করতে সহায়তা করে। ~ উপর ভিত্তি করে http://www.martinfowler.com/articles/injection.html (reworded)


তাহলে কেন ইনভার্সন অফ কন্ট্রোলকে ইনভার্শন অফ কন্ট্রোল নামকরণ করা হয়েছে? কি নিয়ন্ত্রণ উল্টানো হচ্ছে এবং কি দ্বারা? পরিভাষাটি ব্যবহার করে বিপর্যয় নিয়ন্ত্রণের সংজ্ঞা দেওয়ার কোনও উপায় আছে: বিপরীতকরণ এবং নিয়ন্ত্রণ ?


22
যে ব্যক্তি এটি সহজ ইংরেজীতে
রবার্ট হার্ভে

2
যদি কোনও সংজ্ঞা শব্দটি এটি সংজ্ঞায়িত করে ব্যবহার করে, তবে এটি অভিধানের ব্যর্থতা হবে। অনুরূপ যুক্তি এখানে প্রয়োগ হয়।
ইজকাটা

2
স্ট্যাকওভারফ্লোতেও দেখুন: নিয়ন্ত্রণের
ইজকাটা

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

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

উত্তর:


67

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

ভান্ডারটি নিজে থেকেই ডেটা উত্সের সাথে একটি সংযোগ স্থাপন করতে পারে। কিন্তু যদি এটি আপনাকে সংগ্রহস্থলের কনস্ট্রাক্টরের মাধ্যমে ডেটা উত্সের সাথে সংযোগের অনুমতি দেয়?

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

আপনি সংগ্রহস্থল শ্রেণি থেকে কলারের হাতে সংযোগ তৈরির দায়িত্ব হস্তান্তর করে নিয়ন্ত্রণটি উল্টিয়ে দিয়েছেন।

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


3
এটি নির্ভরতা ইনজেকশনটির একটি উদাহরণ, তবে নির্ভরতা ইনজেকশনটি নিয়ন্ত্রণের বিপরীতমুখীকরণের একটি উপসেট মাত্র। নির্ভরতা ইনজেকশনের সাথে পুরোপুরি সম্পর্কিত নয় এমন অন্যান্য জিনিস রয়েছে যা নিয়ন্ত্রণের বিপরীত আচরণের অনুশীলন করে।
dsw88

1
@ mustang2009cobra: ধন্যবাদ। একটি উদাহরণ হ'ল আমি কী পরে ছিলাম, যেখানে এটি ঘটে তার উদাহরণগুলির একটি বিস্তৃত ক্যাটালগ নয় এবং "নিয়ন্ত্রণের বিপরীতমুখী" শব্দটি ডিআই এর সাথে সর্বাধিক ঘনিষ্ঠভাবে জড়িত, বার্তা পাসিং বা অন্যান্য অনুরূপ ধারণার সাথে নয়।
রবার্ট হার্ভে

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

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

79

আমি মনে করি না যে কেউ মার্টিন ফাউলারের চেয়ে এটি আরও ভালভাবে ব্যাখ্যা করতে পারে, আপনার নিবন্ধটি আরও যুক্ত করেছেন

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

তিনি উপরের অনুচ্ছেদে যেমন ব্যাখ্যা করেছেন, "নিয়ন্ত্রণের বিপরীতমুখীকরণ" শব্দটির উদ্ভবের কারণটি এটি একেবারেই এক নয়।

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

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

এজন্যই তিনি ইনভার্শন অফ কন্ট্রোলের এই নির্দিষ্ট প্রয়োগটি কভার করার জন্য "নির্ভরতা ইনজেকশন" শব্দটি মুদ্রা করতে চলেছেন।

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

কিছুটা স্পষ্ট করে বলতে: বিপরীতকরণের অর্থ এমন কোনও কিছু যা ক্লাসিক পদ্ধতিগত নকশা থেকে কোনও প্রোগ্রামের নিয়ন্ত্রণ কাঠামোকে উল্টে দেয়।

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

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

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

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


4
আমি সাধারণত এতটা ভোট দেই না তবে এটি দুর্দান্ত উত্তর। 1 টি ভোট যথেষ্ট হবে না। :(
আরজেডি 22

1
এই উত্তরটি সত্যই আইওসি এবং ডিআই বিভ্রান্তির সমস্ত প্রশ্নের উত্তর দেয়।
আলী উমাইর

32

এখানে "নিয়মিত" নিয়ন্ত্রণ প্রবাহ প্রোগ্রামগুলি সাধারণত অনুসরণ করা হয়:

  • ক্রমানুসারে কমান্ডগুলি চালান
  • আপনি প্রোগ্রামের নিয়ন্ত্রণ প্রবাহের উপর নিয়ন্ত্রণ বজায় রাখবেন

নিয়ন্ত্রণের বিপরীতটি "ইনভার্টস" যা প্রবাহকে নিয়ন্ত্রণ করে, এর অর্থ এটি এটিকে তার মাথায় সরিয়ে দেয়:

  • আপনার প্রোগ্রামটি আর প্রবাহকে নিয়ন্ত্রণ করে না। আপনি উপযুক্ত হিসাবে কমান্ড কল করার চেয়ে, আপনি অন্য কেউ কল করার জন্য অপেক্ষা করুন

যে শেষ লাইন গুরুত্বপূর্ণ এক। আপনার যখন মনে হয় তখন অন্য কাউকে ফোন করার পরিবর্তে, অন্য কেউ যখন তার মতো লাগে তখন আপনাকে ফোন করে।

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


19
[এখানে "সোভিয়েত" জোকস বাধ্যতামূলক
রবার্ট হার্ভে

2
একসাথে ঠাট্টা করা, আমার মনে হয় আপনি যা বর্ণনা করছেন তা হ'ল বার্তা প্রবাহের মতো, যা কয়েক দশক ধরে ওওর একটি প্রধান বিষয়।
রবার্ট হার্ভে

3
@ জিমিহোফা - এটি মোটেও ভুল নয় - এখানে দেখুন । নির্ভরতা তৈরির চেয়ে নিয়ন্ত্রণের বিপরীতকরণ একটি আরও সাধারণ ধারণা এবং নির্ভরতা ইনজেকশনটি আইওসি-র একমাত্র রূপ।
লি

7
@ জিমি হোফা: আমি একমত নই এটি আপনার উত্তর বা রবার্টের মতো ইনভারসন অফ কন্ট্রোলের যথাযথ সংজ্ঞা, যা ডিওপেন্ডেন্সি ইনজেকশন (যা আপনি উভয়ই আইওসি বলে যাচ্ছেন) বাক্যটি তৈরি করার সময় ফোলার বর্ণনা করেছেন ঠিক এমন বিভ্রান্তি।
পিডিআর

5
আমি @pdr- এর এই বক্তব্যের সাথে একমত: "নিয়ন্ত্রণের বিপরীতমুখীকরণ অর্থ এমন কোনও কিছু যা ক্লাসিক পদ্ধতিগত নকশা থেকে কোনও প্রোগ্রামের নিয়ন্ত্রণ কাঠামোকে উল্টে দেয়" " এটিই আমি বর্ণনা করছি এবং এটি নিয়ন্ত্রণের জেনেরিক বিপরীত। নির্ভরতা ইনজেকশন এক ধরণের আইওসি, তবে এটি কেবল একা নয় যে আইওসি অনুশীলন করে
dsw88

13

এটি নির্ভরতাগুলির তাত্ক্ষণিকতা নিয়ন্ত্রণ করে about

Ditionতিহ্যগতভাবে, যখন কোনও শ্রেণি / পদ্ধতিতে অন্য শ্রেণি (নির্ভরতা) ব্যবহার করা প্রয়োজন, তখন এটি সরাসরি শ্রেণি / পদ্ধতি দ্বারা তাত্ক্ষণিকভাবে চালিত হয়। এটি এর নির্ভরতা নিয়ন্ত্রণ করে।

ইনভার্সন অফ কন্ট্রোল (আইওসি) এর সাথে, কলার নির্ভরতার মধ্যে চলে যায়, সুতরাং এটি নির্ভরতা তত্ক্ষণিত করে। কলার নির্ভরতা নিয়ন্ত্রণ করে।

যেখানে নির্ভরতা তাত্ক্ষণিক হয় তার নিয়ন্ত্রণটি উল্টানো হয়েছে - "নীচে" এর পরিবর্তে, যেখানে কোডটি এটির প্রয়োজন হয়, এটি "শীর্ষে" ইনস্ট্যান্টিয়েটেড হয়, যেখানে কোডটির প্রয়োজন হয় তাকে বলা হচ্ছে।


1
সরল ইংরেজি নয় Not ব্যর্থ হয়েছে।
রবার্ট হার্ভে

2
@ রবার্টহার্ভে - কীভাবে সরল?
ওলেড

4
নিবন্ধন করুন এটা আমার কাছে মোটামুটি সরল মনে হচ্ছে ... কি সরল নয়? "ইনস্ট্যান্টেশন" বা "নির্ভরতা" শব্দটি?
জিমি হোফা

@ জিমিহোফা: আমার উত্তরটি দেখুন, যা একটি নির্দিষ্ট উদাহরণ সরবরাহ করে। আইওসি হ'ল এই সমস্যাযুক্ত পদগুলির মধ্যে একটি যা প্রত্যেকে ব্যবহার করে তবে কেউ ব্যাখ্যা করে না; লোকেরা প্রোগ্রামগুলিতে আইওসি পাত্রে ব্যবহার করে যা তাদের প্রয়োজন হয় না কারণ তারা ভুল বোঝে। এটি বলেছিল, আমি মনে করি এই উত্তরটিতে বেশ কয়েকটি নিনজা সম্পাদনা ছিল। :)
রবার্ট হার্ভে

এটি এবং উপরে পোস্ট করা @ ডিএসডব্লিউ 88 আমার পক্ষে বেশ সরল। দেখুন, আমি যদি আইওসি-র কথা কখনও না শুনে থাকি, তবে আমি স্বজ্ঞাতভাবে ভাবতাম "ওহ, যেখানে কোনও কিছু নিয়ন্ত্রণ করতে হবে সে একপাশ থেকে অন্যদিকে চলে আসে"। এই ভাল কাজ!
অলিভার উইলিয়ামস

2

সাধারণত উচ্চ স্তরের কোড কল (যেমন নিয়ন্ত্রণগুলি) নিম্ন স্তরের কোড। প্রধান () কল ফাংশন (), ফাংশন () কল করে গ্রন্থাগার ফাংশন ()।

এটি উল্টানো যায়, তাই নীচের স্তরের নিম্ন স্তরের গ্রন্থাগারটি উচ্চ স্তরের ফাংশনগুলিকে কল করে।

তুমি ওটা কেন করবে? মিডলওয়্যার। কখনও কখনও আপনি শীর্ষ স্তর এবং নীচের স্তরটি নিয়ন্ত্রণ করতে চান তবে মাঝখানে অনেক কাজ রয়েছে যা আপনি কেবল করতে চান না। C stdlib এ কুইকোর্টের বাস্তবায়ন নিন । আপনি শীর্ষ স্তরে কলকে কল করেন। আপনি qsort () আপনার নিজের ফাংশনটিতে একটি ফাংশন পয়েন্টার হ্যান্ড করে যা আপনার যা কিছু মনে হয় তার তুলনামূলক প্রয়োগ করে। যখন qsort () বলা হয়, এটি এই তুলনামূলক ফাংশনটিকে কল করে। qsort () আপনার উচ্চ স্তরের ফাংশনটি নিয়ন্ত্রণ / কলিং / ড্রাইভিং করছে।


1

এখানে একটি সাধারণ ওভারভিউ:

  1. নিয়ন্ত্রণ পরবর্তী প্রোগ্রামটি কি করে বোঝায়
  2. শীর্ষ স্তরে, দুটি নিয়ন্ত্রণ রয়েছে যা সাধারণত নিয়ন্ত্রণ করে: অ্যাপ্লিকেশনটি নিজেই এবং ব্যবহারকারী

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

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

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


0

আসুন দুটি উদাহরণের মাধ্যমে এটি বোঝার চেষ্টা করি।

উদাহরণ 1

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

উদাহরণ 2

CustomerProcessorনীচের শ্রেণি বিবেচনা করুন :

class CustomerProcessor
{
    SqlCustRepo custRepo = new SqlCustRepo(); 
    private void processCustomers()
    {
            Customers[] custs = custRepo.getAllCusts();
    }
}

যদি আমি যে processCustomer()কোনও প্রয়োগের থেকে স্বতন্ত্র হতে চাই getAllCusts(), তবে কেবল তার দ্বারা সরবরাহিত নয় SqlCustRepo, আমাকে লাইন থেকে মুক্তি দিতে হবে: SqlCustRepo custRepo = new SqlCustRepo()এবং এটিকে আরও সাধারণ কিছু দিয়ে প্রতিস্থাপন করতে হবে, যা বিভিন্ন ধরণের বাস্তবায়নের স্বীকৃতি দিতে সক্ষম, যেমন processCustomers()সহজেই কাজ করবে যে কোনও সরবরাহকৃত বাস্তবায়ন। কোডের উপরে ( SqlCustRepoমূল প্রোগ্রামের যুক্তিতে প্রয়োজনীয় ক্লাসটি ইনস্ট্যান্ট করে তোলা) একটি traditionalতিহ্যগত উপায় এবং এটি processCustomers()বাস্তবায়ন থেকে ডিউপলিংয়ের এই লক্ষ্য অর্জন করে না getAllCusts()। নিয়ন্ত্রণের বিপরীতে, ধারক প্রয়োজনীয় বাস্তবায়ন ক্লাসটি ইনস্ট্যান্ট করে (xML কনফিগারেশন বলে নির্দিষ্ট করে), এটি মূল প্রোগ্রামের যুক্তিতে ইনজেকশনে দেয় যা নির্দিষ্ট হুক অনুসারে আবদ্ধ হয় ( স্প্রিং ফ্রেমওয়ার্কে @Autowiredটীকায়িতকরণ বা getBean()পদ্ধতি অনুসারে বলুন )।

এটি কীভাবে করা যায় তা দেখুন। কোড নীচে বিবেচনা করুন।

Config.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="custRepo" class="JsonCustRepo" />
</beans>

CustRepo.java

interface ICustRepo 
{ ... }

JsonCustRepo.java

class JsonCustRepo implements CustRepo
{ ... }

App.java

class App
{
    public static void main(String[] args) 
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("Config.xml");
        ICustRepo custRepo = (JsonCustRepo) context.getBean("custRepo");
    }
}

আমাদেরও থাকতে পারে

class GraphCustRepo implements ICustRepo { ... }   

এবং

<bean id="custRepo" class="GraphCustRepo">

এবং আমাদের App.java পরিবর্তন করার প্রয়োজন হবে না।

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

পিএস: আইওসি জেনেরিক ধারণা এবং এটি বিভিন্ন উপায়ে অর্জিত হয়। উপরের উদাহরণগুলি নির্ভরতা ইনজেকশন দ্বারা এটি অর্জন করে।

তথ্যসূত্র: মার্টিন ফওলারের নিবন্ধ

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