Two Fer

Two Fer

সহজ

ভূমিকা

ইংরেজির কিছু উচ্চারণে, আপনি যখন দ্রুত "two for" বলেন, তখন তা "two fer"-এর মতো শোনায়। Two-for-one বলতে বোঝায় যে আপনি যদি একটি কেনেন, তবে আরেকটি বিনামূল্যে পান। তাই "two-fer" শব্দবন্ধটি প্রায়ই একটি two-for-one অফার বোঝায়।

ভাবুন একটি বেকারি, যেখানে ছুটির একটি অফার আছে: আপনি একটির দামে দুটি কুকি কিনতে পারেন ("two-fer one!")। আপনি অফারটি নেন এবং (খুবই উদারভাবে) বাড়তি কুকিটি লাইনে দাঁড়ানো অন্য কাউকে দিয়ে দেওয়ার সিদ্ধান্ত নেন।

নির্দেশনা

বাড়তি কুকিটি কাউকে দিয়ে দেওয়ার সময় আপনি কী বলবেন, তা নির্ধারণ করাই আপনার কাজ।

যদি আপনি ব্যক্তিটির নাম জানেন (যেমন তাঁর নাম যদি Do-yun হয়), তাহলে আপনি বলবেন:

One for Do-yun, one for me.

যদি আপনি ব্যক্তিটির নাম না জানেন, তাহলে তার বদলে you বলবেন।

One for you, one for me.

এখানে কিছু উদাহরণ দেওয়া হলো:

নাম সংলাপ
Alice One for Alice, one for me.
Bohdan One for Bohdan, one for me.
One for you, one for me.
Zaphod One for Zaphod, one for me.

Odin-নির্দিষ্ট নির্দেশনা

Odin ডিফল্ট আর্গুমেন্ট সাপোর্ট করে। ডিফল্ট আর্গুমেন্ট একটি দরকারি ফিচার; এটি দিয়ে এমন ক্ষেত্রে একটি প্রোসিডিউরকে ভিন্ন ভিন্ন সেটের প্যারামিটার নিয়ে কল করা যায়, যেখানে আপনার প্রয়োজন পরস্পর সম্পর্কিত কিন্তু ভিন্ন ভিন্ন API।

ডিফল্ট আর্গুমেন্ট না থাকলে আপনার API-এর জন্য যত প্রোসিডিউর লাগবে তার সংখ্যা হঠাৎ অনেক বেড়ে যেতে পারে। Java-র মতো যে ভাষাগুলো ডিফল্ট আর্গুমেন্ট সাপোর্ট করে না, তারা একই ফল পেতে মেথড ওভারলোডিংয়ের উপর নির্ভর করে (বেশি কোড লিখে), নয়তো সম্ভাব্য অনেক আর্গুমেন্টসহ আলাদা প্রোসিডিউর দিতে হয়।

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

আমরা সব আর্গুমেন্টসহ একটি একক প্রোসিডিউর বানাতে পারতাম:

greeting :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {
	...
}

এতে সব ব্যবহারকারীকে সব আর্গুমেন্টের ডকুমেন্টেশন পড়তে বাধ্য হতে হতো এবং সবসময় সেগুলো পূরণ করতে হতো।

ডিফল্ট আর্গুমেন্ট ছাড়া আমরা ভিন্ন ভিন্ন সেটের প্যারামিটার নিয়ে একাধিক প্রোসিডিউরও ডিফাইন করতে পারতাম:

greeting_common :: proc(name: string) {...}

greeting_with_exclamation :: proc(name: string) {...}

greeting_general :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {...}

// Odin supports overloading but it has to be explicitly defined
greeting :: proc {
	greeting_common,
	greeting_with_exclamation,
	greeting_general,
}

যদি আপনার ভাষা ডিফল্ট আর্গুমেন্ট সাপোর্ট করে, যেমনটি Odin করে, তাহলে আপনি সবচেয়ে কম ব্যবহৃত আর্গুমেন্টগুলোতে শুধু বুদ্ধিসম্মত ডিফল্ট দিলেই চলবে। কলকারীরা ডিফল্ট আর্গুমেন্টগুলো বাদ দিতে পারে, ফলে প্রোসিডিউর প্রদত্ত ডিফল্টগুলোই ব্যবহার করবে; অথবা সেগুলো ওভাররাইড করতে পারে।

greeting :: proc(name: string, language: Language = Language.English, do_uppercase : bool = false, add_exclamation: bool = false) {...}

// Note: because Odin supports type inference, we can simplify the interface.
greeting :: proc(name: string, language:= Language.English, do_uppercase := false, add_exclamation:= false) {...}

সব আর্গুমেন্ট ডিফল্ট রেখেই প্রোসিডিউরটি কল করা যায়:

greeting("John Doe")

কলকারীর কাছে গুরুত্বপূর্ণ আর্গুমেন্ট ওভাররাইট করা যায়:

greeting("John Doe", Language.Spanish)

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

greeting("John Doe", add_exclamation=true)

মেমরি ম্যানেজমেন্ট

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

// The procedure will be called like that:
str := two_fer("Alice")
// ...
// and eventually the caller will delete the string
delete(str)

Odin-এর অফিসিয়াল ডকুমেন্টেশনেও আপনার আগ্রহ থাকতে পারে, যেখানে ডিফল্ট আর্গুমেন্ট এবং Odin-এর নেমড আর্গুমেন্ট নিয়ে আলোচনা আছে।


সূত্র

এই অনুশীলনীর সূত্র ঘুরে দেখুন।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Odin Exercism

Two Fer শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Odin ট্র্যাকের 73টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।