ইনভার্শন অফ কন্ট্রোল (আইওসি) প্যাটার্নটি নিয়ে অনেক বিভ্রান্তি রয়েছে বলে মনে হচ্ছে। বেশিরভাগ লোক এটিকে কৌশল প্যাটার্ন বা কোনও উপাদান মডেলের সাথে সমান করেছেন, তবে এই তুলনাটি আইওসি সম্পর্কে যা সত্য তা বোঝায় না। নির্ভরতা কীভাবে প্রাপ্ত হয় সে সম্পর্কে আইওসি সত্যই। আমাকে যদি আপনি একটি উদাহরণ দিতে:
class Game {
void Load() {
this.Sprite.Load(); // loads resource for drawing later
}
}
class Sprite {
void Load() {
FileReader reader = new FileReader("path/to/resource.gif");
// load image from file
}
}
উপরের দিকে এটি স্পষ্ট যে Sprite.Load
এর উপর নির্ভরতা রয়েছে FileReader
। আপনি যখন পদ্ধতিটি পরীক্ষা করতে চান আপনার নিম্নলিখিতগুলি প্রয়োজন:
- জায়গায় একটি ফাইল সিস্টেম
- ফাইল সিস্টেম থেকে লোড করার জন্য একটি পরীক্ষা ফাইল
- সাধারণ ফাইল সিস্টেমের ত্রুটিগুলি ট্রিগার করার ক্ষমতা
প্রথম দুটি সুস্পষ্ট, তবে আপনি যদি নিশ্চিত করতে চান যে আপনার ত্রুটি পরিচালনাটি প্রত্যাশার মতো কাজ করে তবে আপনারও সত্যিই # 3 প্রয়োজন। উভয় ক্ষেত্রেই আপনি সম্ভবত ডিস্কে যাওয়ার প্রয়োজন হওয়ায় সম্ভবত আপনার পরীক্ষাগুলি কিছুটা কমিয়ে দিয়েছেন এবং আপনি সম্ভবত পরীক্ষার পরিবেশকে আরও জটিল করে তুলেছেন।
আইওসি এর লক্ষ্য এটির নির্মাণ থেকে আচরণের ব্যবহারকে দ্বিগুণ করা। এটি কৌশল কৌশল থেকে কীভাবে আলাদা হয় তা নোট করুন। কৌশল প্যাটার্নের সাথে লক্ষ্যটি হ'ল আচরণের পুনর্বার ব্যবহারযোগ্য অংশকে সজ্জিত করা যাতে আপনি সহজেই ভবিষ্যতে এটি প্রসারিত করতে পারেন; কৌশলগুলি কীভাবে তৈরি করা হয় সে সম্পর্কে এটি বলার কিছুই নেই।
যদি আমরা Sprite.Load
উপরের পদ্ধতিটি পুনরায় লিখতে পারি তবে আমরা সম্ভবত এর সাথে শেষ করব:
class Sprite {
void Load(IReader reader) {
// load image through reader
}
}
এখন, আমরা এটির ব্যবহার থেকে পাঠকটির নির্মাণকেন্দ্রটিকে decoupled করেছি। অতএব, পরীক্ষার সময় একটি পরীক্ষক পাঠকটিতে অদলবদল করা সম্ভব। এর অর্থ হল যে আপনার পরীক্ষার পরিবেশের জন্য আর কোনও ফাইল সিস্টেমের দরকার নেই, ফাইল পরীক্ষা করা উচিত এবং ত্রুটি ইভেন্টগুলি সহজেই অনুকরণ করতে পারে।
মনে রাখবেন যে আমি আমার পুনর্খনিতে দুটি কাজ করেছি। আমি একটি ইন্টারফেস তৈরি করেছি IReader
যা কিছু আচরণকে আবদ্ধ করে তোলে - যেমন কৌশল প্যাটার্নটি প্রয়োগ করে। তদতিরিক্ত, আমি সঠিক পাঠককে অন্য শ্রেণিতে সরিয়ে দেওয়ার জন্য দায়বদ্ধ করেছি।
উপরের বর্ণনা দেওয়ার জন্য আমাদের কোনও নতুন প্যাটার্নের নাম প্রয়োজন নেই। কৌশল এবং কারখানার নিদর্শনগুলির (আইওসি পাত্রে জন্য) মিশ্রণ হিসাবে এটি আমাকে আঘাত করে। এই কথা বলা হচ্ছে যে, মানুষ এই প্যাটার্নটির বিষয়ে লোকেরা কী কারণে আপত্তি করছে তা আমি নিশ্চিত নই যেহেতু এটি স্পষ্ট যে এটি একটি আসল সমস্যা সমাধান করে, এবং জাভা সম্পর্কে এটি কী করবে তা আমার কাছে স্পষ্ট নয়।