মজকিং প্রোডাকশন কোডে হ্যান্ডলিংয়ের পরিচয় দেয়


15

একটি IReader ইন্টারফেস, IReader ইন্টারফেস রিডার বাস্তবায়ন একটি বাস্তবায়ন এবং পাঠক থেকে ডেটা গ্রহণ এবং প্রক্রিয়া করে এমন একটি শ্রেণি রিডারকনসুমার হিসাবে ধরে নিচ্ছি।

public interface IReader
{
     object Read()
}

বাস্তবায়ন

public class ReaderImplementation
{
    ...
    public object Read()
    {
        ...
    }
}

উপভোক্তা:

public class ReaderConsumer()
{
    public string location

    // constructor
    public ReaderConsumer()
    {
        ...
    }

    // read some data
    public object ReadData()
    {
        IReader reader = new ReaderImplementation(this.location)
        data = reader.Read()
        ...
        return processedData    
    }
}

রিডার কনসুমার এবং প্রক্রিয়াজাতকরণ পরীক্ষার জন্য আমি আইআরএডার ব্যবহার করি। সুতরাং রিডার কনসুমার হয়ে ওঠে:

public class ReaderConsumer()
{
    private IReader reader = null

    public string location

    // constructor
    public ReaderConsumer()
    {
        ...
    }

    // mock constructor
    public ReaderConsumer(IReader reader)
    {
        this.reader = reader
    }

    // read some data
    public object ReadData()
    {
        try
        {
            if(this.reader == null)
            {
                 this.reader = new ReaderImplementation(this.location)
            }

            data = reader.Read()
            ...
            return processedData    
        }
        finally
        {
            this.reader = null
        }
    }
}

এই সমাধানটিতে মশকরা প্রডাকশন কোডের জন্য একটি আইফোন প্রবর্তন করে কারণ কেবল বিদ্রূপকারী কনস্ট্রাক্টর ইন্টারফেসের একটি উদাহরণ সরবরাহ করে।

এটি লেখার সময় আমি বুঝতে পারি যে চেষ্টা করার পরে অবরুদ্ধ অবরোধটি কিছুটা সম্পর্কিত নয় কারণ এটি অ্যাপলিকেশন চলাকালীন সময়ে ব্যবহারকারীর অবস্থান পরিবর্তন করার ক্ষেত্রে ব্যবহারকারীকে পরিচালনা করতে পারে।

সামগ্রিকভাবে এটি দুর্গন্ধযুক্ত মনে হয়, কীভাবে এটি আরও ভালভাবে পরিচালনা করা যায়?


16
সাধারণত, এটি কোনও সমস্যা নয় কারণ ইনজেকশনের উপর নির্ভরশীলতা সহ নির্মাণকারী কেবল একমাত্র নির্মাণকারী হবে। এটি ReaderConsumerস্বাধীন করতে প্রশ্ন থেকে বাইরে ReaderImplementation?
ক্রিস ওহলার্ট 10

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

3
হ্যাঁ । এটি টিডিডির মূল বিষয় : পরীক্ষাগুলি লিখতে প্রথমে আরও ডিউপলড ডিজাইন বোঝায় (অন্যথায় আপনি ইউনিট পরীক্ষা লিখতে সক্ষম নন ...)। এটি কোডটিকে আরও রক্ষণাবেক্ষণযোগ্য এবং এক্সটেনসিবল করতে সহায়তা করে।
বাকুরিউ

ডিপেন্ডেন্সি ইনজেকশন দিয়ে সমাধান করা যায় এমন গন্ধ সনাক্ত করার একটি ভাল উপায়, 'নতুন' কীওয়ার্ডটি সন্ধান করছে। আপনার নির্ভরতা নতুন করবেন না। পরিবর্তে সেগুলি ইনজেকশন করুন।
চিরকাল 21

উত্তর:


67

আপনার পদ্ধতি থেকে পাঠককে আরম্ভ করার পরিবর্তে এই লাইনটি সরান

{
    this.reader = new ReaderImplementation(this.location)
}

ডিফল্ট প্যারামিটারলেস কনস্ট্রাক্টরে nto

public ReaderConsumer()
{
    this.reader = new ReaderImplementation(this.location)
}

public ReaderConsumer(IReader reader)
{
    this.reader = reader
}

একটি "উপহাস কন্সট্রাকটর" যেমন জিনিস আছে, যদি আপনার বর্গ নির্ভরশীলতার যে এটা আছে প্রয়োজন কাজ করার জন্য, তারপর কন্সট্রাকটর পারেন ঐ জিনিসটা প্রদান করা উচিত, অথবা এটি তৈরি করুন।


3
স্কোর ++ ... একটি ডিআই স্ট্যান্ডপয়েন্ট ব্যতীত, সেই ডিফল্ট কনস্ট্রাক্টর অবশ্যই কোডের গন্ধ।
ম্যাথিউ গাইন্ডন

3
@ ম্যাটস'মগ একটি ডিফল্ট বাস্তবায়নে কোনও ভুল নেই। কর্টর শৃঙ্খলার অভাব এখানে গন্ধ। =;) -
রাবারডাক

ওহ, হ্যাঁ আছে - আপনার কাছে বইটি না থাকলে এই নিবন্ধটি জারজির ইনজেকশনটি অ্যান্টি-প্যাটার্নটি বেশ ভালভাবে বর্ণনা করেছে (কেবল স্কিমেড)।
ম্যাথিউ গুইনন

3
@ ম্যাটসমগ: আপনি ডিআই এর ব্যাখ্যা গোপনীয়ভাবে দিচ্ছেন। আপনার যদি ডিফল্ট কনস্ট্রাক্টর ইনজেক্ট করার প্রয়োজন না হয় তবে আপনি করবেন না।
রবার্ট হার্ভে

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

54

আপনার কেবলমাত্র একক নির্মাণকারী প্রয়োজন:

public class ReaderConsumer()
{
    private IReader reader = null

    public string location

    // constructor
    public ReaderConsumer(IReader reader)
    {
        this.reader = reader;
    }

আপনার উত্পাদন কোডে:

var rc = new ReaderConsumer(new ReaderImplementation(0));

আপনার পরীক্ষায়:

var rc = new ReaderConsumer(new MockImplementation(0));

13

নির্ভরতা ইনজেকশন এবং নিয়ন্ত্রণের বিপরীত দিকে নজর দিন

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

আপনার উদাহরণটি সহজ, এবং এটির সাথে দ্রুত বিতরণ করা হয়েছে তবে অনিবার্যভাবে আপনি এটি তৈরি করতে যাচ্ছেন এবং আপনি টন কনস্ট্রাক্টর বা প্রারম্ভিক রুটিনের সাথে শেষ করবেন:

var foo = নতুন ফু (নতুন বার (নতুন বাজ (), নতুন কোজ ()), নতুন ফু 2 ());

ডিআই / আইওসি দিয়ে আপনি একটি লাইব্রেরি ব্যবহার করেন যা আপনাকে বাস্তবায়নের সাথে ইন্টারফেসের সাথে ম্যাচ করার নিয়মগুলি বানান করতে দেয় এবং তারপরে আপনি কেবল "আমাকে একটি ফু দিন" বলুন এবং এটি কীভাবে সমস্ত তারে ওয়্যার করা যায় তা কার্যকর করে।

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

শুরু করা সহজ একটি হ'ল:

http://www.ninject.org/

অন্বেষণের জন্য এখানে একটি তালিকা রয়েছে:

http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx


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

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

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

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