নির্ভরতা ইনজেকশন কি ইউনিট টেস্টিংয়ের বাইরে এটি মূল্যবান


17

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

প্রশ্নযুক্ত শ্রেণিটি তার নির্মাতার কয়েকটি অন্যান্য ক্লাস আরম্ভ করে এবং এটি যে ক্লাসগুলি ব্যবহার করে তা বেশ নির্দিষ্ট। এটি আর কখনও বাস্তবায়ন ব্যবহার করবে না। আমরা কোনও ইন্টারফেসে প্রোগ্রাম করার চেষ্টা এড়ানো ন্যায়সঙ্গত কি?



3
KISS - সর্বদা সেরা পন্থা।
সংশোধন

5
আমার মতে এই প্রশ্নটি প্রস্তাবিত নকলের চেয়ে বেশি নির্দিষ্ট। ভবিষ্যতে-পরিবর্তন-বা-সমাধান-সমস্যা-হস্ত-নকশা-এর জন্য , তাই আমি এটি বন্ধ না
K3b

1
পরীক্ষার যোগ্যতা কি যথেষ্ট কারণ নয়?
কন্ডিশন

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

উত্তর:


13

এটি নির্ভর করে যে আপনি কখনই "কখনই নয়" কখনই সঠিক (যে সময়ে আপনার অ্যাপ্লিকেশন ব্যবহৃত হবে) তার উপর নির্ভর করে।

সাধারণভাবে:

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

12
" কেবলমাত্র পরীক্ষার জন্য আপনার নকশাটি সংশোধন করবেন না" এর জন্য আপনাকে প্রায় -1 দিয়েছে । টেস্টিবিলিটি অর্জনের জন্য আইএমএইচও হ'ল ডিজাইন পরিবর্তনের অন্যতম শীর্ষ কারণ! তবে আপনার অন্যান্য বিষয় ঠিক আছে।
ডক ব্রাউন

5
@ ডকব্রাউন - (এবং অন্যান্য) আমি এখানে অনেক এবং সম্ভবত সংখ্যাগরিষ্ঠের চেয়ে পৃথক। ~ 95% সময়, জিনিসগুলিকে টেস্টযোগ্য করে তোলা তাদের নমনীয় বা বর্ধনযোগ্য করে তোলে। আপনার ডিজাইনে এটি থাকা উচিত (বা এটি আপনার নকশায় যুক্ত করুন) বেশিরভাগ সময় - টেস্টাবিলিটি নিন্দা করা উচিত। অন্য ~ 5% এর মধ্যে বাছাইযোগ্য প্রয়োজনীয়তা রয়েছে যা অন্য কোনও কিছুর অনুকূলে এই ধরণের নমনীয়তা রোধ করে, বা এতটাই অপরিহার্য / অপরিবর্তনীয় যে আপনি এটি ভঙ্গ হলে খুব তাড়াতাড়ি খুঁজে পাবেন, এমনকি নিবেদিত পরীক্ষা ছাড়াই।
তেলস্তিন

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

1
আপনি কেন বলবেন যে "এমন একটি ইন্টারফেস তৈরি করা যা কেবলমাত্র একজনের উত্তরাধিকারীই হবে বেহুদা?" ইন্টারফেস চুক্তি হিসাবে কাজ করতে পারে।
কাপ্তান

2
@ ক্যাপ্টান - কারণ কংক্রিট অবজেক্ট ঠিক চুক্তির পাশাপাশি কাজ করতে পারে। দু'টি তৈরির অর্থ কেবল আপনার কোডটি দুবার লিখতে হবে (এবং কোডটি পরিবর্তিত হওয়ার পরে দুবার পরিবর্তন করুন)। মঞ্জুর, বহু সংখ্যক ইন্টারফেসের একাধিক (অ-পরীক্ষা) বাস্তবায়ন হবে বা আপনাকে সেই ঘটনার জন্য প্রস্তুত হতে হবে prepare তবে সেই বিরল ক্ষেত্রে যেখানে আপনার যা দরকার তা হ'ল একটি সিল করা বস্তু, কেবল এটি সরাসরি ব্যবহার করুন।
টেলাস্টিন

12

আমরা কোনও ইন্টারফেসে প্রোগ্রাম করার চেষ্টা এড়ানো ন্যায়সঙ্গত কি?

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

পরের প্রশ্নটি হ'ল: বাস্তবায়ন বাছাই করা প্রশ্নে শ্রেণীর দায়িত্বের অংশ? এটি হতে পারে বা নাও হতে পারে এবং আপনার সেই অনুযায়ী কাজ করা উচিত।

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

ইয়াজিএনআই পরামর্শ দেয় যে কোড লেখার সময় অতিরিক্ত অতিরিক্ত কিছু যুক্ত না করা গুরুত্বপূর্ণ। প্রোগ্রামাররা এ সম্পর্কে অবগত না হয়েও তাদের কোডে যুক্ত করার ঝোঁকগুলির মধ্যে একটি হল অতিরিক্ত অনুমান are "এই পদ্ধতিটি কাজে আসবে" বা "এটি কখনও বদলাবে না" এর মতো। উভয়ই আপনার ডিজাইনে বিশৃঙ্খলা যুক্ত করে।


2
YAGNI এখানে ডিআই-এর পক্ষে একটি আর্গুমেন্ট হিসাবে উল্লেখ করার জন্য , এটির বিপক্ষে নয়।
ডক ব্রাউন

4
@ ডকব্রাউন: ডিআইআই ব্যবহার না করার পক্ষে যুক্তিযুক্ত করার জন্য, এখানে YAGNI ব্যবহার করা যেতে পারে তা বিবেচনা করে। আমি মনে করি এটি YAGNI যে কোনও কিছুর জন্য কার্যকর পরিমাপের বিরুদ্ধে যুক্তিযুক্ত আরও কিছু।
স্টিভেন ইভার্স

1
ইয়াজিএনআই-তে অন্তর্নিহিত অনুমান অন্তর্ভুক্ত করার জন্য +1, যা আমাদের কয়েকবার মাথায় আঘাত করেছে
ইজকাটা

@ স্টিভওয়ার্স: আমি মনে করি নির্ভরতা বিপরীত নীতিটিকে উপেক্ষা করার জন্য YAGNI ব্যবহার করা YAGNI বা ডিআইপি বা সম্ভবত প্রোগ্রামিং এবং যুক্তির আরও কিছু মৌলিক নীতিগুলি বোঝার অভাবকে প্রশমিত করে। আপনার যদি প্রয়োজন হয় কেবলমাত্র ডিআইপি উপেক্ষা করা উচিত - এমন একটি পরিস্থিতিতে যেখানে YAGNI কেবল তার প্রকৃতির দ্বারা প্রযোজ্য নয়।
back2dos

@ back2dos: এই ধারণাটি যে ডিআই 'সম্ভবত প্রয়োজনীয়তা' এবং "কে জানে?" কারণেই কার্যকর? YAGNI লড়াইয়ের উদ্দেশ্যে করা এই চিন্তার ট্রেনটি অবশ্যই অবিকল, আপনি অতিরিক্ত টোলিং এবং অবকাঠামোগত একটি যৌক্তিকতা হিসাবে এটি ব্যবহার করছেন।
স্টিভেন ইভার্স

7

এটি বিভিন্ন পরামিতিগুলির উপর নির্ভর করে তবে আপনি ডিআই ব্যবহার করতে চান এমন কয়েকটি কারণ এখানে রয়েছে:

  • আমি নিজে বিশ্বাস করি টেস্টিং বেশ ভাল কারণ
  • আপনার অবজেক্টের জন্য প্রয়োজনীয় ক্লাসগুলি অন্য জায়গায় ব্যবহার করা যেতে পারে - আপনি যদি সেগুলি ইনজেক্ট করেন তবে এটি আপনাকে সংস্থানগুলি সরবরাহ করতে সক্ষম করে (উদাহরণস্বরূপ যদি প্রশ্নে ক্লাসগুলি থ্রেড বা ডাটাবেস সংযোগ হয় - আপনি চান না যে আপনার ক্লাসগুলির প্রতিটি নতুন তৈরি করুন সংযোগ)
  • আরম্ভ করে যদি এই অন্যান্য অবজেক্টগুলি ব্যর্থ হতে পারে তবে স্ট্যাকের কোডটি উচ্চতর করা আপনার ক্লাসের চেয়ে সমস্যাগুলি মোকাবেলায় সম্ভবত ভাল হবে যা সম্ভবত ত্রুটিগুলি ফরোয়ার্ড করবে

নীচের লাইন: আপনি সম্ভবত সেই ক্ষেত্রে ডিআই ছাড়া বাঁচতে পারবেন তবে ডিআই ব্যবহার করে ক্লিনার কোড শেষ হয়ে যাওয়ার সম্ভাবনা রয়েছে।


3

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

ডিপেন্ডেন্সি ইনজেকশন এবং ক্লাসের পরিবর্তে ইন্টারফেস ব্যবহারের অতিরিক্ত সুবিধাগুলি যখন কোনও অ্যাপ্লিকেশন বাড়ানো হয় তবে সেগুলি পরে খুব সহজে এবং নিরাপদে অনুসন্ধান এবং প্রতিস্থাপন ব্যবহার করে সোর্স কোডটিতে পুনঃনির্মাণ করা যেতে পারে। এমনকি খুব বড় প্রকল্পেও।


2
 > Dependency Injection worth it **outside** of UnitTesting?
 > Are we justified in avoiding trying to program to an interface?

এই ইউনিটটির অনেক প্রশ্নের বিতর্ক করা যেতে পারে "আপনার এটির প্রয়োজন হতে পারে কারণ .." যদি আপনি ইউনিটস্টিটিং করতে না চান তবে YAGNI হিসাবে।

আপনি যদি জিজ্ঞাসা করছেন ইউনিটসেটের পাশে কী কারণগুলির জন্য একটি ইন্টারফেসে প্রোগ্রাম করা প্রয়োজন

হ্যাঁ , ইউনিট টেস্টিংয়ের বাইরে নির্ভরশীল ইনজেকশন যদি আপনার নিয়ন্ত্রণের বিপরীতে প্রয়োজন হয় । উদাহরণস্বরূপ, যদি কোনও মডিউল প্রয়োগের জন্য অন্য মডিউল প্রয়োজন হয় যা তার স্তরে অ্যাক্সেসযোগ্য নয়।

উদাহরণ: আপনার যদি মডিউলগুলি gui=> businesslayer=> driver=> থাকে common

এই পরিস্থিতিতে businesslayerব্যবহার করতে পারেন driverতবে ব্যবহার driverকরতে পারবেন না businesslayer

যদি driverকিছু উচ্চতর কার্যকারিতা প্রয়োজন হয় তবে আপনি এই কার্যকারিতাটি প্রয়োগ করতে পারেন businesslayerযাতে commonস্তরটিতে একটি ইন্টারফেস প্রয়োগ করে । driverশুধুমাত্র commonস্তরটিতে ইন্টারফেসটি জানতে হবে ।


1

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

উদাহরণস্বরূপ, পরীক্ষার সরঞ্জামগুলি ব্যক্তিগত পদ্ধতিগুলির সাথে কাজ করে না বলে আপনি কি কেবল নিজের সার্বজনীনগুলিকে কেবল সর্বজনীন পদ্ধতিতে বিভক্ত করবেন? (আমি জানি যে প্রচলিত জ্ঞান হ'ল ভান করা আপনার ব্যক্তিগত পদ্ধতি পরীক্ষা করার দরকার নেই, তবে আমি মনে করি এটি বর্তমান সরঞ্জামগুলির সাথে এটি করার ক্ষেত্রে অসুবিধার একটি প্রতিক্রিয়া, প্রাইভেটগুলি পরীক্ষা করার প্রয়োজন না হওয়ার সত্যিকারের প্রতিক্রিয়া নয়,),

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


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

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

1

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

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

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


0

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

আমাকে আমার দৃশ্যের জন্য অন্য একটি বিকল্প প্রস্তাব করুন offer

কারখানার নিদর্শন দিয়ে আমি এক জায়গায় নির্ভরতা স্থানীয় করতে পারি। পরীক্ষার সময় আমি প্রসঙ্গের ভিত্তিতে বাস্তবায়ন পরিবর্তন করতে পারি এবং এটি যথেষ্ট ভাল। এটি বেশিরভাগ শ্রেণির নির্মাণ বিমূর্ত করার সুবিধার কারণে এটি YAGNI এর বিরুদ্ধে যায় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.