ট্র্যাক
/
Go
Go
/
অনুশীলনী
/
বিমানবন্দরের রোবট
বিমানবন্দরের রোবট

বিমানবন্দরের রোবট

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

ভূমিকা

মেথডের সেট হিসেবে ইন্টারফেস

সবচেয়ে সহজ রূপে বলতে গেলে, একটি ইন্টারফেস টাইপ হলো মেথড সিগনেচারের একটি সেট। নিচে একটি ইন্টারফেস ডেফিনিশনের উদাহরণ দেওয়া হলো, যেখানে Add আর Value নামের দুটি মেথড আছে:

type Counter interface {
    Add(increment int)
    Value() int
}

increment-এর মতো প্যারামিটারের নাম ইন্টারফেস ডেফিনিশন থেকে বাদ দেওয়া যায়, তবে এগুলো থাকলে সাধারণত কোড পড়তে সুবিধা হয়।

Go-তে ইন্টারফেসের নামে Interface বা I শব্দটি থাকে না। বরং এগুলো প্রায়শই er দিয়ে শেষ হয়, যেমন Reader, Stringer.

ইন্টারফেস ইমপ্লিমেন্ট করা

যে টাইপই ইন্টারফেসের মেথডগুলো ডিফাইন করে, সেটি স্বয়ংক্রিয়ভাবেই ইন্টারফেসটি "ইমপ্লিমেন্ট" করে ফেলে। Go-তে implements নামের কোনো কিওয়ার্ড নেই।

নিচের টাইপটি আমরা উপরে যে Counter ইন্টারফেস দেখেছি, সেটি ইমপ্লিমেন্ট করে।

type Stats struct {
    value int
    // ...
}

func (s Stats) Add(v int) {
    s.value += v
}

func (s Stats) Value() int {
    return s.value
}

func (s Stats) SomeOtherMethod() {
    // The type can have additional methods not mentioned in the interface.
}

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

ইন্টারফেস টাইপের একটি মান তার ভেতরে এমন যেকোনো মান ধারণ করতে পারে, যেটি ওই মেথডগুলো ইমপ্লিমেন্ট করে। [^1]

এর মানে হলো, এখন যেসব জায়গায় Counter ইন্টারফেস প্রত্যাশিত, সেসব জায়গায় Stats ব্যবহার করা যায়।

func SetUpAnalytics(counter Counter) {
    // ...
}

stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter

ইন্টারফেস যেহেতু স্বয়ংক্রিয়ভাবে ইমপ্লিমেন্ট হয়, তাই একটি টাইপ সহজেই একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে। এর জন্য শুধু প্রয়োজনীয় সব মেথড ডিফাইন করা থাকলেই যথেষ্ট।

খালি ইন্টারফেস

Go-তে একটি খুব বিশেষ ইন্টারফেস টাইপ আছে, যাকে বলে খালি ইন্টারফেস, যাতে একটিও মেথড থাকে না। খালি ইন্টারফেস এভাবে লেখা হয়: interface{}. any হলো interface{}-এর একটি অ্যালিয়াস, আর এটি বেশি ব্যবহৃত হয়।

খালি ইন্টারফেসে যেহেতু কোনো মেথড নেই, তাই প্রতিটি টাইপই এটিকে স্বয়ংক্রিয়ভাবে ইমপ্লিমেন্ট করে। এটি এমন একটি ফাংশন ডিফাইন করার জন্য কাজে লাগে, যা সাধারণভাবে যেকোনো মান গ্রহণ করতে পারে। সেক্ষেত্রে ফাংশনের প্যারামিটারটি খালি ইন্টারফেস টাইপের হয়।

নির্দেশনা

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

কাজে আপনার প্রথম দায়িত্ব হলো এমন একটি প্রোগ্রাম লেখা, যাতে রোবট সেলফ-চেক-ইন কাউন্টারে মানুষ তাদের পাসপোর্ট স্ক্যান করার পর তাদের মাতৃভাষায় স্বাগত জানাতে পারে।

রোবট নিজের দক্ষতা নিয়ে গর্বিত, তাই সে সবসময় আগে বলে দেবে সে কোন ভাষায় কথা বলতে পারে, তারপর ওই ব্যক্তিকে স্বাগত জানাবে। উদাহরণস্বরূপ, কেউ যদি জার্মান পাসপোর্ট স্ক্যান করে, রোবট বলবে:

I can speak German: Hallo Dietrich!

1. অ্যাবস্ট্রাক্ট স্বাগত-জানানোর ফাংশনালিটি তৈরি করুন

বিভিন্ন ভাষার কোড আপনি নিজে লিখবেন না, তাই রোবটের কোড এমনভাবে সাজাতে হবে যাতে অন্য ডেভেলপাররা পরে সহজেই আরও ভাষা যোগ করতে পারেন।

প্রথম ধাপ হিসেবে, দুটি মেথডসহ একটি ইন্টারফেস Greeter ডিফাইন করুন।

  • LanguageName, যা সেই ভাষার নাম (একটি string) রিটার্ন করে, যে ভাষায় রোবট দর্শনার্থীকে স্বাগত জানানোর কথা।
  • Greet, যা দর্শনার্থীর নাম (একটি string) নেয় এবং নির্দিষ্ট একটি ভাষায় স্বাগত-বার্তাসহ একটি string রিটার্ন করে।

এরপর একটি ফাংশন SayHello ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে দর্শনার্থীর নাম এবং Greeter ইন্টারফেস ইমপ্লিমেন্ট করে এমন যেকোনো কিছু নেয় এবং কাঙ্ক্ষিত স্বাগত-স্ট্রিং রিটার্ন করে। উদাহরণস্বরূপ, একটি জার্মান Greeter ইমপ্লিমেন্টেশন কল্পনা করুন, যেখানে LanguageName রিটার্ন করে "German" এবং Greet রিটার্ন করে "Hallo {name}!":

SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"

2. ইতালীয় ভাষা ইমপ্লিমেন্ট করুন

এখন আপনার কাজ হলো ইতালীয় পাসপোর্ট স্ক্যান করা মানুষদের জন্য রোবটটিকে কাজ করানো।

সেজন্য একটি স্ট্রাক্ট Italian তৈরি করুন এবং টাস্ক ১-এ আপনি যে Greeter ইন্টারফেসটি তৈরি করেছিলেন, সেটি পূরণ করার জন্য স্ট্রাক্টটির যে দুটি মেথড দরকার, সেগুলো ইমপ্লিমেন্ট করুন। ইতালীয় ভাষায় আপনি কাউকে "Ciao {name}!" দিয়ে স্বাগত জানাতে পারেন.

3. পর্তুগিজ ভাষা ইমপ্লিমেন্ট করুন

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

সেজন্য একটি স্ট্রাক্ট Portuguese তৈরি করুন এবং এখানেও স্ট্রাক্টটি Greeter ইন্টারফেস পূরণ করার জন্য প্রয়োজনীয় দুটি মেথড ইমপ্লিমেন্ট করুন। পর্তুগিজ ভাষায় আপনি কাউকে "Olá {name}!" দিয়ে স্বাগত জানাতে পারেন.

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

বিমানবন্দরের রোবট শুরু করতে প্রস্তুত?

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