নির্ভরতা ইঞ্জেকশন প্যাটার্নটি ব্যবহার করা কখন উপযুক্ত নয়?


124

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


1
সম্পর্কিত (সম্ভবত নকল করতে) - stackoverflow.com/questions/2407540/...
Steve314

3
গোল্ডেন হামার অ্যান্টি-প্যাটার্নটির মতো কিছুটা মনে হচ্ছে। en.wikipedia.org/wiki/Anti-pattern
Cuga

উত্তর:


123

মূলত, নির্ভরতা ইনজেকশন আপনার বস্তুর প্রকৃতি সম্পর্কে কিছু (সাধারণত তবে বৈধ নয়) অনুমান করে ump যদি সেগুলি ভুল হয় তবে ডিআই সবচেয়ে ভাল সমাধান নাও হতে পারে:

  • প্রথমত, মূলত, ডিআই ধরে নেয় যে অবজেক্ট বাস্তবায়নের আঁটসাঁটো মিলন সবসময় খারাপ । এটি নির্ভরতা বিপরীতমুখী নীতির মূলমন্ত্র: "নির্ভরতা কখনই সংক্ষিপ্ততার উপর নির্ভর করা উচিত নয়; কেবল বিমূর্তির উপর" upon

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

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

  • দ্বিতীয়, এবং মূলত , ডিআই ধরে নেয় যে নির্ভরশীল শ্রেণি নির্ভরতা তৈরির জন্য ভাল জায়গা কখনও নয় । এটি একক দায়িত্বের নীতিতে যায়; যদি আপনার এমন কোড থাকে যা একটি নির্ভরতা তৈরি করে এবং এটি ব্যবহার করে, তবে এসআরপি লঙ্ঘন করে নির্ভরশীল শ্রেণিকে (ব্যবহার বা প্রয়োগের পরিবর্তন) পরিবর্তন করতে পারে এমন দুটি কারণ রয়েছে।

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

  • শেষ অবধি, ডিআই প্রকৃতি অনুসারে সমস্ত নির্ভরতা এবং তাদের বাস্তবায়নের জ্ঞানকে কেন্দ্রিক করে তোলে । এটি ইনজেকশন সঞ্চালনকারী অ্যাসেমব্লিকে অবশ্যই রেফারেন্সের সংখ্যা বাড়িয়ে তুলবে এবং বেশিরভাগ ক্ষেত্রে প্রকৃত নির্ভরশীল শ্রেণির সমাবেশগুলির দ্বারা প্রয়োজনীয় রেফারেন্সের সংখ্যা হ্রাস করে না।

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

    এটি সাধারণত নীচের কোড থেকে নীচে থেকে উল্লেখগুলি সরিয়ে দেয় না; একটি নির্ভরশীলকে অবশ্যই তার নির্ভরতার জন্য ইন্টারফেস সম্বলিত গ্রন্থাগারটি অবশ্যই উল্লেখ করতে হবে, যা তিনটি স্থানে রয়েছে:

    • সমস্তই একটি একক "ইন্টারফেস" সমাবেশে যা খুব প্রয়োগকেন্দ্রিক হয়ে যায়,
    • প্রাথমিক বাস্তবায়ন (গুলি) এর পাশাপাশি প্রত্যেকে নির্ভরতা পরিবর্তিত হলে নির্ভরশীলদের পুনরায় কম্পাইল না করার সুবিধা সরিয়ে দেয়, বা
    • একচেটিয়া সংশ্লেষগুলিতে এক বা দু'টি পঠন যা সমাবেশ সমাবেশ গণনা করে, নাটকীয়ভাবে "পূর্ণ বিল্ড" বার বৃদ্ধি করে এবং প্রয়োগের কার্যকারিতা হ্রাস করে।

    এই সবগুলি আবার এমন জায়গাগুলিতে কোনও সমস্যা সমাধানের জন্য যেখানে কোনওটিই নাও থাকতে পারে।


1
আরআরপি = একক দায়িত্ব নীতি, অন্য কারও জন্য ভাবছি।
থিওডোর মুরডক

1
হ্যাঁ, এবং এলএসপি হ'ল লিসকোভ সাবস্টিটিউশন নীতি; এ এর উপর নির্ভরশীলতার ভিত্তিতে নির্ভরতা বি এর দ্বারা পূরণ করা উচিত যা অন্য কোনও পরিবর্তন ছাড়াই এ থেকে প্রাপ্ত।
কিথস

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

আরেকটি অনুমান "" যদি নির্ভরতা বদল হয় তবে এটি সর্বত্র পরিবর্তিত হবে "? অন্যথায় আপনাকে যেভাবেই হোক না কেন সমস্ত গ্রাহক শ্রেণীর দিকে নজর দিতে হবে
রিচার্ড টিংল

3
এই উত্তরটি হার্ডকোডিংয়ের বিপরীতে ইনজেকশন নির্ভরতার টেস্টযোগ্যতার প্রভাবকে মোকাবেলা করতে ব্যর্থ। সুস্পষ্ট নির্ভরশীলতা সূত্রও দেখুন ( deviq.com/explic-d depend depend
pr

30

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

আপনি A এবং B এর মধ্যে সংযোগ সামান্য হ্রাস করেছেন, কিন্তু A এর এনক্যাপসুলেশন হ্রাস করেছেন এবং A এবং যে কোনও শ্রেণির মধ্যে A এর উদাহরণ তৈরি করতে হবে এমন সংযোগকে আরও বাড়িয়েছেন, পাশাপাশি এ এর ​​নির্ভরতার সাথে সংযুক্ত করে।

সুতরাং নির্ভরতা ইনজেকশন (ফ্রেমওয়ার্ক ছাড়াই) প্রায় সমান ক্ষতিকারক যেমন এটি সহায়ক।

অতিরিক্ত ব্যয় প্রায়শই সহজেই ন্যায়সঙ্গত হয়, তবে: ক্লায়েন্ট কোড যদি অবজেক্টের নিজের তুলনায় নির্ভরতা কীভাবে তৈরি করতে হয় তা আরও জানতে পারে, তবে নির্ভরতা ইনজেকশন সত্যই মিলনকে কমিয়ে দেয়; উদাহরণস্বরূপ, কোনও স্ক্যানার কীভাবে ইনপুটটি পার্স করতে কোনও ইনপুট স্ট্রিম অর্জন করতে বা নির্মাণ করতে যায় না, বা ক্লায়েন্ট কোডটি কোন উত্স থেকে ইনপুট পার্স করতে চায় তাই কোনও ইনপুট স্ট্রিমের কনস্ট্রাক্টর ইনজেকশনই সুস্পষ্ট সমাধান।

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

এটি সহায়ক হতে পারে তবে প্রতিটি নির্ভরতার জন্য আপনাকে অবশ্যই নিজেকে জিজ্ঞাসা করা উচিত, পরীক্ষার সুবিধাটি কি মূল্য হিসাবে মূল্যবান এবং আমি কি পরীক্ষার সময় এই নির্ভরতাটিকে সত্যই উপহাস করতে চাই?

যখন নির্ভরতা-ইনজেকশন কাঠামো যুক্ত করা হয়, এবং নির্ভরতা তৈরির বিষয়টি ক্লায়েন্ট কোডগুলিতে নয় বরং পরিবর্তিত ফ্রেমওয়ার্কে অর্পিত হয়, তখন ব্যয় / উপকার বিশ্লেষণ ব্যাপকভাবে পরিবর্তিত হয়।

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

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

যদিও আমার ব্যক্তিগতভাবে ডিআই ফ্রেমওয়ার্কগুলির সাথে প্রচুর অভিজ্ঞতা নেই তবে আমার ধারণাটি হ'ল তারা ব্যয়ের চেয়ে আরও বেশি সুবিধা প্রদান করে যখন আপনার প্রয়োজনীয় ডেটা বা পরিষেবাটির সঠিক সরবরাহকারীর সন্ধানের মাথা ব্যথা মাথা ব্যথার চেয়ে বেশি হয়, যখন কোনও কিছু ব্যর্থ হয়, তাৎক্ষণিকভাবে স্থানীয়ভাবে না জানা কী কোডটি আপনার কোডটিতে পরবর্তীকালে ব্যর্থতার কারণ হিসাবে খারাপ ডেটা সরবরাহ করেছিল provided

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


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

6
আপনি ভুল বুঝেছেন, আপনি যখন কোন বিদ্রূপটি ইনজেক্ট করেন তখন আমি সেই বিষয়ে কথা বলছি না, আমি আসল কোডটি নিয়ে কথা বলছি। ডি নির্ভরতা বি এর সাথে ক ক্লাসটি বিবেচনা করুন, যার পরিবর্তে ডি নির্ভরতা সি রয়েছে, যার পরিবর্তে ডি রয়েছে। ডিআই ছাড়াই, এ বি বি তৈরি করে, বি সি গঠন করে, ডি নির্মাণ করে ইঞ্জেকশন দিয়ে, এ তৈরি করতে আপনাকে প্রথমে বি তৈরি করতে হবে, বি নির্মাণের জন্য আপনাকে অবশ্যই প্রথমে সি নির্মাণ করতে হবে, এবং সি নির্মাণের জন্য আপনাকে অবশ্যই প্রথমে ডি নির্মাণ করতে হবে class সুতরাং ক্লাস এ-তে এখন ডি সম্পর্কে জানতে হবে, নির্ভরতার নির্ভরতার নির্ভরতা, বি নির্মাণের জন্য, এটি অতিরিক্ত সংযোগের দিকে পরিচালিত করে।
থিওডোর মুরডক

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

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

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

11
  1. যদি আপনি ডাটাবেস সত্তা তৈরি করে থাকেন তবে আপনার কিছু ফ্যাক্টরি ক্লাস থাকা উচিত যা আপনি আপনার নিয়ামকের পরিবর্তে ইনজেক্ট করবেন,

  2. আপনার যদি চিড়ির মতো বা আকাঙ্ক্ষার মতো আদিম বস্তু তৈরি করতে হয়। এছাড়াও আপনার বেশিরভাগ স্ট্যান্ডার্ড লাইব্রেরি অবজেক্টস যেমন খেজুর, গাইড ইত্যাদি তৈরি করতে হবে hand

  3. আপনি যদি কনফিগারেশন স্ট্রিংগুলি ইনজেক্ট করতে চান তবে কিছু কনফিগারেশন অবজেক্টগুলি ইনজেক্ট করা সম্ভবত ভাল ধারণা (সাধারণভাবে এটি সাধারণ ধরণের অর্থবহ অবজেক্টগুলিতে আবৃত করার প্রস্তাব দেওয়া হয়: int তাপমাত্রাআইসেলসিয়াস ডিজিরিস -> সেলসিয়াস ডিগ্রি তাপমাত্রা)

এবং সার্ভিস লোকেটারকে নির্ভরতা ইনজেকশন বিকল্প হিসাবে ব্যবহার করবেন না, এটি নিদর্শন বিরোধী, আরও তথ্য: http://blog.ploeh.dk/2010/02/03/SSLLocatorIsAntiPattern.aspx


সমস্ত পয়েন্টগুলি সম্পূর্ণরূপে এটি ব্যবহার না করে বরং ইনজেকশনের বিভিন্ন ফর্ম ব্যবহার সম্পর্কে। লিঙ্কের জন্য যদিও +1।
জানু হুডেক

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

1
@ কলিন, বিপরীতে, সার্ভিস লোকেটারটি অবশ্যই একটি বিরোধী নিদর্শন এবং এখানে সংক্ষেপে এটিই কারণ
কাইরলেসা

@ কেরলেসা - আপনি বুঝতে পেরেছেন যে ডিআই ফ্রেমওয়ার্কগুলি পরিষেবা অনুসন্ধানের জন্য অভ্যন্তরীণভাবে কোনও সার্ভিস লোকেটার প্যাটার্ন ব্যবহার করে, তাই না? এমন পরিস্থিতি রয়েছে যেখানে উভয়ই উপযুক্ত, এবং স্ট্যাক এক্সচেঞ্জ কিছু লোককে ঘৃণা করতে চাইলেও ঘৃণা সত্ত্বেও একটি বিরোধী নিদর্শন নয়।
কলিন

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

8

আপনি যখন নিজের প্রকল্পটি রক্ষণাবেক্ষণযোগ্য এবং পরীক্ষামূলক করে তৈরি করার মাধ্যমে কিছু অর্জন করতে দাঁড়ান না।

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

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

সব মিলিয়ে যে কোনও পদ্ধতি বা প্যাটার্নের জন্য ব্যবহারিক দৃষ্টিভঙ্গি গ্রহণ করা বুদ্ধিমানের কারণ 100% সময়ের কিছুই কিছুই প্রযোজ্য নয়।

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


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

@ রিচার্ডটিঙ্গল আমি বলব যে আপনার লগিংয়ের মোড়কে একটি ইন্টারফেস হিসাবে সংজ্ঞায়িত করা উচিত এবং তারপরে আপনি প্রতিটি বহিরাগত লগিং পরিষেবার জন্য সেই ইন্টারফেসটির একটি হালকা বাস্তবায়ন লিখুন, একক লগিং ক্লাস ব্যবহার না করে যা একাধিক বিমূর্তি আবৃত করে। এটি একই ধারণা যা আপনি প্রস্তাব করছেন কিন্তু ভিন্ন স্তরে বিমূর্ত।
এড জেমস

1

অন্য উত্তরগুলি প্রযুক্তিগত দিকগুলিতে ফোকাস করার সময় আমি একটি ব্যবহারিক মাত্রা যুক্ত করতে চাই।

বছরের পর বছর ধরে আমি এই সিদ্ধান্তে পৌঁছেছি যে ডিপেন্ডেন্সি ইনজেকশনটি সাফল্য অর্জন করতে হলে প্রচুর ব্যবহারিক প্রয়োজনীয়তা পূরণ করা দরকার।

  1. এটি চালু করার কোনও কারণ থাকতে হবে।

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

  2. দলটিকে প্রশিক্ষিত ও বোর্ডে চালানো দরকার।

    টিমের সিংহভাগ বোর্ডে না থাকলে এবং ডিআই-কে বোঝে না যদি না কন্ট্রোল কনটেন্টের বিপরীতটি জিনিসগুলি করার আরও একটি উপায় হয়ে যায় এবং কোড বেসটিকে আরও জটিল করে তোলে।

    যদি ডিআই টি দলের নতুন সদস্য দ্বারা প্রবর্তন করা হয়, কারণ তারা এটি বুঝতে পারে এবং এটি পছন্দ করে এবং কেবল তারা ভাল হয় তা দেখাতে চায় এবং টিম সক্রিয়ভাবে জড়িত না, এমন একটি সত্য ঝুঁকি রয়েছে যে এটি আসলে গুণগতমান হ্রাস পাবে কোড.

  3. আপনার পরীক্ষা করা দরকার

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


1

এটি সম্পূর্ণ উত্তর নয়, তবে অন্য একটি বিষয়।

আপনার যখন একবার অ্যাপ্লিকেশন শুরু হয়, এটি দীর্ঘ সময় ধরে চলে (ওয়েব অ্যাপের মতো) ডিআই ভাল হতে পারে।

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


আমি ডিআই সম্পর্কিত আবেদনের লাইভ সময়টি দেখতে পাচ্ছি না
মাইকেল ফ্রেইজিম

@ মিশেলফ্রিজেম প্রসঙ্গটি সূচনা করতে সময় লাগে, সাধারণত ডিআই কনটেইনারগুলি স্প্রিংয়ের মতো বেশ ভারী হয়। মাত্র একটি শ্রেণীর সাথে একটি হ্যালো ওয়ার্ল্ড অ্যাপ্লিকেশন তৈরি করুন এবং স্প্রিংয়ের সাথে একটি করুন এবং উভয়ই 10 বার শুরু করুন এবং আপনি কী বোঝাতে চাইছেন তা আপনি দেখতে পাবেন।
Koray Tugay

এটি পৃথক ডিআই কনটেইনারের মতো সমস্যার মতো শোনায়। । নেট ওয়ার্ল্ডে আমি ডিআই কনটেইনারগুলির জন্য অত্যাবশ্যকীয় সমস্যা হিসাবে আরম্ভের সময় সম্পর্কে শুনিনি
মাইকেল ফ্রেইজিম

1

বেসিক ওওপি নীতিগুলি ব্যবহার করার চেষ্টা করুন: সাধারণ কার্যকারিতা, এনক্যাপসুলেট (লুকান) জিনিসগুলি বের করার জন্য উত্তরাধিকার ব্যবহার করুন , যা ব্যক্তিগত / অভ্যন্তরীণ / সুরক্ষিত সদস্য / প্রকারগুলি ব্যবহার করে বাইরের বিশ্ব থেকে রক্ষা করা উচিত। কেবল পরীক্ষার জন্য কোড ইনজেক্ট করার জন্য যে কোনও শক্তিশালী পরীক্ষা-কাঠামো ব্যবহার করুন, উদাহরণস্বরূপ https://www.typemock.com/ বা https://www.telerik.com/products/mocking.aspx

তারপরে এটি ডিআই দিয়ে পুনরায় লেখার চেষ্টা করুন এবং কোডটির সাথে তুলনা করুন, যা আপনি সাধারণত ডিআই এর সাথে দেখতে পাবেন:

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

আমি যা দেখেছি তা থেকে বলব, প্রায় সবসময়ই ডিআই দিয়ে কোডের মান হ্রাস হচ্ছে।

তবে, আপনি যদি ক্লাস ঘোষণায় কেবল "পাবলিক" অ্যাক্সেস মডিফায়ার ব্যবহার করেন, এবং / বা সদস্যদের জন্য পাবলিক / প্রাইভেট মডিফায়ার ব্যবহার করেন, এবং / অথবা আপনার কাছে ব্যয়বহুল পরীক্ষার সরঞ্জাম কেনার বিকল্প নেই এবং একই সাথে আপনার ইউনিট পরীক্ষার প্রয়োজন যা ' ইন্টিগ্রেশনাল টেস্টিং দ্বারা প্রতিস্থাপন করা হবে না, এবং / অথবা আপনি যে ক্লাসে ইনজেকশন দেওয়ার কথা ভাবছেন তার জন্য ইতিমধ্যে আপনার ইন্টারফেস রয়েছে, ডিআই ভাল পছন্দ!

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


0

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

যখন উত্তরাধিকার কোড refactoring , এটা প্রায়ই নির্ভরতা ইনজেকশন চেয়ে পরিষেবা লোকেটার থেকে refactor করা সহজ। আপনি যা করেন তা হ'ল সার্ভিস লুকআপের সাথে ইনস্ট্যান্টেশনগুলি প্রতিস্থাপন করা হয় এবং তারপরে আপনার ইউনিট পরীক্ষায় পরিষেবাটি জাল করে ফেলা হয়।

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

টিএলডিআর : যদি আপনার শ্রেণীর স্থিতিশীল নির্ভরতা থাকে বা আপনি লিগ্যাসি কোডটি রিফ্যাক্ট করছেন তবে কোনও সার্ভিস লোকেটার ডিআই এর চেয়ে তর্কযোগ্যভাবে ভাল।


12
পরিষেবা লোকেটার আপনার কোডে নির্ভরতা লুকায় । এটি ব্যবহার করা ভাল প্যাটার্ন নয়।
কিরেলেসা

যখন এটি স্থিতিশীল নির্ভরতার কথা আসে, আমি বরং তাদের সম্মুখের দিকে ইন্টারপেস প্রয়োগকারীদের মুখ থুবড়ে দেখি। এগুলি তখন নির্ভরতা ইনজেকশন হতে পারে এবং এগুলি আপনার জন্য স্ট্যাটিক গ্রেনেডে পড়ে।
এরিক ডায়েট্রিচ

@ ক্যারলেসা আমি সম্মত, একটি সার্ভিস লোকেটারের অনেকগুলি ডাউনসাইড রয়েছে এবং ডিআই প্রায় সবসময়ই পছন্দনীয়। তবে আমি বিশ্বাস করি যে সমস্ত প্রোগ্রামিং নীতিমালা অনুসারে নিয়মে কিছু ব্যতিক্রম রয়েছে ceptions
গ্যারেট হল

পরিষেবার অবস্থানের প্রধান স্বীকৃত ব্যবহার কৌশল কৌশল হিসাবে রয়েছে, যেখানে একটি "কৌশল বাছাইকারী" শ্রেণিকে ব্যবহারের কৌশলটি খুঁজে পাওয়ার জন্য যথেষ্ট যুক্তি দেওয়া হয়, এবং হয় এটির পিছনে হাত দেয় বা এটির মাধ্যমে একটি কল দেয়। এমনকি এই ক্ষেত্রেও, কৌশল চয়নকারী কোনও আইওসি ধারক দ্বারা সরবরাহ করা ফ্যাক্টরি পদ্ধতির মুখোমুখি হতে পারে, যা একই যুক্তি দেওয়া হয়; আপনি এটি ভেঙে ফেলার কারণ হ'ল যুক্তিটি যেখানে এটি সম্পর্কিত যেখানে এটি সবচেয়ে লুকানো নয় hidden
কিথস

মার্টিন ফাউলারের উদ্ধৃতি দিতে, "ব্যবহার থেকে কনফিগারেশন পৃথক করার নীতির চেয়ে" (ডিআই এবং পরিষেবা লোকেটার) এর মধ্যে পছন্দ কম গুরুত্বপূর্ণ "। ডিআই সবসময়ই ভাল এই ধারণা হোগওয়াশ। যদি কোনও পরিষেবা বিশ্বব্যাপী ব্যবহৃত হয়, তবে এটি ডিআই ব্যবহার করা আরও জটিল এবং ভঙ্গুর। অতিরিক্তভাবে, ডিআই প্লাগইন আর্কিটেকচারের জন্য কম অনুকূল যেখানে রানটাইম পর্যন্ত বাস্তবায়নগুলি জানা যায় না। সবসময় ডিবাগ.উরাইটলাইন () এবং এর মতো অতিরিক্ত যুক্তিগুলি প্রদান করা কতটা বিশ্রী হবে তা ভাবুন!
কলিন 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.