Write reusable and maintainable code creating packages in Go

Go প্রোগ্রামিং ল্যাঙ্গুয়েজ a.k.a golang-এ কোড করার সময় আমরা বিভিন্ন কাজ সহজে করার জন্য প্যাকেজ ব্যবহার করে থাকি। প্যাকেজগুলোর মধ্যে সাধারণত থাকে Go Standard Library প্যাকেজ, Other Package যেগুলো আমরা ইম্পোর্ট করি। কোড পুনরায় ব্যবহার করার জন্য এবং ম্যানেজ করার জন্য নিজেদের তৈরী করা প্যাকেজও ব্যবহার করি, যা আমাদের প্রোজেক্ট ডিরেক্টরিতে থাকে। সহজভাবে বলতে গেলে, প্যাকেজ এমন একটি জিনিস যার কাছ থেকে আমরা কিছু সুসম্পর্কিত ফিচারসমুহ একসাথে পেয়ে থাকি। প্যাকেজ ব্যবহার করার সুবিধা আসলে অনেক, এতে করে কোড রিপিটেশন কমে যায়, কোড মেইন্টেইন করা সহজ হয় ও পুনরায় ব্যবহার করা যায়। এমনকি চাইলে প্যাকেজটি স্বতন্ত্র (স্ট্যান্ডেলন) ভাবেও রাখা যায়।

আমরা এখন একটি সহজ প্যাকেজের কোড লিখবো এবং সেটার বিস্তারিত জানবো। প্রথমে আমি বলে নেই আমাদের প্রোজেক্টের গঠনটা ঠিক কেমন হবে-

project-directory
       |-package-folder
            |-hello.go
       |-main.go

আমরা এখন একটি প্যাকেজ লিখবো তার ভিতর একটা ফাংশন থাকবে যেটা বাইরে ব্যবহার করা যাবে (এক্সপোর্টেবল)। আমরা এখন প্যাকেজটি লিখে ফেলি। মনে রাখতে হবে, আমরা কিন্তু এইটা লিখছি আমাদের প্রোজেক্টের ভিতরের package-folder

আমরা এবার বিস্তারিত ভাবে দেখি কোনটা কি কাজ করে।

github.com/username/gopkg/greetings/hello.go কমেন্টের ভিতরে লেখা এই লাইনটি আসলে আমাদের প্রোজেক্ট ডিরেক্টরি। gopkg মুলত project-directory আর greetings মুলত package-folder

package greetings দিয়ে আমরা প্যাকেজের নাম দিয়েছি। আমাদের প্যাকেজের নাম greetings

import "fmt" দিয়ে বিল্ট-ইন একটা প্যাকেজ ইম্পোর্ট করেছি, যা দিয়ে স্ট্যান্ডার্ড ইনপুট/আউটপুটের ফরম্যাট করা হয়। আপনি যদি কখনো C/C++ এ কোড করে থাকেন তাহলে হয়ত জানবেন যে, আমরা এইটা stdio.h কিংবা iostream দিয়ে করতাম।

type Greet struct দিয়ে একটা struct ডিক্লেয়ার করা হয়েছে, যার কিছু সদস্য ভেরিয়েবল থাকবে। এখানে একটা স্ট্রিং টাইপের Name ভেরিয়েবল নেওয়া হয়েছে।

func (g *Greet) Hello() string দিয়ে একটা Hello() রিসিভার ফাংশন নিয়েছি যা স্ট্রিং টাইপ ভ্যালু রিটার্ন করে। মজার বিষয়টা এখানেই, আমরা চাইলেই কিন্তু এখানে Hello(Name string) ফাংশনে একটা স্ট্রিং টাইপ ভেরিয়েবল প্যারামিটার হিসেবে দিতে পারতাম। কিন্তু সেটা না করে একটা রিসিভার ফাংশন ব্যবহার করলাম। যার ফলে আমাকে বার বার প্যারামিটার পাস করতে হবেনা, Hello() ফাংশনটা একটা Greet টাইপ স্ট্র্যাক্ট গ্রহণ করতে পারে। রিসিভার ফাংশনের সুবিধা যখন বড় কোড লিখবো বা প্রোজেক্টে কাজ করবো আমরা তখন বুঝতে পারবো ভালভাবে। আর ইন্টারফেস ব্যবহার করার সময় রিসিভার ফাংশনের ব্যবহার বহুল। সেটা নিয়ে নাহয় আরেকদিন লিখা যাবে। চাইলে আপনি গুগল করে দেখে পারেন।

return দিয়ে আমরা একটা স্ট্রিং রিটার্ন করেছি যা fmt প্যাকেজ দিয়ে ফরম্যাট করা।

আমাদের প্যাকেজের কোড লিখা শেষ। এখন আমরা প্যাকেজটি ব্যবহার করার জন্য project-directory‘র রুটে main.go ফাইলে main প্যাকেজ লিখবো, যেখানে মুলত পুরো প্রোজেক্টটি রান করা হবে।

আমরা উপরে কিছু বিস্তারিত লিখেছি। এখন নতুন টার্ম গুলোর বিস্তারিত উল্লেখ করবো।

msg "github.com/username/gopkg/greetings" দিয়ে আমারা আমাদের প্যাকেজটি ইম্পোর্ট করেছি। এবং সহজে ব্যবহারের জন্য msg ভেরিয়েবলে ডিক্লেয়ার করেছি। আমরা এখন msg ভেরিয়েবলের মাধ্যমে প্যাকেজের ফিচারটি(ফাংশন) ব্যবহার করতে পারবো।

my_name ভেরিয়েবল ইনিশিয়ালাইজ করা হয়েছে একটি ভ্যালু এসাইন করে। := দিয়ে ডিক্লেয়ার করার টেকনিকটাকে বলে শর্ট হ্যান্ড। শর্ট হ্যান্ড ডিক্লারেশনে ভ্যালুর উপর ভিত্তি করে ডাটা টাইপ অটোমেটিকভাবে নির্ধারিত হয়। এইটা শর্ট হ্যান্ড ব্যবহারের একটা ভাল সুবিধা।

message অংশেও আমরা আমাদের প্যাকেজের Greet স্ট্র্যাক্টে ভ্যালু ইনিশিয়ালাইজ করেছি। উপরে উল্লেখ ছিল যে, প্যাকেজটি ইম্পোর্ট ডিক্লারেশন করেছি msg ভেরিয়েবলে।

তারপর message এর রিসিভার ফাংশন Hello() কলে করা হয়েছে এবং দেখানো হয়েছে।

আমাদের প্যাকেজ লেখা শেষ তাহলে এখন প্রোজেক্টটি রান করা যাক নিচের কমান্ড দিয়ে-

go run main.go

সব ঠিক থাকলে নিচের আউটপুটটি পাওয়া যাবে-

Hello! Humaun Kabir

ব্যাস! আমরা সফলভাবে একটি প্যাকেজ লিখলাম এবং তার বিস্তারিত জানলাম। আমরা চাইলে এই প্যাকেজটি GitHub এ একটা রিপোজিটরিতে রাখতে পারি এবং ব্যবহার করতে পারি। আবার go get github.com/username/mypackage কমান্ড ব্যবহার যে কেউ তখন প্যাকেজটি ব্যবহার করতে পারবে।

যতটা সম্ভব বিস্তারিত এবং সহজভাবে লেখার চেষ্টা করেছি, ভুল ত্রুটি থাকলে আমাকে জানাবেন, সবার শেখার ধারা অব্যাহত থাকুক। ধন্যবাদ 🙂

Sharing is caring