তৃতীয় পক্ষের কোডটি মোড়ানো কি তার গ্রাহকদের একক পরীক্ষার একমাত্র সমাধান?


13

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

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

এখন আমার ক্লাসটি দেখুন Loggerযা নির্ভর করে Zend_Mail:

class Logger{
    private $mailer;    
    function __construct(Zend_Mail $mail){
        $this->mail=$mail;
    }    
   function toBeTestedFunction(){
      //Some code
      $this->mail->setTo('some value');
      $this->mail->setSubject('some value');
      $this->mail->setBody('some value');
      $this->mail->send();
     //Some
   }        
}

যাইহোক, ইউনিট পরীক্ষাটি দাবি করে যে আমি একবারে একটি উপাদান পরীক্ষা করি, তাই আমার Zend_Mailক্লাসটি উপহাস করা উচিত । এছাড়াও আমি নির্ভরতা ইনভার্সন নীতি লঙ্ঘন করছি কারণ আমার Loggerক্লাসটি এখন বিমূর্ততা নয় কনক্রিটেশন উপর নির্ভর করে।

এখন Loggerমোড়কে না রেখে আমি কীভাবে বিচ্ছিন্নতায় পরীক্ষা করতে পারি Zend_Mail?!

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


আপনার কি কোনও ইন্টারফেস ব্যবহার করতে হবে? পিএইচপি কি হাঁসের টাইপিং সমর্থন করে না?
কেভিন

@ কেভিনক্লাইন ভালভাবে আমি পিএইচপি ব্যবহার করেছি কারণ এটি আমি যে ভাষাটি সবচেয়ে বেশি ব্যবহার করি তা কিন্তু আমি আসলে পিএইচপি-তে সীমাবদ্ধ না হয়ে সমস্যার একটি সাধারণ সমাধান খুঁজছি।
সানগো

উত্তর:


21

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

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

তৃতীয় পক্ষের বিক্রেতাদের দ্রুত পরিবর্তন করার ক্ষমতা একটি বিশাল সুবিধা।


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

3
শেষ বাক্যটির জন্য উত্সাহিত।
blrfl

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

3
-১: তৃতীয় পক্ষের গ্রন্থাগারটি পরিষেবা সরবরাহ করে এমন ক্ষেত্রে বাদে যেখানে একটি মানকযুক্ত এপিআই রয়েছে, এটি একটি প্রচুর সময় নষ্ট এবং কেবলমাত্র আপনার কোডটি নকল করেই রক্ষণাবেক্ষণকে হ্রাস করবে। এছাড়াও, YAGNI।
মাইকেল বার্গওয়ার্ট

1
@ মিশেলবার্গওয়ার্ট: অবশ্যই, তবে সেই ক্ষেত্রে, স্ট্যান্ডার্ড এপিআইটি মোড়ক হয়ে যায় এবং আপনি সহজেই গ্রন্থাগারগুলিকে অদলবদল করতে পারেন।
blrfl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.