দরিদ্র মানুষের নির্ভরতা ইনজেকশনটি কোনও উত্তরাধিকার আবেদনে টেস্টাবিলিটি চালু করার জন্য কি ভাল উপায়?


14

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

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

ব্যবসায়ের যুক্তিতে ইউনিট পরীক্ষা আনা অবশ্যই লক্ষ্য!
পরীক্ষা-প্রতিরোধকারী ডাটাবেস কলগুলির সাথে জড়িত এমন ব্যবসায়িক যুক্তি।

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

প্রশ্ন: এটা দরিদ্র মানুষের দ্বি ব্যবহার করার জন্য ঠিক আছে পরিচয় করিয়ে একটি লিগ্যাসি আবেদন testability এবং বল ঘূর্ণায়মান শুরু?

তদুপরি, সত্য নির্ভরতা ইনজেকশনের ঘাসের শিকড় হিসাবে গরিব মানুষের ডিআইআই ব্যবহার করা নীতিটির প্রয়োজনীয়তা এবং সুবিধাগুলি সম্পর্কে শিক্ষিত করার মূল্যবান উপায়?

আপনি কি এমন কোনও পদ্ধতির রিফ্যাক্টর করতে পারেন যেটিতে একটি ডেটাবেস কল নির্ভরতা রয়েছে এবং কোনও ইন্টারফেসের পিছনে কলটি বিমূর্ত করতে পারে? কেবল সেই বিমূর্ততা থাকলে সেই পদ্ধতিটিকে পরীক্ষার যোগ্য করে তোলে যেহেতু একটি মক বাস্তবায়ন কোনও কনস্ট্রাক্টর ওভারলোডের মধ্য দিয়ে যেতে পারে।

রাস্তায় নামার পরে, একবার প্রচেষ্টা সমর্থকদের লাভ করার পরে, প্রকল্পটি একটি আইওসি পাত্রে বাস্তবায়নের জন্য আপডেট করা যেতে পারে এবং নির্মাতারা সেখানে বিসর্জনগুলি নিতে পারেন।



2
শুধু একটি নোট. I consider it a challenge to decouple code and introduce an IOC container into a legacy applicationঅবশ্যই এটি। এর নাম প্রযুক্তিগত .ণ। এ কারণেই কোনও বড় পুনর্নির্মাণের আগে এটি ছোট এবং কন্টিনোস রিফ্যাক্টরগুলি পছন্দযোগ্য। প্রধান নকশার ত্রুটিগুলি হ্রাস করুন এবং আইওসিতে স্থানান্তর করা কম চ্যালেঞ্জ হবে।
লাইভ

উত্তর:


25

NerdDinner এ পুয়ার ম্যানস ইনজেকশন সম্পর্কে সমালোচনা আপনার ডিগ্রী সঠিকভাবে আপনার ক্লাস স্থাপনের তুলনায় ডিআই ডি কনটেইনার ব্যবহার করুন বা করবেন না এর সাথে কমই যুক্ত to

নিবন্ধে, তারা যে বিবৃতি

public class SearchController : Controller {

    IDinnerRepository dinnerRepository;

    public SearchController() : this(new DinnerRepository()) { }

    public SearchController(IDinnerRepository repository) {
        dinnerRepository = repository;
    }
}

ভুল কারণ প্রথম কন্সট্রাক্টর শ্রেণি নির্মানের জন্য একটি সুবিধাজনক ফলব্যাক প্রক্রিয়া সরবরাহ করে, তবে এটিতে একটি দৃ tight়-আবদ্ধ নির্ভরতাও তৈরি করে DinnerRepository

লস টেকিজের পরামর্শ অনুসারে অবশ্যই সঠিক প্রতিকারটি কোনও ডিআই কন্টেইনার যুক্ত করা নয়, বরং আপত্তিজনক নির্মাণকারীকে অপসারণ করা।

public class SearchController : Controller 
{
    IDinnerRepository dinnerRepository;

    public SearchController(IDinnerRepository repository) {
        dinnerRepository = repository;
    }
}

বাকী শ্রেণিতে এখন এর নির্ভরতা সঠিকভাবে উল্টে গেছে। আপনি এখন চাইলেও সেই নির্ভরতাগুলি ইনজেকশন মুক্ত।


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

ইউনিট পরীক্ষার জন্য ডিফল্ট নির্মাণকারী প্রয়োজন হয় না। মক অবজেক্ট সহ আপনি যা পছন্দ করেন না কেন ক্লাসের কাছে আপনি নির্ভর করতে পারেন।
রবার্ট হার্ভে

2
@ এয়ারন ৫৪75৫ সতর্কতা অবলম্বন করুন যে আপনি খুব বিমূর্ত না হয়ে গিয়েছেন । এই পরীক্ষাগুলির অর্থপূর্ণ আচরণগুলির পরীক্ষা করা উচিত - এটি পরীক্ষা করে যে কোনও XServiceএকটি প্যারামিটারটি পাস করে XRepositoryএবং যা ফিরে আসে তা ফিরে আসে কারও পক্ষে অত্যধিক উপকারী নয় এবং এক্সটেনসিবিলিটির পথে আপনাকে খুব বেশি দেয় না । অর্থপূর্ণ আচরণ পরীক্ষা করার জন্য আপনার ইউনিট পরীক্ষাগুলি লিখুন এবং নিশ্চিত করুন যে আপনার উপাদানগুলি এত সংকীর্ণ নয় যে আপনি আসলে আপনার সমস্ত যুক্তিটিকে আপনার রচনার মূলে স্থানান্তর করছেন।
পিঁপড়া পি

আমি বুঝতে পারি না যে কীভাবে আপত্তিজনক কনস্ট্রাক্টর ইউনিট পরীক্ষার জন্য সহায়তা করবে, অবশ্যই এটি বিপরীত হবে? আপত্তিজনক কনস্ট্রাক্টর সরান যাতে ডিআই সঠিকভাবে প্রয়োগ করা হয় এবং আপনার অবজেক্টগুলি ইনস্ট্যান্ট করার সময় একটি উপহাস নির্ভরতাতে চলে যায়।
রব

@ রব: তা হয় না। এটি কোনও ডিফল্ট কনস্ট্রাক্টরের পক্ষে একটি বৈধ অবজেক্ট দাঁড়ানোর পক্ষে একটি সহজ উপায়।
রবার্ট হার্ভে

16

"দরিদ্র ব্যক্তির ডিআই" কী তা আপনি এখানে একটি ভুল ধারণা তৈরি করেন make

"শর্টকাট" নির্মাণকারী এমন একটি শ্রেণি তৈরি করা যা এখনও মিলন তৈরি করে দরিদ্র লোকের ডিআই নয় DI

কোনও ধারক ব্যবহার না করা এবং নিজেই সমস্ত ইনজেকশন এবং ম্যাপিং তৈরি করা দরিদ্র ব্যক্তির ডিআই।

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

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


8
"দরিদ্র মানুষ" বা "খাঁটি" ডিআই, আপনি যাকে পছন্দ করেন আইওসি পাত্রেও অনেক সমস্যা হ্রাস করে। আমি প্রতিটি কিছুর জন্য আইওসি পাত্রে ব্যবহার করতাম তবে যত বেশি সময় যায় তত বেশি আমি এগুলি এড়িয়ে চলতে পছন্দ করি।
পিঁপড়া পি

7
@ অ্যান্টপি, আমি আপনার সাথে রয়েছি: আমি আজকাল 100% খাঁটি ডিআই এবং সক্রিয়ভাবে পাত্রে এড়াতে চাই। তবে আমি (আমরা) যতদূর বলতে পারি সেই স্কোরটিতে সংখ্যালঘুতে আছি।
ডেভিড আরনো

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

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

1

উত্তরাধিকার দল / কোড বেসগুলিতে প্যারাগ্রিড শিফটগুলি অত্যন্ত ঝুঁকিপূর্ণ:

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

সমস্ত নখ ছিন্ন করতে হাতুড়ি হিসাবে একটি ডিআই ফ্রেমওয়ার্ক ব্যবহার করা কেবলমাত্র লিগ্যাসি কোডকে সব ক্ষেত্রেই আরও খারাপের তুলনায় আরও খারাপ করে তুলবে। এটি ব্যক্তিগতভাবেও অত্যন্ত ঝুঁকিপূর্ণ।

এমনকি সর্বাধিক সীমাবদ্ধ ক্ষেত্রে যেমন পরীক্ষার ক্ষেত্রে এটি ব্যবহার করা যেতে পারে কেবল সেই পরীক্ষার কেসগুলিকে "অ-মানক" এবং "বিদেশী" কোড তৈরি করবে যা @Ignoreতারা যখন ভেঙে বা খারাপ হতে পারে তখন সবচেয়ে ভালভাবে চিহ্নিত হয়ে যাবে এবং নিয়মিতভাবে অভিযোগ করা হবে লিগ্যাসি প্রোগ্রামাররা ম্যানেজমেন্টের সাথে সর্বাধিক ঝাঁকুনির সাথে এবং পুরোপুরি আপনার উপর দোষ চাপিয়ে "ইউনিট টেস্টে নষ্ট সময়" এর সাথে "সঠিকভাবে" পুনরায় লিখিত হন।

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

নির্ভরতা ইনজেকশন একটি সমস্যা খুঁজছেন এমন একটি সমাধান।

সংজ্ঞা অনুসারে কনস্ট্রাক্টরগুলির যে কোনও ভাষা কনভেনশন দ্বারা নির্ভরতা ইনজেকশন ব্যবহার করে আপনি যদি জানেন যে আপনি কী করছেন এবং কোনও কনস্ট্রাক্টরকে কীভাবে সঠিকভাবে ব্যবহার করতে হয় তা বুঝতে পারেন, এটি কেবল ভাল নকশা।

নির্ভরতা ইনজেকশন খুব সংকীর্ণ জিনিসের জন্য কেবলমাত্র ছোট মাত্রায়ই কার্যকর:

  • যে জিনিসগুলি অনেকগুলি পরিবর্তন করে বা প্রচুর বিকল্প বাস্তবায়ন থাকে যা স্থিরভাবে আবদ্ধ।

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


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

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

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

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

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