Inversion of control
সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের ক্ষেত্রে, ইনভার্সন অফ কন্ট্রোল (আইওসি) একটি নকশা প্যাটার্ন যেখানে একটি কম্পিউটার প্রোগ্রামের কাস্টম-লিখিত অংশগুলি একটি সাধারণ কাঠামো থেকে নিয়ন্ত্রণের প্রবাহ গ্রহণ করে। "ইনভার্সন" শব্দটি ঐতিহাসিকঃ পদ্ধতিগত প্রোগ্রামিংয়ের তুলনায় এই নকশা "ইনভার্টস" নিয়ন্ত্রণ সহ একটি সফ্টওয়্যার স্থাপত্য। পদ্ধতিগত প্রোগ্রামিং-এ, একটি প্রোগ্রামের কাস্টম কোড সাধারণ কাজগুলির যত্ন নেওয়ার জন্য পুনঃব্যবহারযোগ্য লাইব্রেরিগুলিকে কল করে, তবে নিয়ন্ত্রণের বিপরীতকরণের সাথে, এটি সেই কাঠামো যা কাস্টম কোডকে কল করে। জিইউআই পরিবেশের উত্থানের পর থেকে অ্যাপ্লিকেশন উন্নয়ন কাঠামো দ্বারা নিয়ন্ত্রণের বিপরীতমুখী ব্যাপকভাবে ব্যবহৃত হয়েছে এবং জিইউআই পরিবেশে এবং ওয়েব সার্ভার অ্যাপ্লিকেশন কাঠামো উভয় ক্ষেত্রেই ব্যবহার করা হচ্ছে। নিয়ন্ত্রণের বিপরীতকরণ অ্যাপ্লিকেশন প্রোগ্রামার দ্বারা সংজ্ঞায়িত পদ্ধতি দ্বারা কাঠামোকে সম্প্রসারণযোগ্য করে তোলে। ইভেন্ট-চালিত প্রোগ্রামিং প্রায়শই আইওসি ব্যবহার করে প্রয়োগ করা হয় যাতে কাস্টম কোডটি শুধুমাত্র ইভেন্ট পরিচালনার সাথে সম্পর্কিত হতে হয়, যখন ইভেন্ট লুপ এবং ইভেন্ট/বার্তাগুলির প্রেরণ কাঠামো বা রানটাইম পরিবেশ দ্বারা পরিচালিত হয়। ওয়েব সার্ভার অ্যাপ্লিকেশন কাঠামোতে, প্রেরণকে সাধারণত রাউটিং বলা হয় এবং হ্যান্ডলারদের এন্ডপয়েন্ট বলা যেতে পারে। "ইনভার্সন অফ কন্ট্রোল" বাক্যাংশটি আলাদাভাবে জাভা প্রোগ্রামারদের সম্প্রদায়ে স্প্রিং ফ্রেমওয়ার্কের মতো জাভা কাঠামোর মধ্যে "আইওসি পাত্রে"-র সাথে ঘটে যাওয়া বস্তুর নির্ভরতা ইনজেকশনের নিদর্শনগুলিকে বিশেষভাবে বোঝাতে ব্যবহৃত হতে শুরু করেছে। এই ভিন্ন অর্থে, "নিয়ন্ত্রণের বিপরীতমুখীকরণ" বলতে ফ্রেমওয়ার্ক নিয়ন্ত্রণ প্রবাহ (যেমন অ্যাপ্লিকেশন কোড কার্যকর করার সময় নিয়ন্ত্রণ) প্রদানের মূল অর্থের পরিবর্তে অ্যাপ্লিকেশন অবজেক্ট দ্বারা ব্যবহৃত নির্ভরতাগুলির বাস্তবায়নের উপর কাঠামো নিয়ন্ত্রণ প্রদানকে বোঝায়। কলব্যাক)। একটি উদাহরণ হিসাবে, ঐতিহ্যবাহী প্রোগ্রামিংয়ের সাথে, একটি অ্যাপ্লিকেশনের প্রধান ফাংশন একটি মেনু লাইব্রেরিতে উপলব্ধ কমান্ডের একটি তালিকা প্রদর্শন করতে এবং ব্যবহারকারীকে একটি নির্বাচন করার জন্য প্রশ্ন করতে পারে। লাইব্রেরি এইভাবে নির্বাচিত বিকল্পটিকে ফাংশন কলের মান হিসাবে ফিরিয়ে দেবে এবং প্রধান ফাংশনটি সংশ্লিষ্ট কমান্ডটি কার্যকর করতে এই মানটি ব্যবহার করে। এই শৈলীটি পাঠ্য ভিত্তিক ইন্টারফেসে প্রচলিত ছিল। উদাহরণস্বরূপ, একটি ইমেল ক্লায়েন্ট নতুন মেইল লোড করতে, বর্তমান মেইলের উত্তর দিতে, নতুন মেইল তৈরি করতে ইত্যাদি কমান্ড সহ একটি স্ক্রিন দেখাতে পারে এবং ব্যবহারকারী একটি কমান্ড নির্বাচন করার জন্য একটি কী টিপে না দেওয়া পর্যন্ত প্রোগ্রাম এক্সিকিউশন ব্লক করবে। অন্যদিকে, নিয়ন্ত্রণের বিপরীতক্রমে, প্রোগ্রামটি এমন একটি সফ্টওয়্যার কাঠামো ব্যবহার করে লেখা হবে যা সাধারণ আচরণগত এবং গ্রাফিকাল উপাদানগুলি জানে, যেমন উইন্ডোজিং সিস্টেম, মেনু, মাউস নিয়ন্ত্রণ ইত্যাদি। কাস্টম কোড কাঠামোর জন্য "শূন্যস্থান পূরণ করে", যেমন মেনু আইটেমগুলির একটি টেবিল সরবরাহ করা এবং প্রতিটি আইটেমের জন্য একটি কোড সাবরুটিন নিবন্ধিত করা, তবে এটি সেই কাঠামো যা ব্যবহারকারীর ক্রিয়া পর্যবেক্ষণ করে এবং যখন কোনও মেনু আইটেম নির্বাচন করা হয় তখন সাবরুটিনের আহ্বান জানায়। মেল ক্লায়েন্টের উদাহরণে, কাঠামোটি কীবোর্ড এবং মাউস ইনপুট উভয়ই অনুসরণ করতে পারে এবং ব্যবহারকারীর দ্বারা যে কোনও উপায়ে আহ্বান করা কমান্ডটি কল করতে পারে এবং একই সাথে নেটওয়ার্ক ইন্টারফেসটি পর্যবেক্ষণ করে নতুন বার্তা আসে কিনা তা খুঁজে বের করতে এবং কিছু নেটওয়ার্ক ক্রিয়াকলাপ সনাক্ত করা হলে স্ক্রিনটি রিফ্রেশ করতে পারে। স্প্রেডশিট প্রোগ্রাম বা টেক্সট এডিটরের জন্য কঙ্কাল হিসাবে একই কাঠামো ব্যবহার করা যেতে পারে। অন্যদিকে, ফ্রেমওয়ার্কটি ওয়েব ব্রাউজার, স্প্রেডশিট বা টেক্সট এডিটর সম্পর্কে কিছুই জানে না; তাদের কার্যকারিতা বাস্তবায়নের জন্য কাস্টম কোড লাগে। নিয়ন্ত্রণের বিপরীতকরণ একটি দৃঢ় অর্থ বহন করে যে পুনর্ব্যবহারযোগ্য কোড এবং সমস্যা-নির্দিষ্ট কোড স্বাধীনভাবে তৈরি করা হয় যদিও তারা একটি অ্যাপ্লিকেশন একসাথে কাজ করে। কলব্যাক, সময়সূচী, ইভেন্ট লুপ এবং টেমপ্লেট পদ্ধতি হল নকশার নিদর্শনগুলির উদাহরণ যা নিয়ন্ত্রণ নীতির বিপরীতমুখী অনুসরণ করে, যদিও শব্দটি সাধারণত অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের প্রসঙ্গে ব্যবহৃত হয়। (নির্ভরতা ইনজেকশন জাভা কাঠামো দ্বারা জনপ্রিয় "নির্ভরতার বাস্তবায়নের উপর বিপরীত নিয়ন্ত্রণ" এর পৃথক, নির্দিষ্ট ধারণার একটি উদাহরণ।) নিয়ন্ত্রণের বিপরীতমুখীকরণকে কখনও কখনও "হলিউডের নীতিঃ আমাদের ডাকবেন না, আমরা আপনাকে ডাকব" হিসাবে উল্লেখ করা হয়। কম্পিউটার বিজ্ঞানে ব্যাকগ্রাউন্ড ইনভারসন অফ কন্ট্রোল কোনও নতুন শব্দ নয়। মার্টিন ফাউলার এই বাক্যাংশের ব্যুৎপত্তি 1988 সাল থেকে খুঁজে পেয়েছেন, তবে এটি 1970-এর দশকে মাইকেল জ্যাকসন তাঁর জ্যাকসন স্ট্রাকচার্ড প্রোগ্রামিং পদ্ধতিতে বর্ণিত প্রোগ্রাম ইনভার্শন ধারণার সাথে ঘনিষ্ঠভাবে সম্পর্কিত। একটি বটম-আপ পার্সারকে টপ-ডাউন পার্সারের বিপরীত হিসাবে দেখা যেতে পারেঃ এক ক্ষেত্রে, নিয়ন্ত্রণ পার্সারের সাথে থাকে, অন্য ক্ষেত্রে, এটি রিসিভিং অ্যাপ্লিকেশনের সাথে থাকে। মাইকেল ম্যাটসন এই শব্দটি একটি গবেষণাপত্রে ব্যবহার করেছিলেন (এর পরিবর্তে অ্যাপ্লিকেশন কোড কলিং কাঠামোর মূল অর্থ সহ), এবং তারপর সেখান থেকে স্টেফানো মাজোচি দ্বারা নেওয়া হয়েছিল এবং 1999 সালে একটি নিষ্ক্রিয় অ্যাপাচি সফ্টওয়্যার ফাউন্ডেশন প্রকল্প, অ্যাভালন-এ তাঁর দ্বারা জনপ্রিয় করা হয়েছিল, যেখানে এটি কার্যকর প্রবাহ নিয়ন্ত্রণের পাশাপাশি একটি শিশু বস্তুর নির্ভরশীলতার মধ্যে একটি প্যারেন্ট অবজেক্ট পাস করার কথা উল্লেখ করে। এই বাক্যাংশটি 2004 সালে রবার্ট সি মার্টিন এবং মার্টিন ফাউলার দ্বারা আরও জনপ্রিয় করা হয়েছিল, যাদের মধ্যে পরেরটি 1980-এর দশকে শব্দটির উৎপত্তি চিহ্নিত করে। ঐতিহ্যবাহী প্রোগ্রামিংয়ে, ব্যবসায়িক যুক্তির প্রবাহ স্থিরভাবে একে অপরের সাথে আবদ্ধ বস্তু দ্বারা নির্ধারিত হয়। নিয়ন্ত্রণের বিপরীতমুখী প্রবাহে, প্রবাহ নির্ভর করে প্রোগ্রাম সম্পাদনের সময় নির্মিত অবজেক্ট গ্রাফের উপর। এই ধরনের গতিশীল প্রবাহ বস্তুর মিথস্ক্রিয়া দ্বারা সম্ভব হয় যা বিমূর্ততার মাধ্যমে সংজ্ঞায়িত করা হয়। এই রান-টাইম বাঁধাই নির্ভরতা ইনজেকশন বা একটি পরিষেবা লোকেটরের মতো প্রক্রিয়া দ্বারা অর্জন করা হয়। আইওসি-তে, কোডটি সংকলনের সময় স্থিতিশীলভাবে সংযুক্ত করা যেতে পারে, তবে কোডটিতে সরাসরি রেফারেন্সের পরিবর্তে বাহ্যিক কনফিগারেশন থেকে এর বিবরণ পড়ে কোডটি কার্যকর করা যেতে পারে। নির্ভরতা ইনজেকশনে, একটি নির্ভরশীল বস্তু বা মডিউল রান টাইমে প্রয়োজনীয় বস্তুর সাথে যুক্ত করা হয়। প্রোগ্রাম সম্পাদনের সময় কোন নির্দিষ্ট বস্তু নির্ভরশীলতাকে সন্তুষ্ট করবে তা সাধারণত স্ট্যাটিক বিশ্লেষণ ব্যবহার করে সংকলন সময়ে জানা যায় না। এখানে অবজেক্ট ইন্টারঅ্যাকশনের পরিপ্রেক্ষিতে বর্ণিত হলেও, নীতিটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ছাড়াও অন্যান্য প্রোগ্রামিং পদ্ধতির ক্ষেত্রেও প্রযোজ্য হতে পারে। চলমান প্রোগ্রামটি একে অপরের সাথে বস্তুগুলিকে আবদ্ধ করার জন্য, বস্তুগুলির অবশ্যই সামঞ্জস্যপূর্ণ ইন্টারফেস থাকতে হবে। উদাহরণস্বরূপ, ক্লাস এ ইন্টারফেস 1-এ আচরণ অর্পণ করতে পারে যা ক্লাস বি দ্বারা বাস্তবায়িত হয়; প্রোগ্রামটি এ এবং বি-কে তাত্ক্ষণিক করে এবং তারপরে বি-কে এ-তে প্রবেশ করায়। এক্সডিই, 1985 ভিজ্যুয়াল বেসিক (ক্লাসিক), 1991-এর জন্য মেসা প্রোগ্রামিং পরিবেশ ব্যবহার করুন। এইচটিএমএল ডিওএম ইভেন্ট স্প্রিং ফ্রেমওয়ার্ক ASP.NET কোর টেমপ্লেট পদ্ধতির প্যাটার্ন উদাহরণ কোড এইচটিএমএল ডিওএম ইভেন্ট ওয়েব ব্রাউজারগুলি এইচটিএমএল-এ ডিওএম ইভেন্টগুলির জন্য নিয়ন্ত্রণের বিপরীত প্রয়োগ করে। অ্যাপ্লিকেশন ডেভেলপার একটি কলব্যাক রেজিস্টার করতে ব্যবহার করে। <! ডক্টাইপ এইচটিএমএল> <এইচটিএমএল ল্যাং = "এন"> <হেড> <মেটা চারসেট = "ইউটিএফ-8"> <শিরোনাম> ডিওএম স্তর 2 ইভেন্ট হ্যান্ডলার </হেড> <বডি> <এইচ1> <বড়> <স্প্যান আইডি = "আউটপুট"> </স্প্যান> </বড়> </পি> <স্ক্রিপ্ট> ভার্ নিবন্ধিত লিস্টেনার = ফাংশন () {document.getElementById ("আউটপুট"). ইনারএইচটিএমএল = "<বড়> নিবন্ধিত শ্রোতাকে ডাকা হয়েছিল। আপনি যদি পৃষ্ঠায় ক্লিক করেন, তাহলে আপনার ওয়েব ব্রাউজার ইভেন্ট হ্যান্ডলারকে কল করবে। </লার্জ> "</স্ক্রিপ্ট> </বডি> </এইচটিএমএল> ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক একটি Asp.NetCore ওয়েব অ্যাপ্লিকেশনের জন্য এই উদাহরণ কোডটি একটি ওয়েব অ্যাপ্লিকেশন হোস্ট তৈরি করে, একটি এন্ডপয়েন্ট নিবন্ধিত করে এবং তারপর কাঠামোতে নিয়ন্ত্রণ প্রেরণ করেঃ ভার বিল্ডার = WebApplication.CreateBuilder (আরজিএস); ভার অ্যাপ = builder.Build (); app.MapGet (", ") =>" হ্যালো ওয়ার্ল্ড! "); app.Run (); এছাড়াও দেখুন বিমূর্ত স্তর আর্কিটাইপ প্যাটার্ন অ্যাসিঙ্ক্রোনাস I/O অ্যাস্পেক্ট-ওরিয়েন্টেড প্রোগ্রামিং কলব্যাক (কম্পিউটার বিজ্ঞান) ক্লোজার (কম্পিউটার বিজ্ঞান) কন্টিনিউয়েশন ডেলিগেট (সিএলআই) নির্ভরতা বিপরীত নীতি প্রবাহ-ভিত্তিক প্রোগ্রামিং অন্তর্নিহিত আহ্বান বাধা হ্যান্ডলার বার্তা পাসিং মোনাড (কার্যকরী প্রোগ্রামিং) পর্যবেক্ষক প্যাটার্ন প্রকাশ/সাবস্ক্রাইব পরিষেবা লোকেটর প্যাটার্ন সংকেত (কম্পিউটিং) সফ্টওয়্যার কাঠামো কৌশল প্যাটার্ন ব্যবহারকারী প্রস্থান পরিদর্শক প্যাটার্ন এক্সএসএলটি রেফারেন্স বাহ্যিক লিঙ্ক নিয়ন্ত্রণ ব্যাখ্যা এবং বাস্তবায়নের বিপরীত উদাহরণ নিয়ন্ত্রণ সফ্টওয়্যার স্থাপত্য স্থাপত্য প্যাটার্ন (কম্পিউটার বিজ্ঞান) জাভা (প্রোগ্রামিং ভাষা) প্রোগ্রামিং নীতি উপাদান-ভিত্তিক সফ্টওয়্যার ইঞ্জিনিয়ারিং সফ্টওয়্যার ডিজাইন প্যাটার্ন