ডিপেন্ডেন্সি ইনজেকশন এবং আইওসি পাত্রে ব্যবহার করার সুবিধা কী কী?


62

আমি নির্ভরতা ইনজেকশন এবং আইওসি পাত্রে একটি আলাপ করার পরিকল্পনা করছি এবং আমি এটি ব্যবহারের জন্য কিছু ভাল যুক্তি খুঁজছি।

এই কৌশলটি এবং এই সরঞ্জামগুলি ব্যবহার করার সর্বাধিক গুরুত্বপূর্ণ সুবিধাগুলি কী কী?


1
দেখুন এখানে এবং এখানে Stackoverflow উত্তরের জন্য এবং এখানে আইওসি একটি ভাল সম্পূর্ণ নিবন্ধ জন্য। এবং যদি আপনি তুলনার জন্য এর বিরুদ্ধে যুক্তি চান তবে এসও-তে এখানে যান।
জেসি সি। স্লাইসার

14
বাট হতে হবে না ... তবে ডিআই / আইওসি কেন ব্যবহার করা উচিত তা যদি আপনি না জানেন তবে আপনি কেন এটি সম্পর্কে কথা বলছেন? বাজি হারাবেন? ;-)
স্টিভেন এ লো।

2
@ স্টিভেন, তাঁর বস সম্ভবত এটি করতে বলেছিলেন।

1
@ স্টিভেন, আমি ইতিমধ্যে সমস্ত সময় ডিআই ব্যবহার করি (কেউ কেউ খুব প্রায়ই বলে থাকে :- ডি), আমি অন্য লোকেরা এটি ব্যবহার করার জন্য কিছু ভাল যুক্তি সন্ধান করছি।
অ্যান্ডি লোরি

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

উত্তর:


47

আমার পক্ষে সর্বাধিক গুরুত্বপূর্ণ, একক দায়িত্বের নীতি অনুসরণ করা সহজ করে দিচ্ছে ।

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

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

ডিআই / আইওসি আমার প্রোগ্রামিং ক্যারিয়ারের কয়েকটি বিষয় যা একটি "গেম চেঞ্জার" হয়েছে। একটা হল বিশাল মানের ফাঁক কোড মধ্যে আমি আগে ও দ্বি / আইওসি শেখার পর লিখেছিলেন। আমাকে আরও জোর দেওয়া যাক। কোডের মানটিতে বিশাল উন্নতি।


3
খোলা-বন্ধ নীতিমালা এত বড় ব্যাপার কেন? আপনার যদি মনে হয় আপনার কোনও এপিআই / ইন্টারফেস বদলাতে হবে কেন আপনার উচিত হবে না?
আর্ন এভার্টসন

@ আর্নেইভার্টসন রবার্ট সি মার্টিনকে মুক্ত-বন্ধ নীতি সম্পর্কে কথা বলুন। আপনি আলোকিত হবে।
অল্টারনেটেক্স

@ আমেরেভার্টসন ওপেন-ক্লোজড যখন আপনার কোডটি অন্যদের ব্যবহারের মডিউল হিসাবে সরবরাহ করে (যেমন বাণিজ্যিক পণ্য হিসাবে) সরবরাহ করা হয় তখন এটি অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি আপনার কোডটি পরিবর্তন করতে আপনাকে ফিরিয়ে না দিয়ে ব্যবহারে আরও অভিযোজিত করে তোলে
জেমস এলিস-জোনস

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

1
আমি বহু বছর আগে এই উত্তরটিকে অগ্রাহ্য করেছি; এখানে কিছু মন্তব্য রয়েছে: 1) বাস্তবে, ডিআই-র ব্যাপক ব্যবহার এসআরপি-র বিরুদ্ধে কাজ করে , কারণ প্রোগ্রামাররা কেবল তাদের ইনজেকশনের "নিয়ন্ত্রণকারী", "পরিষেবাগুলি", "ডিএও" ইত্যাদির জন্য নতুন ক্লাস তৈরির পরিবর্তে পদ্ধতি যুক্ত করে চলেছে keep নতুন কার্যকারিতা। আপনি সাধারণত জাভা এবং সি # .NET প্রকল্পগুলিতে যা ঘটতে দেখেন যা কিছু ডিআই ফ্রেমওয়ার্ক বা ধারক ব্যবহার করে। 2) উন্মুক্ত-নীতিটি ছিল শ্রেণি (প্রয়োগকরণ) উত্তরাধিকারের কার্যকারিতা সম্পর্কে কেবল বার্ট্র্যান্ড মেয়ারের বিভ্রান্তি; যদি আপনি তাঁর 1400+ পৃষ্ঠার বইটিতে এটি অনুসন্ধান করেন তবে আপনি যা বলতে চাইছেন তা দেখতে পাবে - এটি সত্যই নির্বোধ।
রোজারিও

9

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


3

নির্ভরতা ইনজেকশনগুলির সুবিধাগুলি হ'ল:

  1. আপনার কোডটি পরিষ্কার এবং আরও পঠনযোগ্য।
  2. কোডগুলি আলগাভাবে মিলিত হয়।
  3. এক্সএমএল ফাইলে বাস্তবায়নগুলি কনফিগার করা হওয়ায় আরও পুনরায় ব্যবহারযোগ্য, এটি অন্য একটি প্রসঙ্গে ব্যবহার করা যেতে পারে।
  4. কোড বিভিন্ন মক প্রয়োগের মাধ্যমে সহজেই টেস্টযোগ্য হতে পারে।

1

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

আপনি সার্ভিস লোকেটারগুলি ব্যবহার করে বা যখন প্রযোজ্য (সরাসরি বেশিরভাগ সময়) সরাসরি সরাসরি নির্ভরতা ইনস্ট্যান্ট করে উচ্চ সংহতি এবং কম সংযোগের ক্ষেত্রে একই লক্ষ্য অর্জন করতে পারেন।

এখন, আমি জানি অনেকেই এই মতামতের সাথে একমত নন। আমি দৃ concrete় উদাহরণগুলি আলোচনা করে খুশি হব।


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

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

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

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

1
@ জোনাথন ইউনিট পরীক্ষার বিষয়ে, এটি একটি পৌরাণিক কাহিনী যা তাত্ক্ষণিকভাবে সহযোগীকারীরা এই জাতীয় পরীক্ষার সৃষ্টি প্রতিরোধ করে; সুপরিচিত মশকরা সরঞ্জাম রয়েছে যা কোনও শ্রেণি নির্ভরতা বাস্তবায়ন থেকে বিচ্ছিন্ন করার কাজ করে, সে ইনজেকশনযুক্ত কিনা তা।
রোগারিও

-1

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


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

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