প্রযুক্তিগত শব্দটি নির্ভরতা ইনজেকশনের বিপরীত বোঝাতে?


12

এটি খাঁটি প্রযুক্তিগত প্রশ্নের চেয়ে নামকরণ (প্রযুক্তিগত লেখার) আরও বেশি। আমি আমাদের অ্যাপ্লিকেশনটিতে নির্ভরতা ইনজেকশন প্রসারিত করার চারদিকে কেন্দ্রীভূক্ত একটি রিফ্যাক্টরিং প্রস্তাব (এবং এটি আমার নিজের কাছে নিযুক্ত করুন) লেখার চেষ্টা করছি। যদিও আমরা শিমের স্বাবরক্ষণের জন্য স্প্রিং ব্যবহার করি, এখনও এমন উদাহরণ রয়েছে যে মটরশুটি ব্যবহার করে ইনস্ট্যান্ট করে তোলে MyClass obj = new MyClass(...), যা সম্পূর্ণরূপে ইনজেকশন দেওয়া যেতে পারে। আমি আমার প্রস্তাবটি মার্জিত নাম ব্যবহার করতে এবং একটি উপযুক্ত শব্দ সহ ডিআই এর বিপরীতে নকশার প্যাটার্নটি উল্লেখ করতে চাই।

"টাইট কাপলিং" কি পর্যাপ্ত শব্দ যা ডিআই এর প্রতিশব্দ হিসাবে দাঁড়িয়ে?


1
হ্যাঁ, সংযুক্তি অন্যান্য ক্লাসে সুস্পষ্ট শ্রেণীর নাম ব্যবহারের ক্রিয়াকলাপ এবং কোড বেসের ফলাফল হিসাবে উভয়কেই বর্ণনা করে।
কিলিয়ান ফট

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


@ এরিকিং শো অফ। উপায় দ্বারা +1।
candied_orange

1
"নির্ভরতা স্তন্যপান"
সেলডমনিডি

উত্তর:


30

না। নির্ভরতা ইনজেকশন যার সাথে সম্পর্কযুক্ত তার চেয়ে কড়া সংযুক্তি অনেক বেশি।

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

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

সংযোজন কেবল নির্মাণ এবং আচরণকে পৃথক করার চেয়ে বেশি। আমার কাছে যদি 101 টি পদ্ধতি রয়েছে যা ক্লাস এ থেকে ক্লাস বি তে নির্দিষ্ট ক্রমে ডাকা যেতে হবে তবে আমি দৃly়ভাবে একত্রে আবদ্ধ। নির্মাণ এবং আচরণ কত বিস্ময়করভাবে পৃথক করা যায় না n't

কাপলিং হল দুটি বস্তুর আন্তঃনির্ভরতা পরিমাপ। অন্যকে প্রভাবিত না করে যে কোনও একটিতে পরিবর্তন আনতে অসুবিধা তৈরিতে অবদান রাখার বিষয়টি হ'ল কাপলিংয়ে অবদান। নির্ভরতা ইনজেকশন এটির সাথে সহায়তা করে তবে এটি সমস্ত কিছু নয়।


হ্যাঁ, হার্ড কোডিং (একটি নির্ভরতা), এটি ইনজেকশনের বিপরীতে (রানটাইমের সময়) হুবহু আমি যা বলতে চাইছিলাম তা হ'ল আপনিও আমার চেয়ে কিছুটা দ্রুত ছিলেন quick
ডক ব্রাউন

7
@ ডকব্রাউন আমি মাঝে মাঝে আশা করি এই জায়গাটি দ্রুত হওয়ার পক্ষে এত জোর না দেয়। আপনি এটি কীভাবে রাখবেন তা আমি শুনতে চাই।
candied_orange

ভাল উত্তর - নির্ভরতা ইনজেকশন decoupling বোঝায় না। বিশ্বাস না হলে খারাপ রাস্তা নেমে যায়
পি পি পি

1
@ ক্যান্ডিওড ওরেঞ্জ হতে পারে কারও কারও কাছে মেটাতে পরামর্শ দেওয়া উচিত যে উত্তরগুলি সময়কালের জন্য লুকানো থাকে। এবং / অথবা ভোটগুলি Nকয়েক ঘন্টা ধরে জনসাধারণের দর্শন থেকে লুকিয়ে রাখা হয় ... বা কোনও উত্তর নির্বাচন না করা পর্যন্ত। আমি জানি আমি যখন সম্পূর্ণরূপে উদ্দেশ্যমূলক নই যখন একটি উত্তর ইতিমধ্যে 10 টি ভোট পেয়েছে এবং অন্য 5 টির উত্তর নেই!
এসভিডজেন

1
@ এসভিডজেন মেটাতে "পশ্চিমে দ্রুততম বন্দুক" অনুসন্ধান করুন। ইস্যুটির ইতিমধ্যে একটি দীর্ঘ ইতিহাস রয়েছে।
candied_orange

6

কঠোরভাবে বলতে, নির্ভরতা ইনজেকশন শুধুমাত্র সত্যিই বিরোধিতা নয় নির্ভরতা ইনজেকশন এবং সেইজন্য কোন নির্ভরতা ব্যবস্থাপনা কৌশল যার দ্বারা - নয় নির্ভরতা ইনজেকশন।

[অযাচিত] সংযুক্তি, যদিও একেবারে অর্থোগোনাল ইস্যু নয়, হয় হয় তা হয় বা উভয় উপায়ে প্রশমিত করা যায়। এই উভয় মিলিত হয় DependencyClass:

public DependencyInjectedConstructor(DependencyClass dep) {
  dep.do();
}

public DependencyLookupConstructor() {
  var dep = new DependencyClass();
  dep.do();
}

DependencyLookupConstructorDependencyClassএই ক্ষেত্রে একটি বিশেষ সাথে মিলিত হয় । তবে, তারা দুজনেই মিলিত হয়েছে DependencyClass। আসল অশুভতা, যদি এখানে একটি থাকে তবে এটি সংযুক্তিটি অগত্যা নয়, হঠাৎ তার নিজস্ব নির্ভরতা 1 টি ইনজেকশনের প্রয়োজন DependencyLookupConstructorহলে এটি পরিবর্তন করা DependencyClassদরকার ।

তবে এই নির্মাতা / শ্রেণিটি আরও স্বচ্ছলভাবে মিলিত হয়েছে:

public DependencyLocatingConstructor() {
  var dep = ServiceLocator.GetMyDoer();
  dep.do();
}

আপনি যদি সি # তে কাজ করছেন, উপরোক্তগুলি যখন ডাকে তখন ServiceLocatorআপনাকে কিছু ফেরত দেওয়ার অনুমতি দেবে GetMyDoer(), যতক্ষণ না এতে do()যা DependencyLocatingConstructorআছে তা পারে do()। আপনি সম্পূর্ণ ইন্টারফেস 2 এর সাথে মিলিত না হয়েও সংকলন-সময় স্বাক্ষর বৈধতার সুবিধা পাবেন ।

সুতরাং, আপনার বিষ বাছাই করুন।

তবে মূলত, যদি নির্ভরতা ইনজেকশনের একটি "বিপরীত" থাকে তবে এটি "নির্ভরতা পরিচালনার কৌশলগুলি" এর রাজত্বের অন্য কিছু হবে। অন্যদের মধ্যে, আপনি যদি কথোপকথনে নিম্নলিখিতগুলির কোনওটি ব্যবহার করেন, তবে আমি এটিকে নির্ভরতা ইনজেকশন হিসাবে না হিসাবে চিহ্নিত করতাম :

  • পরিষেবা লোকেটার প্যাটার্ন
  • নির্ভরতা লোকেটার / অবস্থান
  • সরাসরি অবজেক্ট / নির্ভরতা নির্মাণ
  • লুকানো নির্ভরতা
  • "নির্ভরতা ইনজেকশন নয়"

1. হাস্যকরভাবে, ডিআই উচ্চতর স্তরে সমাধান করে এমন কিছু সমস্যা হ'ল নিম্ন স্তরে ডিআই ব্যবহার করে [অতিরিক্ত-] ফলাফল। আমি অপ্রয়োজনীয় জটিলতা সঙ্গে codebases কাজ পরিতোষ ছিল করেছি সর্বাঙ্গে স্থান যেখানে যে জটিলতা আসলে সাহায্য মুষ্টিমেয় অমায়িক ফলে ... আমি বোঝা যাচ্ছে যে নেতারা খারাপ এক্সপোজার দ্বারা পক্ষপাতমূলক করছি।

২. পরিষেবা অবস্থান ব্যবহার করা আপনাকে অনুরোধ কোডগুলি থেকে কার্যকরভাবে একই ধরণের বিভিন্ন নির্ভরতা নির্দিষ্ট করার অনুমতি দেয় , যদিও নির্ভরতা কীভাবে তৈরি হয় সে সম্পর্কে এখনও অজানা ost মনে করুন আপনার সমাধান করতে হবে Userবা IUserবিভিন্ন প্রয়োজনের জন্য: যেমন, Locator.GetAdministrator()বনাম Locator.GetAuthor()- বা যাই হোক না কেন। আমার কোডটি কী ইন্টারফেস সমর্থন করে তা জেনেও কীভাবে এটি কার্যকরীভাবে প্রয়োজন তা জানতে চাইতে পারে।


2
পরিত্রাণ DependencyInjectedConstructor(DependencyClass dep)হ'ল DependencyClass একটি ইন্টারফেস বা বিমূর্ত শ্রেণি হতে পারে। এ কারণেই এটি আমাকে দু: খিত করে তোলে যে সি # কোডাররা ইন্টারফেসের উপসর্গটি যেমন ব্যবহার করে, তেমন ব্যবহার করে IDependency। ক্লায়েন্ট হিসাবে, এই নির্ভরতা জিনিসটি আসলে কী তা আমার ব্যবসা নয়। যতক্ষণ না আমি এটি নির্মাণ করি না, আমাকে কেবল এটির সাথে কীভাবে কথা বলতে হয় তা জানতে হবে। এটি অন্য কারও সমস্যা।
candied_orange

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

প্রকৃতপক্ষে ... ডিআই অগত্যা আপনাকে সি # তে একটি ইন্টারফেসে জুটি বেঁধে বলার ক্ষেত্রে কিছুটা সীমার বাইরে থাকতে পারে। যদিও, আমি এগুলিকে সি # এ এড়িয়ে গিয়েছি, আমি এই ধারণাটির আওতায় রয়েছি যে আমি dynamicপরামিতিগুলি গ্রহণ করতে পারি । (তবে varপ্যারামিটারগুলি নয় , যদি মেমোরিটি পরিবেশন করে)) সুতরাং, ডি # সি এর সাথে, আমি মনে করি আমাকে একটি ইন্টারফেসের বিরুদ্ধে কোড করতে হবে, বা আমাকে কমপ্লাইল-টাইম বৈধতা পুরোপুরি ভুলে যেতে হবে।
এসভিডজেন

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

আমি নিশ্চিত নই যে আমরা সম্পূর্ণ দ্বিমত পোষণ করছি। তবে, স্পষ্ট করার জন্য ... অবজেক্টগুলি অভ্যন্তরীণভাবে তাদের নিজস্ব ইন্টারফেসের সাথে মিলিত হয়েছে , হ্যাঁ। তবে, ইন্টারফেসটি কেবলমাত্র নির্ভরতা-সংযুক্তিকে চাপিয়ে দেয় যদি ইন্টারফেসটি স্পষ্টভাবে নামকরণ করা হয়। সি #, ব্যবহারে dynamicবা varএকটি লোকেটার এলইটি থেকে একটি বস্তু পেয়ে আপনি ইন্টারফেস উপেক্ষা এবং ব্যবহার এর কোন শ্রেণী যে পারেন do()আপনার যা প্রয়োজন কিনা যে বর্গ কার্যকরী কিছু নির্বিশেষে IDoerইন্টারফেস। অন্য কথায়, আমাদের কাছে A-> B <-C থাকলে, ডিআই এটিকে সি থেকে ডেকে দেয়, তবে এর জন্য এ এবং সি উভয়ই বিয়ের সাথে সংযুক্ত করা প্রয়োজন, এবং ডি চাইলে ডি ব্যবহার রোধ করে do()
এসভিডজেন

2

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


2
আমি পছন্দ করি instance creationতবে এটি যথেষ্ট নির্দিষ্ট নয়। ডিআই উদাহরণস্বরূপ তৈরি করে তবে প্রয়োগকারী স্তরে নয় নিয়ন্ত্রকের মাধ্যমে। হতে পারেinternal instance creation
উভচর

1

আমি নির্ভরতা encapsulation সঙ্গে যেতে হবে । এটি এক্সপ্রেসনেসটি আবার দেখা এবং ফিরে যাওয়ার পরিবর্তে লকড থাকা প্রকাশ করে।

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