নির্ভরতা ইনজেকশন বনাম স্থির পদ্ধতি


21

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

নীচের মতো কিছু কল্পনা করুন যা উদাহরণস্বরূপ উদ্দেশ্যে তৈরি করা হয়েছে

public string GetStringPart(string input)
{ 
   //Some input validation which is removed for clarity

   if(input.Length > 5)
        return input.Substring(0,1);

   if(input.Substring(0,1) == "B")
        return input.Substring(0,3);

   return string.empty;
}

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


1
@ ইভান সাহায্যকারী পদ্ধতিগুলির জন্য যার বিমূর্তকরণের কোনও ব্যবহার নেই। উদাহরণ: অ্যাপাচি ফাইলUtils।
ওয়ালফ্রাট

3
@ ইভান: পার্শ্ব প্রতিক্রিয়া ছাড়াই স্থিত পদ্ধতি হ'ল সর্বোত্তম পদ্ধতি, কারণ এগুলি বোঝার জন্য সহজ এবং পরীক্ষার পক্ষে সহজ।
জ্যাকবিবি

1
তবে এগুলি তাদের উপর নির্ভর করে এমন জিনিসগুলির একক করা অসম্ভব করে তোলে
ইওয়ান

3
@ ইভান এহ, সত্যই নয়। স্ট্যাটিক বলে ম্যাথ.ম্যাক্স () কি খারাপ? যদি আপনি আপনার স্থিতিশীল পদ্ধতিটি পরীক্ষা করে থাকেন এবং এটি কার্যকর হয় তবে আপনি এটি সমস্যা ছাড়াই আপনার অন্যান্য পদ্ধতিতে নিরাপদে ব্যবহার করতে পারেন। স্থিতিশীল যদি ব্যর্থ হয় তবে এর পরীক্ষাটি এটি ধরবে।
টি। সর - মনিকা

1
যদি 'স্ট্যাটিক' গ্যারান্টিযুক্ত কোনও পার্শ্ব প্রতিক্রিয়াগুলি আমি যুক্তি দেখতে সক্ষম হতে পারি। কিন্তু এটা না।
ইওয়ান

উত্তর:


25

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

কোনও নির্ভরতা ছাড়াই ফাংশনগুলি অ্যাবস্ট্রাক্ট করার দরকার নেই, এটি ওভারকিল।

যদি এটি আরও জটিল হয়ে যায় তবে সম্ভবত কোনও কনস্ট্রাক্টর বা পদ্ধতিতে একটি ইন্টারফেসটি পাস করার বিষয়টি নিশ্চিত করা হচ্ছে ted তবে, আমি সেই রাস্তাটিতে যাব না যদি না আমার কাছে GetStringPartঅবস্থানের উপর ভিত্তি করে জটিল যুক্তি না থাকে ইত্যাদি etc.


2
এটা সঠিক উত্তর! খারাপ কার্গো-কাল্ট উত্তর গৃহীত হয়েছে।
জ্যাকবিবি

3
ফাংশনটির কোনও নির্ভরতা নেই যে বিন্দুটি নয়। সমস্যাটি যখন অন্যান্য জিনিস ফাংশনের উপর নির্ভর করে এবং
ইওয়ান

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

1
সাধারণভাবে বলতে গেলে, এই ওয়েব সাইটে নির্ভরতা ইনজেকশন নিয়ে আলোচনা করা লোকেদের নির্ভরতা ইনজেকশনের দরকার নেই। অতএব অপ্রয়োজনীয় জটিলতার দিকে পক্ষপাত।
ফ্র্যাঙ্ক হিলেমান

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

12

কারণটা এখানে

class DOSClient {
    OrderParser orderParser;
    string orderCode;

    DOSClient(OrderParser orderParser, string ordercode) { 
        this.orderParser = orderParser; 
        this.ordercode = ordercode;
    }
    void DisplayOrderCode() {
        Console.Write( "Prefix: " + orderParser.GetStringPart(ordercode) ); 
        ...
    }
}

class GUIClient {
    OrderParser orderParser;
    string orderCode;
    GUI gui;

    GUIClient(OrderParser orderParser, string ordercode, GUI gui) { 
        this.orderParser = orderParser; 
        this.ordercode = ordercode;
        this.gui = gui;
    }

    void DisplayOrderCode() {
        gui.Prefix( orderParser.GetStringPart(ordercode) ); 
        ...
    }
}

 

class OrderParserUS : IOrderParser {

    public string GetStringPart(string input)
    { 
        //Some input validation which is removed for clarity

        if(input.Length > 5)
            return input.Substring(0,1);

        if(input.Substring(0,1) == "B")
            return input.Substring(0,3);

        return string.empty;
    }
}

class OrderParserEU : IOrderParser {

    public string GetStringPart(string input)
    { 
        //Some input validation which is removed for clarity

        if(input.Length > 6)
            return input.Substring(0,1);

        if(input.Substring(0,1) == "#")
            return input.Substring(0,3);

        return string.empty;
    }
}

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

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

যদি এটি আপনার কাছে কিছু না বোঝায় তবে এটির জন্য আসলে কোনও ভাল যুক্তি নেই।

বিটিডাব্লু, GetStringPartএকটি ভয়ঙ্কর নাম।


* বন্ধনী কোড স্টাইলে ক্রিঞ্জ * আমি অনুমান করছি আপনি একটি জাভা প্রোগ্রামার সি # কোড লেখার চেষ্টা করছেন? আমি মনে করি একজনকে জানতে আগ্রহী। :)
নীল

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

পরীক্ষার একটি কারণ তবে আরও রয়েছে। আমি পরীক্ষার জন্য এটিকে দোষ দিতে পছন্দ করি না কারণ এটি কেবল পরীক্ষার সমালোচনা শুরু করে। সাধারণ ঘটনাটি হ'ল প্রক্রিয়াগত প্রোগ্রামাররা এটি পছন্দ করে না যদি আপনি পদ্ধতিগতভাবে প্রোগ্রাম না করেন।
candied_orange

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

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