এই অনুশীলনীতে মেথড প্যারামিটারের কিছু খুঁটিনাটি এবং C#-এ এগুলোর ব্যবহার নিয়ে আলোচনা করা হয়েছে।
প্যারামিটার একটি কল করা মেথড থেকে কলকারীর কাছে তথ্য পৌঁছে দেয়।
ref ও out-এর মতো মডিফায়ার ব্যবহার করে প্যারামিটারের আচরণ পরিবর্তন করা যায়।
out মডিফায়ারযুক্ত একটি প্যারামিটার কল করা মেথড থেকে কলকারীর কাছে একটি মান ফেরত পাঠায়। প্যারামিটারটি ইনিশিয়ালাইজ না করেই কল করা মেথডে পাঠানো যায়, আর যেভাবেই পাঠানো হোক, কল করা মেথডের ভেতরে এটিকে এমনভাবে ধরা হয় যেন মেথডে ঢোকার সময় এটি ইনিশিয়ালাইজ করা ছিল না। প্যারামিটার মডিফায়ার সম্পর্কিত আচরণ ও নিয়মগুলো সবচেয়ে সহজে বোঝা যায় উদাহরণ (নিচে দেখুন) এবং কম্পাইলারের মেসেজ থেকে।
void Foo(out int val)
{
val = 42;
}
void Bar(int val)
{
val = 42;
}
int importantValue = 1729;
Foo(out importantValue);
var result = importantValue == 42;
// => true
importantValue = 1729;
Bar(importantValue);
result = importantValue == 1729;
// => true
কল করা মেথডের ভেতরে out প্যারামিটারে অবশ্যই মান অ্যাসাইন করতে হবে।
ref মডিফায়ারযুক্ত একটি প্যারামিটার কল করা মেথডে একটি মান পাঠায়। মেথডটি রিটার্ন করলে কলকারী দেখবেন, কল করা মেথড ওই প্যারামিটারে যে পরিবর্তনগুলো করেছে তা সেখানেই আছে।
void Foo(ref int val)
{
val *= 7;
}
int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
ref প্যারামিটার অবশ্যই ভ্যারিয়েবল হতে হবে, কারণ কল করা মেথড কলকারীর দেখা সেই প্যারামিটারের উপরেই সরাসরি কাজ করবে।out ও ref মডিফায়ার কল করা মেথডের সিগনেচারে এবং কল করার জায়গায়, দুই ক্ষেত্রেই থাকা আবশ্যক।classes অনুশীলনীতে আপনি যে রিমোট কন্ট্রোল কার প্রকল্পটি শুরু করেছিলেন সেটি ভালোভাবেই এগিয়েছে (অভিনন্দন!), আর সম্প্রতি বেশ কিছু স্পনসরশিপ চুক্তির সুবাদে উন্নয়নের জন্য বাজেটে টাকা এসেছে।
বাজেটের একটি অংশ ব্যবহার করা হচ্ছে কিছু টেলিমেট্রি সরবরাহ করতে।
স্পনসরদের খুশি রাখতে গাড়িটিতে একটি প্যানেল বসানো হয়েছে, যা ট্র্যাকের চারপাশে ঘোরার সময় স্পনসরদের নাম দেখাবে।
আপনি খেয়াল করবেন, এই ফ্যান্সি নতুন প্রযুক্তিগুলো চালু হওয়ায় গাড়িটির ব্যাটারি লাইফ নাটকীয়ভাবে কমে গেছে।
এক বা একাধিক স্পনসরের নাম নিয়ে সেগুলো গাড়িতে সংরক্ষণ করতে SetSponsors() ইমপ্লিমেন্ট করুন।
মনে রাখবেন, SetSponsors() মেথডের আর্গুমেন্ট কখনোই null হবে না।
নির্বাচিত স্পন্সরটি দেখাতে DisplaySponsor() ইমপ্লিমেন্ট করুন। প্রথম যে স্পন্সরটি পাস করা হয় তার sponsorNum হয় 0, দ্বিতীয়টির 1, এভাবে চলতে থাকে।
var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"
RemoteControlCar.GetTelemetryData() মেথডটি ইমপ্লিমেন্ট করুন।
GetTelemetryData() যেন out প্যারামিটারের মাধ্যমে ব্যাটারি পার্সেন্টেজ এবং মিটারে অতিক্রান্ত দূরত্ব available করে, তা নিশ্চিত করবে।
serialNum আর্গুমেন্ট আগে পাওয়া মানের চেয়ে ছোট হলে GetTelemetryData() false রিটার্ন করবে। (এখানে একাধিক টেলিমেট্রি নোড জড়িত থাকার একটি সমস্যা আছে)। এক্ষেত্রে serialNum-এর মান আগের সবচেয়ে বড় serialNum হিসেবে সেট হবে, আর ব্যাটারি পার্সেন্টেজ ও অতিক্রান্ত মিটার দুটোই -1 হিসেবে সেট হবে। কলটি সফল হলে serialNum অপরিবর্তিত থাকে।
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
int serialNum = 4;
car.GetTelemetryData(ref serialNum, out int batteryPercentage, out int distanceDrivenInMeters);
// => true, 4L, 80, 4
serialNum = 1;
car.GetTelemetryData(ref serialNum, out batteryPercentage, out distanceDrivenInMeters);
// => false, 4L, -1, -1
TelemetryClient.GetBatteryUsagePerMeter() মেথডটি ইমপ্লিমেন্ট করুন।
এটি RemoteControlCar.GetTelemetryData() কল করবে। GetTelemetryData() false রিটার্ন করলে বা গাড়ি চালানো না হয়ে থাকলে, এই রুটিনটি "no data" রিটার্ন করবে। GetTelemetryData() true রিটার্ন করলে নিচের ধরনের একটি মেসেজ রিটার্ন করতে হবে: "usage-per-meter=BATTERY-USAGE-PER-METER"। এখানে হিসাবটি হলো, (100 - বর্তমান ব্যাটারি পার্সেন্টেজ) কে এখন পর্যন্ত অতিক্রান্ত দূরত্বের (মিটারে) দ্বারা ভাগ করা হয়।
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
var tc = new TelemetryClient(car);
int serialNum = 4;
tc.GetBatteryUsagePerMeter(serialNum);
// => "usage-per-meter=5"
serialNum = 1;
tc.GetBatteryUsagePerMeter(serialNum);
// => "no data"
Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।