নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কের জন্য যুক্তিগুলির একটিতে প্রশ্ন করা: কেন একটি বস্তু গ্রাফ তৈরি করা শক্ত?


13

গুগল গুইসের মতো নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কগুলি তাদের ব্যবহারের ( উত্স ) জন্য নিম্নলিখিত অনুপ্রেরণা দেয় :

একটি অবজেক্ট তৈরি করতে, আপনি প্রথমে এর নির্ভরতা তৈরি করুন। তবে প্রতিটি নির্ভরতা তৈরি করতে আপনার এর নির্ভরতা ইত্যাদি প্রয়োজন। সুতরাং আপনি যখন একটি অবজেক্ট তৈরি করেন, আপনার সত্যিকার অর্থে কোনও অবজেক্ট গ্রাফ তৈরি করা দরকার।

হাতে বস্তুর গ্রাফগুলি তৈরি করা শ্রম নিবিড় (...) এবং পরীক্ষাটি কঠিন করে তোলে।

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

class BillingService
{
    private final CreditCardProcessor processor;
    private final TransactionLog transactionLog;

    // constructor for tests, taking all collaborators as parameters
    BillingService(CreditCardProcessor processor, TransactionLog transactionLog)
    {
        this.processor = processor;
        this.transactionLog = transactionLog;
    }

    // constructor for production, calling the (productive) constructors of the collaborators
    public BillingService()
    {
        this(new PaypalCreditCardProcessor(), new DatabaseTransactionLog());
    }

    public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard)
    {
        ...
    }
}

সুতরাং নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কগুলির জন্য অন্যান্য যুক্তি থাকতে পারে ( যা এই প্রশ্নের অবকাশের বাইরে)! তবে পরীক্ষামূলক অবজেক্টের গ্রাফগুলির সহজ সৃষ্টি তাদের মধ্যে একটি নয়, তাই না?


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

নোট করুন যে আমি নির্ভরতা ইনজেকশনের অন্যান্য সুবিধাগুলি খুঁজছি না - আমি কেবল "যুক্তি ইনজেকশন ছাড়াই অবজেক্ট ইনস্ট্যান্টেশন কঠিন" এই যুক্তিটি বুঝতে আগ্রহী
ওবারলিস

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

@ ইজকাটা না, এটি আকারের বিষয় নয়। বর্ণিত পদ্ধতির সাথে, সেই পোস্ট থেকে কোডটি কেবল হবে new ShippingService()
ওবরিলিস

এখনও তারপরে আপনাকে একটি স্থানের পরিবর্তে সেই শিপিং
সার্ভিস-এর

উত্তর:


12

নির্ভরতা ইনজেকশন করার সর্বোত্তম উপায় সম্পর্কে একটি পুরানো, পুরানো চলমান বিতর্ক রয়েছে।

  • বসন্তের আসল কাটটি একটি সরল বস্তু ইনস্ট্যান্টিয়েটেড করে এবং তারপরে সেটার পদ্ধতিগুলির পরে নির্ভরতা ইনজেকশন করে।

  • কিন্তু তারপরে লোকেরা একটি বৃহত আকস্মিকতা জোর দিয়েছিল যে কনস্ট্রাক্টর প্যারামিটারগুলির মাধ্যমে ইনজেকশন নির্ভরতা হ'ল এটি করার সঠিক উপায়।

  • তারপরে, ইদানীং, প্রতিবিম্বটি ব্যবহার করা আরও সাধারণ হয়ে উঠলে বেসরকারী সদস্যদের মান নির্ধারণ, সেটটার বা কনস্ট্রাক্টর আরগস ছাড়াই রাগ হয়ে যায়।

সুতরাং আপনার প্রথম নির্মাতা নির্ভরতা ইনজেকশনের দ্বিতীয় পদ্ধতির সাথে সামঞ্জস্যপূর্ণ। এটি আপনাকে পরীক্ষার জন্য মজ ইনজেক্টের মতো দুর্দান্ত জিনিসগুলি করতে দেয়।

তবে নো-আর্গুমেন্ট কনস্ট্রাক্টরের এই সমস্যা রয়েছে। যেহেতু এটি বাস্তবায়ন ক্লাসগুলির জন্য ইনস্ট্যান্ট করছে PaypalCreditCardProcessorএবং DatabaseTransactionLog, এটি পেপাল এবং ডেটাবেসগুলিতে একটি কঠিন, সংকলন-সময় নির্ভরতা তৈরি করে। সম্পূর্ণ নির্ভরশীলতা গাছটি সঠিকভাবে তৈরি এবং কনফিগার করার জন্য এটি দায়িত্ব গ্রহণ করে।

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

  • নির্ভরতা গাছের সেই সমস্ত আইটেম স্বচ্ছ হবে তবে তাদের অনেকগুলি তাত্ক্ষণিক হওয়া দরকার to মতভেদগুলি হল, আপনি কেবলমাত্র একটি ইনস্ট্যান্ট করতে সক্ষম হবেন না PaypalCreditCardProcessor

  • ইনস্ট্যান্টেশন ছাড়াও, প্রতিটি বস্তুর জন্য কনফিগারেশন থেকে প্রয়োগ হওয়া বৈশিষ্ট্যের প্রয়োজন হবে।

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

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

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

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

...

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

এটি উদ্বেগের বিচ্ছেদকে সরবরাহ করে যাতে আমার ক্লাসটি কেবল এটিই করতে পারে এবং কারখানা শ্রেণি স্টাফ তৈরি এবং কনফিগার করার দায়িত্ব গ্রহণ করে।

প্রয়োজনীয় পদ্ধতির নয়, তবে এফডাব্লুআইডাব্লু

...

আরও সাধারণভাবে, ডিআই / ইন্টারফেস প্যাটার্ন দুটি কোড করে আপনার কোডের জটিলতা হ্রাস করে:

  • ইন্টারফেসে ডাউনস্ট্রিম নির্ভরতা বিমূর্ত করা

  • আপনার কোডের বাইরে এবং কোনও ধরণের ধারককে "উত্তোলন" প্রবাহের নির্ভরতা

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


কোডটি এই সমস্ত কিছু তৈরির দায়িত্ব গ্রহণ করবে - একটি ক্লাস কেবল তার সহযোগী বাস্তবায়ন কী তা জানার দায়িত্ব নেয়। এই সহযোগীদের পরিবর্তে কী প্রয়োজন তা জানার দরকার নেই। সুতরাং এটি এত কিছু নয়।
ওবলিস

1
তবে যদি পেপালপ্রসেসর কনস্ট্রাক্টরের 2 টি যুক্তি থাকে তবে সেগুলি কোথা থেকে আসবে?
রব

এটা হয় না। বিলিংস সার্ভারের মতো পেপ্যালপ্রসেসরের একটি শূন্য-আরোগ্য কনস্ট্রাক্টর রয়েছে যা এটি নিজের প্রয়োজন মতো সহযোগী তৈরি করে।
ওবলিস

ইন্টারফেসে ডাউনস্ট্রিম নির্ভরতা বিমূর্ত করা - উদাহরণ কোড এটিও করে। প্রসেসরের ক্ষেত্রটি ক্রেডিটকার্ড প্রসেসর প্রকারের, এবং প্রয়োগের ধরণের নয়।
ওবলিস

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

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

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

ডিআই ফ্রেমওয়ার্কগুলি আপনাকে রানটাইম সময়ে একগুচ্ছ উপাদান নিতে এবং সেগুলি তারের জন্য অনুমতি দেয়। এটি একে অপরের প্রয়োগের পরিবর্তে একে অপরের ইন্টারফেসে কাজ করে এমন অনেকগুলি মডিউল নিয়ে গঠিত সিস্টেমটিকে "মডিউলার" করে তোলে।


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

1
আমার ধারণা যদি আপনি প্রশ্নটি " একটি অবজেক্ট গ্রাফ তৈরি করতে ..." করতে কম করেন তবে তা সোজা। আমার বক্তব্যটি হ'ল ডিআই এই সমস্যাটিকে সম্বোধন করে যে আপনি কখনই কেবল একটি বস্তুর গ্রাফ নিয়ে ডিল করেন না ; আপনি তাদের একটি পরিবারের সাথে ডিল।
ববডালগাইশ

প্রকৃতপক্ষে, কেবলমাত্র একটি অবজেক্ট গ্রাফ তৈরি করা ইতিমধ্যে জটিল হতে পারে যদি সহযোগীরা ভাগ করে নেওয়া হয়
ওবরলিস

4

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

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


1
গ্রাফ তত্ত্ব অর্থে নির্ভরতা গাছ অবশ্যই একটি গাছ হতে হবে । অন্যথায় আপনি একটি চক্র পেয়েছেন, যা কেবল অসন্তুষ্টিজনক।
জিয়ান

1
@ Xion নির্ভরতা গ্রাফ অবশ্যই একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ হতে হবে। গাছের মতো দুটি নোডের মধ্যে ঠিক এক পথের প্রয়োজন নেই।
ওবলিস

@ জিয়ন: অগত্যা নয়। একটিতে UnitOfWorkএকক DbContextএবং একাধিক সংগ্রহস্থল রয়েছে তা বিবেচনা করুন। এই সমস্ত সংগ্রহস্থলের একই DbContextঅবজেক্ট ব্যবহার করা উচিত । ওপি'র প্রস্তাবিত "স্ব ইনস্ট্যান্টেশন" দিয়ে এটি করা অসম্ভব হয়ে পড়ে।
ফ্ল্যাটার

1

আমি গুগল গুইস ব্যবহার করিনি, তবে আমি পুরানো উত্তরাধিকার এন-টায়ার অ্যাপ্লিকেশনগুলিতে স্থানান্তরিত করতে অনেক সময় নিয়েছি On

নির্ভরতা ইনজেকশন কেন?

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

কেন আমি দম্পতি সম্পর্কে মোটেও চিন্তা করব?

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

সঠিক পরীক্ষার জন্য আমার কেন নির্ভরতা ইনজেকশন দরকার

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

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

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

ধারণাটি হ'ল আপনি নিশ্চিত করতে চান যে পুরো কার্যকারিতাটি কাজ করছে, যদি না আপনি কোডটির সঠিক অংশটি জানতে চান যা কাজ করছে না।

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


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

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

0

আমি অন্য উত্তরে যেমন উল্লেখ করেছি , এখানে সমস্যাটি হ'ল আপনি চান যে ক্লাসটি এ - এর উত্স কোডে কোন ক্লাসটি ব্যবহৃত হয় তা হার্ড-কোডিং ছাড়াই কিছু শ্রেণিরA উপর নির্ভর করে যা জাভা এবং সি # তে অসম্ভব কারণ শ্রেণি আমদানির একমাত্র উপায় এটি বিশ্বব্যাপী অনন্য নাম দ্বারা উল্লেখ করা হয়।BB

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

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


0

আমি মনে করি এটি এখানে একটি বড় ভুল বোঝাবুঝি।

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

এই নির্মাতা:

BillingService(CreditCardProcessor processor, TransactionLog transactionLog)
{
    this.processor = processor;
    this.transactionLog = transactionLog;
}

ইতিমধ্যে নির্ভরতা ইনজেকশন ব্যবহার করে। আপনি মূলত কেবল বলেছেন যে ডিআই ব্যবহার করা সহজ।

গুইস যে সমস্যার সমাধান করে তা হ'ল সেই কনস্ট্রাক্টরটি ব্যবহার করার জন্য আপনার অবশ্যই এখন কোনও কোথাও একটি অবজেক্ট গ্রাফ কনস্ট্রাক্টর কোড থাকতে হবে , ইতিমধ্যে ইনস্ট্যান্টেটেড অবজেক্টগুলিকে ম্যানুয়ালি সেই কনস্ট্রাক্টরের আর্গুমেন্ট হিসাবে পাস করবে। গুইস আপনাকে এমন একটি জায়গা দেওয়ার অনুমতি দেয় যেখানে আপনি বাস্তবায়ন ক্লাসগুলি CreditCardProcessorএবং TransactionLogইন্টারফেসগুলির সাথে কী মিল করে তা কনফিগার করতে পারেন । সেই কনফিগারেশনের পরে, আপনি যখনই BillingServiceগুয়াস ব্যবহার করে তৈরি করবেন , তখন এই ক্লাসগুলি স্বয়ংক্রিয়ভাবে কনস্ট্রাক্টারে পাস হবে।

নির্ভরতা ইনজেকশন কাঠামো এটিই করে। তবে আপনি যে কনস্ট্রাক্টরটি উপস্থাপন করেছেন তা ইতিমধ্যে ডিপেন্সেন্সি ইনজেকশন নীতির বাস্তবায়ন । আইওসি পাত্রে এবং ডিআই ফ্রেমওয়ার্কগুলি হ'ল संबंधित নীতিগুলি স্বয়ংক্রিয় করে তোলা কিন্তু আপনাকে হাত দিয়ে সবকিছু করতে থামাতে কিছুই নেই, এটি ছিল পুরো বিষয়টি।

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