ক্লাস হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং-এর একটি কেন্দ্রীয় ধারণা। Crystal-এ সবকিছুই একটি অবজেক্ট, প্রতিটি অবজেক্টের একটি টাইপ থাকে, আর সে কিছু মেথডে সাড়া দিতে পারে। ক্লাস হলো অবজেক্ট তৈরির নকশা, যা ভ্যারিয়েবলের মতো স্টেটের জন্য প্রাথমিক মান আর মেথডের মতো আচরণের বাস্তবায়ন দেয়। অবজেক্ট হলো ক্লাসের ইনস্ট্যান্স, যা সব ইনস্ট্যান্স ভ্যারিয়েবল ও স্টেট ধরে রাখে।
class কিওয়ার্ড ব্যবহার করে একটি ক্লাস ডিফাইন করা হয়, তারপর UpperCamelCase-এ লেখা ক্লাসের নাম থাকে।
class Account
end
একটি ক্লাসের ইনস্ট্যান্স তৈরি করতে, new মেথড ব্যবহার করে ক্লাসের নাম কল করুন।
class Account
end
account = Account.new
উপরের উদাহরণে account ভ্যারিয়েবলটি Account ক্লাসের একটি ইনস্ট্যান্স।
ইনস্ট্যান্স তৈরি করার সময় initialize নামের একটি বিশেষ মেথড কনস্ট্রাক্টর হিসেবে কাজ করে।
ইনস্ট্যান্স তৈরি হলে এটি কল করা হয়।
কনস্ট্রাক্টরটি আপনাকে ইনস্ট্যান্সের প্রাথমিক স্টেট সেট করার সুযোগ দেয়।
initialize মেথড আর্গুমেন্ট নিতে পারে, যা ইনস্ট্যান্স তৈরির সময় পাস করা হয়।
class Account
def initialize(number)
5 + number # => 9
end
end
Account.new(4)
initialize মেথড হাতে করে কোনো মান রিটার্ন করতে পারে না; এর বদলে new নতুন তৈরি হওয়া ইনস্ট্যান্সটি রিটার্ন করে।
class Account
def initialize(number)
5 + number
end
end
Account.new(4)
# => #<Account:0x7f5dc33dcea0>
ইনস্ট্যান্স মেথড হলো এমন একটি মেথড, যা একটি ক্লাসের ইনস্ট্যান্সে পাওয়া যায় এবং ওই ইনস্ট্যান্সে কল করা যায়।
ইনস্ট্যান্স মেথড def কিওয়ার্ড ব্যবহার করে ডিফাইন করা হয়, তারপর মেথডের নাম থাকে।
এগুলো ক্লাস ডেফিনিশনের ভেতরে ডিফাইন করা হয়।
class Account
def balance
100
end
end
account = Account.new
account.balance # => 100
ইনস্ট্যান্স ভ্যারিয়েবল হলো এমন ভ্যারিয়েবল, যা ইনস্ট্যান্সের সব মেথডে পাওয়া যায়।
একটি ইনস্ট্যান্স ভ্যারিয়েবল অ্যাক্সেস করতে হলে আপনাকে একটি ইনস্ট্যান্স মেথড ডিফাইন করতে হবে।
এগুলো initialize মেথডে ইনিশিয়ালাইজ করা যায়।
এগুলো @ প্রিফিক্স ব্যবহার করে ডিফাইন করা হয়।
class Account
def initialize
@balance = 100
end
def balance
@balance
end
end
account = Account.new
account.balance
# => 100
ইনস্ট্যান্স ভ্যারিয়েবল ক্লাস ডেফিনিশনের ভেতরেও ডিফাইন করা যায়।
class Account
@age = 0
end
initialize মেথডে পাস করা আর্গুমেন্ট দিয়ে ইনস্ট্যান্স ভ্যারিয়েবল ইনিশিয়ালাইজ করা যায়।
ইনিশিয়ালাইজেশনের সময় ব্যবহৃত আর্গুমেন্টের টাইপ Crystal অনুমান করতে পারে না, তাই এটি উল্লেখ করতে হয়।
এই বিষয়ে আরও পড়তে চাইলে পড়ুন: টাইপ ইনফারেন্স।
ভ্যারিয়েবলের টাইপ উল্লেখ করতে : চিহ্ন ব্যবহার করা যায়, তারপর টাইপ লিখতে হয়।
উদাহরণস্বরূপ, Int32 টাইপের balance নামের একটি ইনস্ট্যান্স ভ্যারিয়েবল তৈরি করতে চাইলে এভাবে করতে পারেন: @balance : Int32।
অথবা Bool টাইপের raining নামের একটি ইনস্ট্যান্স ভ্যারিয়েবল তৈরি করতে চাইলে এভাবে করতে পারেন: @raining : Bool।
এটি বাস্তবায়নের কয়েকটি উপায় আছে। একটি হলো initialize মেথডে টাইপ-সহ আর্গুমেন্ট ঘোষণা করা, তারপর আর্গুমেন্টটি ইনস্ট্যান্স ভ্যারিয়েবলে অ্যাসাইন করা, যেমন নিচের উদাহরণে:
class Account
def initialize(balance : Int32)
@balance = balance
end
def balance
@balance
end
end
account = Account.new(1)
account_2 = Account.new(5)
account.balance
# => 1
account_2.balance
# => 5
আরেকটি উপায় হলো ক্লাস ডেফিনিশনে @<variable> : <Type> আকারে ইনস্ট্যান্স ভ্যারিয়েবলের টাইপ ঘোষণা করা, যেমন নিচের উদাহরণে:
class Weather
@raining : Bool
def initialize(raining)
@raining = raining
end
def raining
@raining
end
end
weather = Weather.new(true)
weather.raining
# => true
মেথড ইনস্ট্যান্স ভ্যারিয়েবল পরিবর্তন করতে পারে। এই মেথডগুলো ক্লাসের ইনস্ট্যান্সে কল করা যায়। কোনো মেথড ইনস্ট্যান্স ভ্যারিয়েবল পরিবর্তন করলে সেই পরিবর্তন কেবল যে ইনস্ট্যান্সে কল করা হয়েছে সেখানেই পাওয়া যায়।
class Account
def initialize(balance : Int32)
@balance = balance
end
def withdraw(amount)
@balance -= amount
end
def balance
@balance
end
end
account = Account.new(10)
account_2 = Account.new(10)
account.balance
# => 10
account_2.balance
# => 10
account.withdraw(5)
account.balance
# => 5
account_2.balance
# => 10
ক্লাস মেথড হলো এমন মেথড, যা একটি ক্লাসের জন্য ডিফাইন করা হয়, কিন্তু তার ইনস্ট্যান্সের জন্য নয়।
এগুলো ইনস্ট্যান্সের স্টেটের ওপর নির্ভর করে না, এমন মেথড তৈরির একটি উপায় দেয়।
এগুলো def কিওয়ার্ড ব্যবহার করে ডিফাইন করা হয়, তারপর self.<method name> থাকে।
self হলো এমন নেমস্পেসের একটি রেফারেন্স, যা থেকে self কল করা হচ্ছে।
এক্ষেত্রে এটি Account ক্লাসকে বোঝায়।
এটি Account. লেখার মতোই হতো, তবে self. হলো পছন্দনীয় উপায়।
class Account
def self.balance
100
end
end
Account.balance
# => 100
আপনার বন্ধু Johannes DIY (নিজে হাতে বানানো) হার্ডওয়্যার তৈরি করতে ভালোবাসেন। তিনি সবে একটি জুস মেকার বানিয়েছেন, আর এতে Johannes দারুণ উচ্ছ্বসিত। Johannes-এর লক্ষ্য হলো প্রতিদিন সকালে টাটকা জুস বানাতে পারা।
Johannes জুস মেকারে অনেক দারুণ ফিচার আছে। যেমন একটি বিল্ট-ইন মাপার ব্যবস্থা, যা বলে দিতে পারে কাপে কতটুকু জুস আছে। এতে একটি টাইমারও আছে, যা জানায় মেশিনটি কতক্ষণ ধরে চলছে।
Johannes প্রোগ্রামিংয়ে খুব একটা পারদর্শী নন, তবে তিনি মেশিনটি নিয়ন্ত্রণ করার একটি প্রোগ্রাম বানাতে চান। তাই তিনি আপনাকে সাহায্য করার জন্য অনুরোধ করেছেন।
মেশিনটিতে একটি ডিবাগ লাইট আছে, এটা খুব সহজ একটি ব্যবস্থা: মেশিনে পাওয়ার থাকলে ডিবাগ লাইট জ্বলে থাকে। ডিবাগ লাইট জ্বলে থাকলেই কেবল প্রোগ্রামটি চলবে।
এই মেথডটি JuiceMaker ক্লাসের একটি ক্লাস মেথড হওয়া উচিত।
JuiceMaker.debug_light_on? ক্লাস মেথডটি ডিফাইন করুন, যা true রিটার্ন করে।
JuiceMaker.debug_light_on?
#=> true
মেশিনে পাওয়ার দিলে সেটি JuiceMaker নামের একটি ক্লাসের ইনস্ট্যান্স তৈরি করবে।
মেশিনটির একটি ইনিশিয়ালাইজড স্টেট থাকার কথা।
ইনিশিয়ালাইজড স্টেটে নিচের তথ্যগুলো থাকবে:
false থাকবে।ইনিশিয়ালাইজড স্টেটটি ডিফাইন করুন, যা প্যারামিটার হিসেবে কাপে জুসের পরিমাণ নেয়, এবং ইনিশিয়ালাইজড স্টেটটি তৈরি করুন।
ইনিশিয়ালাইজড স্টেটে একটি ইনস্ট্যান্স ভ্যারিয়েবল @running থাকবে, যা false সেট করা, আর একটি ইনস্ট্যান্স ভ্যারিয়েবল @fluid থাকবে, যা ক্লাস ইনিশিয়ালাইজ করার সময় দেওয়া আর্গুমেন্টের ওপর ভিত্তি করে তৈরি হয়।
JuiceMaker.new(5)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=5>
মেশিন চালু ও বন্ধ করা যায়।
মেশিন চালু করার জন্য আপনাকে একটি মেথড ডিফাইন করতে হবে।
মেশিন চালু করলে রানিং স্টেট true সেট হবে।
JuiceMaker#start মেথডটি ডিফাইন করুন, যা মেশিন চালু করে।
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=true, @fluid=5>
মেশিনটির নিজের স্ট্যাটাস আপনাকে জানাতে পারা দরকার।
মেশিন চললে এটি true রিটার্ন করবে, আর মেশিন না চললে false।
JuiceMaker#running? মেথডটি ডিফাইন করুন, যা মেশিনের স্ট্যাটাস রিটার্ন করে।
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker.running?
#=> true
মেশিন কাপে জুস যোগ করতে পারে। কাপে কতটুকু জুস যোগ করা হলো, তা মেশিন বলতে পারে। জুস যোগ করার পর কাপে কতটুকু জুস আছে, তা জানার জন্য মেশিনের সাহায্য দরকার।
JuiceMaker#add_fluid মেথডটি ডিফাইন করুন, যা প্যারামিটার হিসেবে যোগ করা জুসের পরিমাণ নেয় এবং কাপে জুসের পরিমাণ হালনাগাদ করে।
juice_maker = JuiceMaker.new(5)
juice_maker.add_fluid(5)
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=10>
মেশিন চালু ও বন্ধ করা যায়।
মেশিন বন্ধ করার জন্য আপনাকে একটি মেথড ডিফাইন করতে হবে
এই মেথডটি কেবল মেশিন চলার সময়ই কল করা হবে।
মেশিন বন্ধ করলে রানিং স্টেট false সেট হবে।
মেশিন বন্ধ হওয়ার পর কাপে কতটুকু জুস আছে, তা নির্ধারণের জন্যও মেশিনের সাহায্য দরকার।
মেশিন প্রতি মিনিটে পাঁচ ইউনিট জুস খরচ করে।
JuiceMaker#stop মেথডটি ডিফাইন করুন, যা প্যারামিটার হিসেবে মেশিন কত মিনিট ধরে চলছে তা নেয় এবং মেশিন বন্ধ হওয়ার পর কাপে জুসের পরিমাণ রিটার্ন করে।
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> <JuiceMaker:0x10f0b8 @running=true, @fluid=5>
juice_maker.stop(1)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=0>
Exercism-এ সাইন আপ করুন, Crystal ট্র্যাকের 26টি কনসেপ্ট142টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।