নিয়ন্ত্রণের বিপরীতটি কী এবং আমি কখন এটি ব্যবহার করব?


64

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

এটি ইন্টারফেসের সাথে বাস্তবায়ন করতে হবে বা ক্লাসগুলি দিয়ে করা যেতে পারে?


উত্তর:


62

আইওসি ( উইকিপিডিয়ায় নিয়ন্ত্রণের বিপরীতমুখীকরণ দেখুন ) প্রযোজ্য যেখানে কোনও উপাদান সম্পূর্ণরূপে কোনও কাজ সম্পাদন করতে পারে না কারণ এতে কিছু প্রয়োজনীয় তথ্য বা কার্যকারিতা নেই।

আইওসি প্যাটার্নটির সহজতম উদাহরণ সিতে কলব্যাক ফাংশন হবে উদাহরণস্বরূপ আপনি ফাংশনটি ঘোষণা করতে পারেন:

void Iterator(void *list, Func* f)

যা এর প্রতিটি আইটেমটিতে ফাংশন listপ্রয়োগ করে পুনরাবৃত্তি করে fIteratorফাংশন জানে না কিভাবে প্রতিটি আইটেমের প্রক্রিয়া করা হবে, আপনি শুধু একটি আর্গুমেন্ট হিসাবে একটি ফাংশন প্রদান, এবং এটা তাদের প্রক্রিয়া করে।

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

ইন নির্ভরতা ইনজেকশন প্রতিটি উপাদানের এটা কাজটি করা প্রয়োজন নির্ভরতা একটি তালিকা ঘোষণা করা উচিত। রানটাইমের সময় একটি বিশেষ উপাদান (সাধারণত) একটি আইওসি কনটেইনার বলে এই উপাদানগুলির মধ্যে বাঁধাই করে। এটি প্রকাশিত উপাদান নির্ভরতার জন্য মান প্রদান করার চেষ্টা করে।

সিউডো-কোডের একটি উদাহরণ এখানে:

class Foo 
{ 
   <Require Boo>Constructor(Boo boo){ boo.DoSomething } 
}

এই উদাহরণে শ্রেণীর Fooএকটি নির্মাতা রয়েছে যা Booকিছু ক্রিয়া সম্পাদন করতে টাইপের যুক্তি প্রয়োজন ।

আপনি এর Fooঅনুরূপ কোড ব্যবহার করে শ্রেণীর উদাহরণ তৈরি করতে পারেন :

MyContainer.Create(typeof Foo)

MyContainer- এটি একটি আইওসি কনটেইনার , যা Booএটি Fooকনস্ট্রাক্টরের উদাহরণ পেতে এবং এটি সরবরাহ করার জন্য যত্ন নেয় ।

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

  • উপাদানগুলি সহজেই স্বাধীনভাবে পরীক্ষা করা যেতে পারে।
  • প্রোগ্রাম জটিলতা হ্রাস করা যেতে পারে।
  • আপনি উপাদানগুলি অন্য বাস্তবায়নে স্যুইচ করতে পারেন।

তবে কিছু ক্ষেত্রে আইওসি কোডগুলি বুঝতে আরও শক্ত করে তুলতে পারে।

আপনি যদি আইওসির বাস্তব-বিশ্বের ব্যবহারের ভাল উদাহরণ দেখতে চান তবে মিরকোসোফ্ট কমপোজিট ইউআই অ্যাপ্লিকেশন ব্লক এবং কম্পোজিটডব্লুএফএফটি দেখুন

আমি আশা করি আমার ব্যাখ্যা আপনাকে সাহায্য করবে।

শুভেচ্ছা,
আকু


1
পাঁচ বছর পরে, কিন্তু এখনও .... এটি দুর্দান্ত বর্ণনা ছিল। ধন্যবাদ।
নিক হজস

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

সুতরাং, একটি কোড যা এর সমস্ত নির্ভরতার জন্য ইন্টারফেস ভিত্তিক সমাধান ব্যবহার করে তাও আইওসি ডিজাইনের উপর ভিত্তি করে?
নিকেল

18

যেহেতু আমি সম্প্রতি এটি নিজেই খনন করেছি এবং সমস্ত বুকমার্ক রেখেছি, নিম্নলিখিতটি আমি আইওসি / ডিআই সম্পর্কে জানার জন্য অমূল্য বলে মনে করি।

আইওসি / ডিআই-তে মার্টিন ফওলারের মূল নিবন্ধ

প্রথমে জানতে কিছু ধারণা

আইওসি / ডিআই টিউটোরিয়ালগুলির একটি দুর্দান্ত সংগ্রহ

ম্যানিং প্রেস থেকে আইওসি / ডিআই-তে বুক করুন

কীভাবে আপনার নিজের আইওসি তৈরি করবেন তার উত্স এবং ব্যাখ্যা - কারণ পড়ার উত্স কোডটি সর্বদা একটি ধারণা বোঝার সর্বোত্তম উপায় way


4

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

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

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

সুতরাং, আপনার সর্বজনীন তালিকার রিডপিয়োপল (ISTreamReader পাঠক) থাকতে পারে এবং আপনার আইওসি ধারকটির জন্য আপনার সেটআপে এটি বলুন, প্রতিবার যখন আপনি কোনও IStreamReader এসকিউএলস্ট্রিম রিডার ব্যবহার করবেন বলে আশা করেন।

তারপরে যদি আপনি পরে নিজের মতামত পরিবর্তন করেন তবে আপনাকে কেবল এটিই এক জায়গায় (আপনার ধারক সেটআপ) করা দরকার এবং কতগুলি পদ্ধতিতে আইএসট্রিমার্ডার জিজ্ঞাসা করা উচিত তা বিবেচ্য নয়, আপনি আপনার কনটেইনারকে যে ডিফল্ট বলেছিলেন তা সর্বদা ডিফল্ট হবে পরিবেশন কর.


3

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

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