আপনার প্রশ্নে ক্লাস ভেঙে দেওয়া উচিত।
প্রতিটি শ্রেণীর কিছু সহজ কাজ করা উচিত। যদি আপনার কাজটি পরীক্ষা করা খুব জটিল হয় তবে ক্লাসটি যে কাজটি করে তা খুব বড়।
এই নকশার বোকামি উপেক্ষা:
class NewYork
{
decimal GetRevenue();
decimal GetExpenses();
decimal GetProfit();
}
class Miami
{
decimal GetRevenue();
decimal GetExpenses();
decimal GetProfit();
}
class MyProfit
{
MyProfit(NewYork new_york, Miami miami);
boolean bothProfitable();
}
হালনাগাদ
ক্লাসে স্ট্যাবিং পদ্ধতিগুলির সাথে সমস্যা হ'ল আপনি এনক্যাপসুলেশন লঙ্ঘন করছেন। আপনার পরীক্ষায় অবশ্যই বস্তুর বাহ্যিক আচরণ নির্দিষ্টকরণের সাথে মেলে কিনা তা পরীক্ষা করা উচিত। বস্তুর ভিতরে যা ঘটে তা তার ব্যবসায়ের কোনওটি নয়।
পুরো নামটি ফার্স্টনেম এবং লাস্টনাম ব্যবহার করে তা বাস্তবায়নের বিশদ। শ্রেণীর বাইরের কোনও কিছুরই যত্নশীল হওয়া উচিত নয় যে এটি সত্য। অবজেক্টটি পরীক্ষা করার জন্য জনসাধারণের পদ্ধতিগুলিকে উপহাস করে আপনি সেই ধারণাটি কার্যকর করা হয়েছে সে সম্পর্কে ধারণা তৈরি করছেন।
ভবিষ্যতের এক পর্যায়ে, এই ধারণাটি সঠিক হতে পারে না। সম্ভবত নাম যুক্তির সমস্তগুলি একটি নাম অবজেক্টে স্থানান্তরিত হবে যা ব্যক্তি কেবল কল করে। সম্ভবত ফুলনেম সদস্য ভেরিয়েবলগুলি প্রথম নাম এবং শেষ নামটি সরাসরি অ্যাক্সেস করে তারপরে ফার্স্টনাম এবং লাস্টনেম কল করে।
দ্বিতীয় প্রশ্নটি কেন আপনি এটি করার প্রয়োজন বোধ করেন। আপনার সমস্ত ব্যক্তি শ্রেণির পরেও এরকম কিছু পরীক্ষা করা যেতে পারে:
Person person = new Person("John", "Doe");
Test.AssertEquals(person.FullName(), "John Doe");
এই উদাহরণের জন্য আপনার প্রয়োজনীয় স্টাবের কিছু অনুভব করা উচিত নয়। যদি আপনি তা করেন তবে আপনি দৃub়-খুশি এবং ভাল ... এটি বন্ধ করুন! সেখানকার পদ্ধতিগুলিকে উপহাস করার কোনও সুবিধা নেই কারণ যেভাবে যাইহোক সেগুলির মধ্যে যা আছে তা আপনি নিয়ন্ত্রণ পেয়েছেন।
একমাত্র ক্ষেত্রে যেখানে ফুলনেমকে উপহাস করার জন্য যে পদ্ধতিগুলি ব্যবহার করা হয়েছে সেগুলি বোঝার জন্য মনে হয় যদি হ'ল কোনওভাবে ফার্স্টনাম () এবং লাস্টনাম () অ-তুচ্ছ কাজ করে operations হতে পারে আপনি সেই এলোমেলো নাম জেনারেটরগুলির মধ্যে একটি লিখছেন, বা ফার্স্টনেম এবং লাস্টনেম উত্তরের জন্য ডেটাবেস, বা অন্য কিছু জিজ্ঞাসা করছে। তবে যদি এটিই ঘটে থাকে তবে বোঝা যাচ্ছে যে বস্তু এমন কিছু করছে যা ব্যক্তি শ্রেণীর অন্তর্গত নয়।
এটি অন্য উপায়ে রেখে, পদ্ধতিগুলিকে ঠাট্টা করা হ'ল অবজেক্টটি নিয়ে যাওয়া এবং দুটি টুকরো টুকরো করা। একটি টুকরা উপহাস করা হচ্ছে যখন অন্য টুকরা পরীক্ষা করা হচ্ছে। আপনি যা করছেন তা হ'ল অবজেক্টটিকে বিচ্ছিন্ন করা। যদি এটি হয় তবে কেবল ইতিমধ্যে বস্তুটি ভেঙে দিন।
যদি আপনার শ্রেণিটি সহজ হয়, আপনি পরীক্ষার সময় এর অংশগুলি উপহাস করার প্রয়োজন অনুভব করবেন না। যদি আপনার ক্লাসটি এত জটিল হয় যে আপনি উপহাস করার প্রয়োজন বোধ করেন, তবে আপনার ক্লাসটি সহজ টুকরো টুকরো করা উচিত।
আবার আপডেট করুন
আমি এটি যেভাবে দেখছি, কোনও জিনিসের বাহ্যিক এবং অভ্যন্তরীণ আচরণ রয়েছে। বাহ্যিক আচরণের মধ্যে অন্যান্য বস্তুগুলিতে রিটার্নের মানগুলি অন্তর্ভুক্ত vious (অন্যথায় আপনি কী পরীক্ষা করবেন?) তবে অভ্যন্তরীণ আচরণটি সত্যই পরীক্ষা করা উচিত নয়।
এখন অভ্যন্তরীণ আচরণ পরীক্ষা করা হয়েছে, কারণ এটিই বাহ্যিক আচরণের ফলাফল। তবে আমি কেবল অভ্যন্তরীণ আচরণের উপর সরাসরি পরোক্ষভাবে বাহ্যিক আচরণের মাধ্যমে পরীক্ষা লিখি না।
আমি যদি কিছু পরীক্ষা করতে চাই তবে আমি অনুভব করি যে এটি স্থানান্তরিত হওয়া উচিত যাতে এটি বাহ্যিক আচরণে পরিণত হয়। সে কারণেই আমি মনে করি আপনি যদি কিছু উপহাস করতে চান তবে আপনার অবজেক্টটি বিভক্ত করা উচিত যাতে আপনি যে জিনিসটিকে উপহাস করতে চান সেটি এখন প্রশ্নযুক্ত বস্তুর বাইরের আচরণে।
তবে, এতে কী পার্থক্য রয়েছে? ফার্স্টনাম () এবং লাস্টনাম () যদি অন্য কোনও অবজেক্টের সদস্য হয় তবে কী এটি সত্যই পুরো নামটির সমস্যা পরিবর্তন করে ()? যদি আমরা সিদ্ধান্ত নিই যে ফার্স্টনাম এবং লাস্টনামের উপহাস করা প্রয়োজন তবে তাদের পক্ষে অন্য কোনও বস্তুতে থাকতে সহায়তা করা কি?
আমি মনে করি আপনি যদি আপনার বিদ্রূপের পন্থাটি ব্যবহার করেন তবে আপনি অবজেক্টে একটি সিম তৈরি করেন। আপনার প্রথম নাম () এবং লাস্টনাম () এর মতো ফাংশন রয়েছে যা কোনও বাহ্যিক ডেটা উত্সের সাথে সরাসরি যোগাযোগ করে। আপনারও ফুলনেম () যা নেই। তবে যেহেতু তারা সবাই একই শ্রেণিতে রয়েছে তা স্পষ্ট নয়। কিছু টুকরা সরাসরি ডেটা উত্স অ্যাক্সেস করার কথা নয় এবং অন্যান্যটি। আপনার কোডটি পরিষ্কার হবে যদি কেবলমাত্র এই দুটি গোষ্ঠীটি ছড়িয়ে দেওয়া হয়।
সম্পাদনা
আসুন আমরা এক পদক্ষেপ নেব এবং জিজ্ঞাসা করব: পরীক্ষা করার সময় আমরা কেন বস্তুগুলি উপহাস করি?
- পরীক্ষাগুলি ধারাবাহিকভাবে চালিত করুন (রান থেকে চালাতে পরিবর্তিত জিনিসগুলিতে অ্যাক্সেস এড়িয়ে চলুন)
- ব্যয়বহুল সংস্থান অ্যাক্সেস এড়িয়ে চলুন (তৃতীয় পক্ষের পরিষেবাগুলিতে আঘাত করবেন না) etc.
- পরীক্ষার অধীনে সিস্টেমটি সরল করুন
- সমস্ত সম্ভাব্য পরিস্থিতি পরীক্ষা করা সহজ করুন (যেমন ব্যর্থতার অনুকরণের মতো জিনিসগুলি)
- কোডের অন্যান্য টুকরাগুলির বিশদের উপর নির্ভর করে এড়িয়ে চলুন যাতে কোডের অন্যান্য টুকরাগুলির পরিবর্তনগুলি এই পরীক্ষাটি ভাঙ্গবে না।
এখন, আমি মনে করি যে 1-4 কারণগুলি এই দৃশ্যে প্রযোজ্য নয়। পূর্ণ নাম পরীক্ষা করার সময় বাহ্যিক উত্সকে উপহাস করা বিদ্রূপের জন্য এই সমস্ত কারণের যত্ন নেয়। একমাত্র টুকরোটি যা পরিচালনা করা হয়নি তা হল সরলতা, তবে এটি মনে হয় যে অবজেক্টটি যথেষ্ট সরল যা কোনও উদ্বেগ নয়।
আমি মনে করি আপনার উদ্বেগ কারণ 5 নম্বর। উদ্বেগ হ'ল ভবিষ্যতে কোন এক সময় ফার্স্টনাম এবং লাস্টনামের প্রয়োগটি পরীক্ষাটি ভেঙে দেবে। ভবিষ্যতে ফার্স্টনাম এবং লাস্টনাম কোনও আলাদা অবস্থান বা উত্স থেকে নামগুলি পেতে পারে। তবে ফুলনেম সম্ভবত সর্বদা থাকবে FirstName() + " " + LastName()
। এজন্য আপনি ফার্স্টনাম এবং লাস্টনামকে উপহাস করে পূর্ণ নাম পরীক্ষা করতে চান।
আপনার তখন যা আছে তা হ'ল সেই ব্যক্তির কিছু উপসেট যা অন্যটির পরিবর্তনের সম্ভাবনা বেশি। বাকি অবজেক্টটি এই সাবসেটটি ব্যবহার করে। সেই সাবসেটটি বর্তমানে একটি উত্স ব্যবহার করে এটির ডেটা নিয়ে আসে, তবে পরবর্তী তারিখে সেই ডেটাটিকে সম্পূর্ণ আলাদা উপায়ে আনতে পারে। তবে আমার কাছে মনে হচ্ছে যে উপসেটটি একটি পৃথক বস্তু যা বেরোনোর চেষ্টা করছে।
আমার কাছে মনে হচ্ছে আপনি যদি অবজেক্টের পদ্ধতিটিকে উপহাস করেন তবে আপনি অবজেক্টটিকে বিভক্ত করছেন। তবে আপনি এটি একটি অ্যাড-হক পদ্ধতিতে করছেন। আপনার কোডটি এটি পরিষ্কার করে দেয় না যে আপনার ব্যক্তির বস্তুর ভিতরে দুটি স্বতন্ত্র টুকরা রয়েছে। সুতরাং সেই বস্তুকে কেবল আপনার আসল কোডে বিভক্ত করুন, যাতে আপনার কোডটি কী চলছে তা পড়া থেকে পরিষ্কার হয়ে যায়। অর্থটি তৈরি করে এমন অবজেক্টের আসল বিভাজনটি বেছে নিন এবং প্রতিটি পরীক্ষার জন্য অবজেক্টটিকে আলাদাভাবে ভাগ করার চেষ্টা করবেন না।
আমি সন্দেহ করি আপনি নিজের আপত্তিটি বিভক্ত করতে আপত্তি করতে পারেন তবে কেন?
সম্পাদনা
আমি ভৃল ছিলাম.
আপনার পৃথক পদ্ধতিগুলিকে ঠাট্টা করে অ্যাড-হক বিভক্তকরণের পরিবর্তে আপনার বস্তুগুলি বিভক্ত করা উচিত। যাইহোক, আমি বস্তুর বিভাজনের এক পদ্ধতিতে অত্যধিক দৃষ্টি নিবদ্ধ করেছিলাম। তবে ওও কোনও বস্তুর বিভাজনের একাধিক পদ্ধতি সরবরাহ করে methods
আমি কি প্রস্তাব করব:
class PersonBase
{
abstract sring FirstName();
abstract string LastName();
string FullName()
{
return FirstName() + " " + LastName();
}
}
class Person extends PersonBase
{
string FirstName();
string LastName();
}
class FakePerson extends PersonBase
{
void setFirstName(string);
void setLastName(string);
string getFirstName();
string getLastName();
}
আপনি এটি পাশাপাশি যা করছিলেন তা হতে পারে। তবে আমি মনে করি না যে বিদ্রূপ করার পদ্ধতিগুলির সাথে আমি এই পদ্ধতিটি দেখেছি সমস্যাগুলি হবে কারণ আমরা প্রতিটি পদ্ধতিটি কোন দিকে চলছে তা স্পষ্টভাবেই বর্ণনা করেছি। এবং উত্তরাধিকার ব্যবহার করে, আমরা যদি কোনও অতিরিক্ত মোড়কের জিনিস ব্যবহার করি তবে উদ্বেগটি এড়াতে পারে।
এটি কিছু জটিলতার পরিচয় দেয় এবং কেবলমাত্র কয়েকটি ইউটিলিটি ফাংশনগুলির জন্য আমি কেবল অন্তর্নিহিত তৃতীয় পক্ষের উত্সকে উপহাস করেই তাদের পরীক্ষা করেছিলাম। অবশ্যই, তারা ভাঙ্গার ঝুঁকিতে রয়েছে তবে এটি পুনরায় সাজানোর পক্ষে উপযুক্ত নয়। যদি আপনার একটি জটিল পর্যাপ্ত অবজেক্ট থাকে যা আপনার এটি বিভক্ত করতে হবে তবে আমি মনে করি এটির মতো একটি ভাল ধারণা।