রুটি ও পোশন

রুটি ও পোশন

লার্নিং অনুশীলনী

ভূমিকা

প্রোটোকল

প্রোটোকল হলো Elixir-এ পলিমরফিজম অর্জনের একটি মেকানিজম, যখন আপনি চান আচরণ ডেটা টাইপের উপর নির্ভর করে ভিন্ন হোক।

প্রোটোকল defprotocol দিয়ে ডিফাইন করা হয় এবং এতে এক বা একাধিক ফাংশন হেডার থাকে।

defprotocol Reversible do
  def reverse(term)
end

প্রোটোকল defimpl দিয়ে ইমপ্লিমেন্ট করা যায়।

defimpl Reversible, for: List do
  def reverse(term) do
    Enum.reverse(term)
  end
end

যেকোনো বিদ্যমান Elixir ডেটা টাইপের জন্য বা একটি স্ট্রাক্টের জন্য প্রোটোকল ইমপ্লিমেন্ট করা যায়।

কোনো প্রোটোকল ফাংশন কল করা হলে, প্রথম আর্গুমেন্টের টাইপের ভিত্তিতে উপযুক্ত ইমপ্লিমেন্টেশন স্বয়ংক্রিয়ভাবে বেছে নেওয়া হয়।

নির্দেশনা

আপনি নিজের একটি রোল-প্লেয়িং ভিডিও গেম তৈরি করছেন। আপনার গেমে ক্যারেক্টার ও আইটেম আছে। একটি আইটেম নিয়ে আপনি যে অনেকগুলো কাজ করতে পারেন, তার একটি হলো ক্যারেক্টারকে সেটি খাওয়ানো।

সব আইটেম খাওয়ার যোগ্য নয়, আর সব খাওয়ার যোগ্য আইটেম ক্যারেক্টারের ওপর একই রকম প্রভাব ফেলে না। কিছু আইটেম খাওয়া হলে অন্য একটি আইটেমে পরিণত হয় (যেমন আপনি যদি একটি আপেল খান, তবে আপনার হাতে আপেলের কোর পড়ে থাকে)।

এই সব নমনীয়তা সম্ভব করতে আপনি একটি Edible প্রোটোকল তৈরির সিদ্ধান্ত নিলেন, যা কিছু আইটেম ইমপ্লিমেন্ট করতে পারে।

1. খাওয়ার যোগ্যতা ডিফাইন করুন

RPG.Edible প্রোটোকলটি তৈরি করুন। প্রোটোকলটিতে একটি মাত্র ফাংশন আছে: eat। eat ফাংশনটি একটি আইটেম ও একটি ক্যারেক্টার গ্রহণ করে এবং একটি উপজাত ও একটি ক্যারেক্টার রিটার্ন করে।

2. পাউরুটি খাওয়ার যোগ্য বানান

RPG.LoafOfBread আইটেমের জন্য RPG.Edible প্রোটোকল ইমপ্লিমেন্ট করুন। খাওয়া হলে একটি পাউরুটি ক্যারেক্টারকে ৫ হেলথ পয়েন্ট দেয় এবং কোনো উপজাত তৈরি করে না।

RPG.Edible.eat(%RPG.LoafOfBread{}, %RPG.Character{health: 31})
# => {nil, %RPG.Character{health: 36, mana: 0}}

3. ম্যানা পোটিয়ন খাওয়ার যোগ্য বানান

RPG.ManaPotion আইটেমের জন্য RPG.Edible প্রোটোকল ইমপ্লিমেন্ট করুন। খাওয়া হলে একটি ম্যানা পোটিয়ন ক্যারেক্টারকে পোটিয়নের শক্তির সমান ম্যানা পয়েন্ট দেয় এবং একটি খালি বোতল তৈরি করে।

RPG.Edible.eat(%RPG.ManaPotion{strength: 13}, %RPG.Character{mana: 50})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 100, mana: 63}}

4. বিষ খাওয়ার যোগ্য বানান

RPG.Poison আইটেমের জন্য RPG.Edible প্রোটোকল ইমপ্লিমেন্ট করুন। খাওয়া হলে একটি বিষ ক্যারেক্টারের সব হেলথ পয়েন্ট কেড়ে নেয় এবং একটি খালি বোতল তৈরি করে।

RPG.Edible.eat(%RPG.Poison{}, %RPG.Character{health: 3000})
# => {%RPG.EmptyBottle{}, %RPG.Character{health: 0, mana: 0}}
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elixir Exercism

রুটি ও পোশন শুরু করতে প্রস্তুত?

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