টিডিডি: শক্তভাবে জোড়াযুক্ত বস্তুগুলি উপহাস করছে


10

কখনও কখনও অবজেক্টগুলিকে কেবল দৃly়ভাবে জোড়া দেওয়া দরকার। উদাহরণস্বরূপ, কোনও CsvFileশ্রেণীর সম্ভবত CsvRecordক্লাস (বা ICsvRecordইন্টারফেস) দিয়ে শক্তভাবে কাজ করা প্রয়োজন ।

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

তবে এই পদ্ধতির চেষ্টা করার পরে, আমি লক্ষ্য করেছি যে CsvRecordক্লাসে ঠাট্টা করা কিছুটা লোমশ হতে পারে। যা আমাকে দুটি সিদ্ধান্তের একটির দিকে নিয়ে যায়:

  1. ইউনিট পরীক্ষা লিখতে কষ্ট হয়! এটি একটি কোড গন্ধ! Refactor!
  2. প্রতিটি একক নির্ভরতা উপহাস করা কেবল অযৌক্তিক।

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

আমি কি ট্র্যাক অফ? উপরে # 2 অনুমান করার জন্য কি কোন ডাউনসাইড আছে? আমি কি আমার নকশাটি রিফ্যাক্টর করার কথা ভাবছি?


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

উত্তর:


11

আপনার যদি সত্যই এই দুটি শ্রেণির মধ্যে সমন্বয় প্রয়োজন, এমন একটি CsvCoordinatorক্লাস লিখুন যা আপনার দুটি শ্রেণিকে আবদ্ধ করে, এবং এটি পরীক্ষা করে।

তবে আমি এই ধারণাকে বিতর্ক করি যা CsvRecordস্বতন্ত্রভাবে পরীক্ষামূলক নয়। CsvRecordমূলত ডিটিও ক্লাস, তাই না? এটি কেবল কয়েকটি ক্ষেত্রের সাহায্যে বেশ কয়েকটি সহায়ক পদ্ধতির সংগ্রহ। এবং CsvRecordপাশাপাশি অন্যান্য প্রসঙ্গে ব্যবহার করা যেতে পারে CsvFile; CsvRecordউদাহরণস্বরূপ আপনার কাছে একটি সংগ্রহ বা অ্যারে থাকতে পারে ।

CsvRecordপ্রথম পরীক্ষা । নিশ্চিত হয়ে নিন যে এটি এর সমস্ত পরীক্ষায় পাস করেছে। তারপরে, পরীক্ষার সময় এগিয়ে যান এবং CsvRecordআপনার CsvFileক্লাসের সাথে ব্যবহার করুন । এটি প্রাক-পরীক্ষিত স্টাব / মোক হিসাবে ব্যবহার করুন; এটি প্রাসঙ্গিক পরীক্ষার ডেটা দিয়ে পূরণ করুন, এতে পাস করুন CsvFileএবং এর বিরুদ্ধে আপনার পরীক্ষার কেসগুলি লিখুন।


1
হ্যাঁ, CSvRecord সুনির্দিষ্টভাবে স্বতন্ত্রভাবে টেস্টযোগ্য। সমস্যাটি হ'ল যদি কিছু কিছু CSvRecord এ ব্রেক হয়ে যায় তবে এটি CSvData পরীক্ষাগুলিকে ব্যর্থ করে দেবে। তবে আমি মনে করি না এটি একটি বড় সমস্যা।
ফিল

1
আমি মনে করি আপনি এটি চান। :)
রবার্ট হার্ভে

1
@ রবার্টহারভে: তাত্ত্বিকভাবে, সিএসভিরেকর্ড এবং সিএসভিফিল যদি জটিল জটিল শ্রেণিতে পরিণত হয় এবং সিএসভিফায়ালের জন্য যদি কোনও পরীক্ষা হয়, তবে আপনি যদি সিএসভিফাইলে বা সিএসভিক্র্ডের সমস্যা হয়ে থাকেন তবে এখনই আপনি তাৎক্ষণিকভাবে জানেন না don't তবে আমি অনুমান করি এটি আরও অনুমানের বিষয় - যদি সত্যিকারের একটি ওয়ার্ল্ড প্রোগ্রামের জন্য এই ধরণের ক্লাস করার প্রোগ্রামিংয়ের কাজটি আমার হাতে ছিল, আপনি যেভাবে বর্ণনা করেছেন ঠিক তেমনভাবে আমি এটি করব।
ডক ব্রাউন

2
@ ফিল: যদি CsvRecordবিরতি ঘটে তবে স্পষ্টতই CsvDataব্যর্থ হয়; তবে এটি ঠিক আছে, কারণ আপনি CsvRecordপ্রথমে পরীক্ষা করেন এবং যদি এটি ব্যর্থ হয় তবে আপনার CsvFileপরীক্ষাগুলি অর্থহীন। আপনি এখনও CsvRecordএবং এর মধ্যে ত্রুটিগুলির মধ্যে পার্থক্য করতে পারেন CsvFile
টিডামার্স

5

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

এর মতো একটি বর্গ CsvRecordআমার কাছে মনে হয় এটি বেশিরভাগই ডেটা সংরক্ষণ করার জন্য - এটি কোনও নিজস্ব শ্রেণিকেন্দ্রিক শ্রেণি নয় class অর্থাৎ এটির কনস্ট্রাক্টর, গেটর, সেটার থাকতে পারে তবে সত্যিকারের যথেষ্ট যুক্তিযুক্ত কোনও পদ্ধতি নেই। অবশ্যই, আমি এখানে অনুমান করছি - সম্ভবত আপনি একটি ক্লাস লিখেছেন যা CsvRecordবলেছে জটিল জটিল গণনা।

তবে যদি CsvRecordএর নিজস্ব যুক্তি না থাকে তবে এটি উপহাস করে লাভ করার মতো কিছুই নেই। এটি সত্যই কেবল পুরানো ম্যাক্সিম - "মান অবজেক্টগুলি উপহাস করবেন না"

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


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

1

নং # 2 ঠিক আছে। জিনিসগুলি হতে পারে এবং যদি তাদের ধারণাগুলি দৃly়ভাবে একত্রিত হয় তবে শক্তভাবে মিলিত হওয়া উচিত । এটি বিরল এবং সাধারণত এড়ানো উচিত, তবে উদাহরণ হিসাবে আপনি এটি প্রদান করেছেন তা বোঝা যায়।


0

"কাপল্ড" ক্লাসগুলি একে অপরের উপর নির্ভরশীল। আপনি যা বর্ণনা করছেন সে ক্ষেত্রে এটি হওয়া উচিত নয় - কোনও CSvRecord এর প্রকৃত CsvFile সম্পর্কে সত্যই যত্ন নেওয়া উচিত নয়, তাই নির্ভরতা কেবল এক পথে চলে। সেটা ঠিক আছে, এবং না টাইট কাপলিং।

সর্বোপরি, যদি কোনও শ্রেণিতে ভ্যারিয়েবলের স্ট্রিংয়ের নাম থাকে তবে আপনি দাবি করবেন না এটি স্ট্রিংয়ের সাথে দৃly়ভাবে মিলিত হয়েছে, আপনি কি করবেন?

সুতরাং, ইউনিটটি তার পছন্দসই আচরণের জন্য CSvRecord পরীক্ষা করুন।

তারপরে আপনার ইউনিট সঠিকভাবে নির্ভর করে এমন অবজেক্টগুলির সাথে ইন্টারঅ্যাক্ট করছে কিনা তা পরীক্ষা করার জন্য একটি উপহাস ফ্রেমওয়ার্ক (মকিতো দুর্দান্ত) ব্যবহার করুন। আপনি যে আচরণটি পরীক্ষা করতে চান, সত্যই - এটি CSvFile প্রত্যাশিত ফ্যাশনে CsvRcords পরিচালনা করে। CvsRecord এর অভ্যন্তরীণ কাজের বিষয়টি বিবেচনা করা উচিত নয় - এটি কীভাবে সিভিএসফাইলে এটির সাথে যোগাযোগ করে।

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


1
-1, টাইট কাপলিংয়ের অর্থ চক্রীয় নির্ভরতা নয়, এটি একটি ভুল ধারণা। উদাহরণে, CsvFile হয় শক্তভাবে করতে মিলিত CsvRecord(কিন্তু অন্যান্য উপায় বৃত্তাকার)। ওপিকে জিজ্ঞাসা করা হয়েছে যে এটি CsvFileকোনওর CsvRecordমাধ্যমে ICsvRecordবিপরীতভাবে নয়, তবে এটির মাধ্যমে ডিকম্পল করে পরীক্ষা করার পক্ষে ভাল ধারণা ।
ডক ব্রাউন

2
@ ডকব্রাউন: মিলনটি আঁটসাঁট হোক বা না হোক CsvFileতা অভ্যন্তরীণ কাজের উপর নির্ভর করে CsvRecord, এটি ফাইলটি রেকর্ড সম্পর্কে কতটা অনুমান করেছে। ইন্টারফেসগুলি ডকুমেন্টকে এ জাতীয় অনুমানগুলি (বা বরং অন্যান্য অনুমানের অনুপস্থিতি) প্রয়োগ করতে সহায়তা করে তবে মিলনের পরিমাণ একই থাকে, একটি ইন্টারফেস বাদে আপনি একটি ভিন্ন রেকর্ড শ্রেণিতে প্রবেশ করতে পারেন CsvFile। ইন্টারফেসটির সাথে পরিচয় করিয়ে দেওয়া যাতে আপনি বলতে পারেন যে আপনি মিলন হ্রাস করেছেন নির্বোধ।
টিডামার্স

0

এখানে সত্যিই দুটি প্রশ্ন আছে। প্রথমটি যদি এমন পরিস্থিতি উপস্থিত থাকে যেখানে কোনও বিষয়কে ঠাট্টা করা অপ্রয়োজনীয় in এটি নিঃসন্দেহে সত্য, অন্যান্য দুর্দান্ত উত্তরের দ্বারা দেখানো হয়েছে। দ্বিতীয় প্রশ্নটি হল আপনার নির্দিষ্ট কেসগুলি সেই পরিস্থিতিতে একটি one এই প্রশ্নে আমি নিশ্চিত নই।

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

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

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

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