আইওসি পাত্রে আমাকে বিক্রি করুন, দয়া করে


17

আমি বেশ কয়েকটি দেখেছি কোডে আইওসি পাত্রে ব্যবহার করার পরামর্শ দিই। প্রেরণা সহজ। নিম্নলিখিত নির্ভরতা ইনজেকশন কোড নিন:

class UnitUnderTest
{
    std::auto_ptr<Dependency> d_;
public:
    UnitUnderTest(
        std::auto_ptr<Dependency> d = std::auto_ptr<Dependency>(new ConcreteDependency)
    ) : d_(d)
    {
    }
};


TEST(UnitUnderTest, Example)
{
    std::auto_ptr<Dependency> dep(new MockDependency);
    UnitUnderTest uut(dep);
    //Test here
}

মধ্যে:

class UnitUnderTest
{
    std::auto_ptr<Dependency> d_;
public:
    UnitUnderTest()
    {
        d_.reset(static_cast<Dependency *>(IocContainer::Get("Dependency")));
    }
};


TEST(UnitUnderTest, Example)
{
    UnitUnderTest uut;
    //Test here
}

//Config for IOC container normally
<Dependency>ConcreteDependency</Dependency>

//Config for IOC container for testing
<Dependency>MockDependency</Dependency>

(উপরেরটি অনুমানের সি ++ অবশ্যই উদাহরণ)

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

সুতরাং .. এই ধরণের পাত্রে ব্যবহার করার অন্যান্য সুবিধা আছে বা আমি কেবল পাত্রে সুপারিশকারীদের সাথে একমত নই?


1
নমুনা কোডটি আইওসি বাস্তবায়নের সত্যিকারের খারাপ উদাহরণের মতো দেখাচ্ছে। আমি কেবল সি # এর সাথে পরিচিত তবে অবশ্যই সি ++ তেও কনস্ট্রাক্টর ইনজেকশন এবং প্রোগ্রাম্যাটিকাল কনফিগারেশন করার কোনও উপায় আছে?
rmac

উত্তর:


12

অনেকগুলি স্তর এবং প্রচুর চলন্ত অংশ সহ একটি বৃহত অ্যাপ্লিকেশনটিতে, এটি সুবিধাগুলিগুলির তুলনায় তুলনামূলকভাবে অপ্রতুল দেখানো শুরু করে।

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

বিভিন্ন ধরণের পাত্রেও রয়েছে। এগুলির সবগুলিই কঠোরভাবে টাইপ করা হয় না এবং তাদের সকলেরই কনফিগারেশন ফাইলের প্রয়োজন হয় না।


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

... অবিরত ... যখন প্রোগ্রামটি পরীক্ষা করা হচ্ছে না, প্রতিটি ধাপে ডিফল্ট কংক্রিট নির্ভরতা তাত্ক্ষণিকভাবে পরিণত হয়। অন্যান্য ধরণের পাত্রে লিখেছেন, আপনার কি কিছু উদাহরণ রয়েছে?
বিলি ওনিল

4
টিবিএইচ আমার ডিআই বাস্তবায়নের সাথে প্রচুর অভিজ্ঞতা নেই, তবে। নেট এ এমইএফ দেখুন, যা হতে পারে তবে কঠোরভাবে টাইপ করতে হবে না, কোনও কনফিগার ফাইল নেই, এবং ইন্টারফেসের কংক্রিট বাস্তবায়নগুলি "নিবন্ধিত" রয়েছে ক্লাস নিজেই। বিটিডাব্লু, আপনি যখন বলছেন: "কনস্ট্রাক্টর তাদের তৈরির যত্ন নেয়" - যদি আপনি এটি করছেন (যেমন "দরিদ্র লোকের কনস্ট্রাক্টর ইঞ্জেকশন"), তবে আপনার ধারক লাগবে না। এটি করার ফলে একটি ধারকটির সুবিধা হ'ল কনটেইনারটি সেই সমস্ত নির্ভরতা সম্পর্কে তথ্যকে কেন্দ্র করে।
nlawalker

এই সর্বশেষ মন্তব্যের জন্য +1 - শেষ বাক্যটির উত্তর রয়েছে :)
বিলি ওনিল

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

4

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

আমি বিশ্বাস করি যে গুইসটি জাভা আইওসি কাঠামো যা অবশেষে কনফিগারেশনটি সঠিকভাবে পেয়েছে।


সি ++ এর জন্য কি একই ধরণের উদাহরণ রয়েছে?
বিলি ওনিল

@ বিলি, আমি বলতে সক্ষম হতে সি ++ এর সাথে যথেষ্ট পরিচিত নই।

0

এই মহান এইরকম উত্তর দেন দ্বারা বেন Scheirman C # এর মধ্যে কিছু কোড উদাহরণ বিস্তারিত; আইওসি পাত্রে (ডিআই) থাকার কিছু সুবিধা:

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

1
আমি দেখতে পাচ্ছি না যে কীভাবে সাধারণ কন্সট্রাক্টর ইনজেকশন দিয়ে কোনও জিনিস প্রয়োগ করা যায় না।
বিলি ওনিল

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