মূল বিষয়বস্তু
কম্পিউটার প্রোগ্রামিং
বাটন অবজেক্টের প্রকারভেদ
কোডকে পুনরায় ব্যবহারযোগ্য এবং কার্যকরী করার সবচেয়ে উত্তম উপায় হল অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং, বিশেষ করে ব্যবহারকারীর ইন্টারফেস যেমন বাটন তৈরির ক্ষেত্রে এটি খুবই উপকারী। অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর ক্ষেত্রে, প্রত্যেকটি অবজেক্টকের গুনবাচক বৈশিষ্ট্য নির্ধারণ করা হয় এবং আমরা নির্দিষ্ট প্যারামিটার উল্লেখ করে এই সকল অবজেক্টের অস্তিত্ব তৈরি করতে পারি। জাভাস্ক্রিপ্টে এটি করার কথা মনে না থাকলে পুনরায় দেখার জন্য, এখানে ক্লিক কর।
অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং ব্যবহার করে বাটন তৈরি করার জন্য আমাদের একটি
Button
অবজেক্ট সংজ্ঞায়িত করতে হবে এবং তারপর এটির মেথড, আঁকার প্রক্রিয়া এবং মাউস ক্লিক নিয়ন্ত্রণ পদ্ধতিকে সংজ্ঞায়িত করতে হবে। আমরা নিচে দেওয়া কোডটির মত কোড লিখতে চাই:var btn1 = new Button(...);
btn1.draw();
mouseClicked = function() {
if (btn1.isMouseInside()) {
println("Whoah, you clicked me!");
}
}
পূর্ববর্তী প্রবন্ধের কোডটির সাথে এই কোডটি মিলিয়ে দেখা যাক:
var btn1 = {...};
drawButton(btn1);
mouseClicked = function() {
if (isMouseInside(btn1)) {
println("Whoah, you clicked me!");
}
}
দুটি কোড প্রায় একই রকম, তাই না? কিন্তু এখানে একটি বিশাল পার্থক্য আছে -- সকল ফাংশনকে
Button
অবজেক্টের মধ্যে সংজ্ঞায়িত করা হয়েছে, আসলে ফাংশনগুলি বাটনেই অবস্থিত। অবজেক্টের মধ্যেই তার নিজের বৈশিষ্ট্য এবং ফাংশন থাকার জন্য কোডটি আরও পরিপাটি হয় এবং পুনরায় ব্যবহারযোগ্যতা লাভ করে।Button
অবজেক্ট সংজ্ঞায়িত করার জন্য, শুরুতে আমাদের একটি কন্সট্রাক্টর তৈরি করতে হবে: এটি একটি বিশেষ ফাংশন যা নির্ধারিত প্যারামিটারগুলি নিয়ে অবজেক্টের অস্তিত্বের বৈশিষ্ট্য নির্দিষ্ট করে।প্রথম প্রচেষ্টার জন্য, এখানে একটি কন্সট্রাক্টর আছে যা প্যারামিটার হিসেবে x, y, width এবং height নেয়:
var Button = function(x, y, width, height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
};
var btn1 = new Button(100, 100, 150, 150);
এটি অবশ্যই কাজ করে কিন্তু আমি আরেকটি পদ্ধতি দেখাতে চাই। কন্সট্রাক্টরে আলাদাভাবে একটি করে প্যারামিটার নেওয়ার চেয়ে, একটি কনফিগারেশন অবজেক্ট নিতে পারে।
var Button = function(config) {
this.x = config.x;
this.y = config.y;
this.width = config.width;
this.height = config.height;
this.label = config.label;
};
মূলত config অবজেক্টের সুবিধা হল, এটি নতুন প্যারামিটার যোগ করা অনেক সহজ করে দেয় (যেমন
label
) এবং কোন প্যারামিটার কি কাজে নিয়োজিত আছে সেটি আমরা সহজেই বুঝতে পারি:var btn1 = new Button({
x: 100, y: 100,
width: 150, height: 50,
label: "Please click!"});
আমরা কিন্তু আরও কিছু কাজ করতে পারি। যদি বেশিরভাগ বাটনের প্রস্থ (width) অথবা উচ্চতা (height) একই হয় তখন কি হবে? আমাদের প্রতিবার প্রস্থ এবং উচ্চতার প্যারামিটার নির্দিষ্ট করে দেওয়ার দরকার নেই বরং প্রয়োজন মোতাবেক নির্দিষ্ট করা উচিত। আমরা কন্সট্রাক্টরটি এমনভাবে কোড করব যেন এটি যাচাই করে যে বৈশিষ্ট্যটি আসলেই config অবজেক্টে আছে কিনা এবং যদি না থাকে তাহলে যেন এটি একটি ডিফল্ট মান নিয়ে নেয়। নিম্নরূপে:
var Button = function(config) {
this.x = config.x || 0;
this.y = config.y || 0;
this.width = config.width || 150;
this.height = config.height || 50;
this.label = config.label || "Click";
};
এখন আমরা প্রয়োজন মোতাবেক বৈশিষ্ট্য কল করতে পারব কারণ কল না করা বৈশিষ্ট্যগুলো ডিফল্ট মানের হবে:
var btn1 = new Button({x: 100, y: 100, label: "Please click!"});
একটি কন্সট্রাক্টরের জন্য এতো পরিশ্রম? কারণ আছে, বিশ্বাস রাখো।
এখন যেহেতু আমাদের কন্সট্রাক্টর তৈরি করা শেষ, এসো বাটনের কার্যক্রমের দিকে লক্ষ্য করি:
draw
মেথড। এটির কোড drawButton
ফাংশনের অনুরূপ হবে, কিন্তু এটি this
দিয়ে সব বৈশিষ্ট্যগুলি নেবে, কারণ এটি অবজেক্টের প্রোটোটাইপে সংজ্ঞায়িত:Button.prototype.draw = function() {
fill(0, 234, 255);
rect(this.x, this.y, this.width, this.height, 5);
fill(0, 0, 0);
textSize(19);
textAlign(LEFT, TOP);
text(this.label, this.x+10, this.y+this.height/4);
};
সংজ্ঞায়িত হবার পর, আমরা এমনভাবে কল করবো:
btn1.draw();
এই প্রোগ্রামটি
Button
অবজেক্ট ব্যবহার করে 2 টি বাটন তৈরি করে - লক্ষ্য করি, এখন একাধিক বাটন তৈরি করা কতটা সহজ:আমরা কঠিন অংশটুকু এড়িয়ে গেছি, এটি হল: ক্লিক নিয়ন্ত্রণ করা। শুরুতেই আমরা
Button
এর প্রোটোটাইপে একটি ফাংশন সংজ্ঞায়িত করব যা true হবে, যদি ব্যবহারকারী কোন নির্দিষ্ট বাটনের সীমারেখার মধ্যে ক্লিক করে। এটি আমাদের আগের ফাংশনের মতই অবজেক্ট থেকে this
ব্যবহার করে বৈশিষ্ট্যগুলো নেয়:Button.prototype.isMouseInside = function() {
return mouseX > this.x &&
mouseX < (this.x + this.width) &&
mouseY > this.y &&
mouseY < (this.y + this.height);
};
এখন আমরা এটি
mouseClicked
ফাংশনের মধ্যে ব্যবহার করতে পারবো:mouseClicked = function() {
if (btn1.isMouseInside()) {
println("You made the right choice!");
} else if (btn2.isMouseInside()) {
println("Yay, you picked me!");
}
};
নিচের সকল বাটন ক্লিক করে দেখা যাক:
কিন্তু ক্লিক নিয়ন্ত্রণের কিছু বিষয় পরিবর্তন করা উচিত। কারণ অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর মূল বিষয়টিই হল একটি অবজেক্টের মধ্যে তার সকল কার্যক্রমের ফাংশন রাখা এবং এটির বৈশিষ্ট্য ব্যবহার করে কার্যক্রমের পরিবর্তন ঘটানো। কিন্তু কিছু কার্যক্রম আমাদের অবজেক্টের বাহিরে আছে, যেমন
mouseClicked
এর ভেতরে println
(প্রিন্ট) গুলো:mouseClicked = function() {
if (btn1.isMouseInside()) {
println("You made the right choice!");
} else if (btn2.isMouseInside()) {
println("Yay, you picked me!");
}
};
প্রিন্ট স্টেটমেন্টগুলোকে কোন না কোনভাবে বাটনের সাথে সংযুক্ত করতে হবে, যেমনটি আমরা কন্সট্রাক্টরের ক্ষেত্রে করেছিলাম। এখন এটি যেমন আছে, আমরা এটির কন্সট্রাক্টর config এ একটি বার্তা পাঠাতে পারি এবং বার্তাটি দেখানোর জন্য একটি
handleMouseClick
ফাংশন সংজ্ঞায়িত করতে পারি:var Button = function(config) {
...
this.message = config.message || "Clicked!";
};
Button.prototype.handleMouseClick = function() {
if (this.isMouseInside()) {
println(this.message);
}
};
var btn1 = new Button({
x: 100,
y: 100,
label: "Please click!",
message: "You made the right choice!"
});
mouseClicked = function() {
btn1.handleMouseClick();
};
চমৎকার হয়েছে, এখন কন্সট্রাক্টরের মধ্যেই সকল বৈশিষ্ট্য রয়েছে এবং সকল কার্যক্রম প্রতিটি বাটনের সাথে যুক্ত আছে। কিন্তু এটি আবার খুব বেশিই সাধারণ হয়ে গেছে। আমরা যদি বার্তা দেখানো ব্যতীত অন্য কিছু করতে চাই, উদাহরণস্বরূপ যে কোন আকৃতির ছবি আঁকানো অথবা কোন দৃশ্যের পরিবর্তন করা, যা করতে আমাদের বেশ কয়েক লাইন কোড করা লাগবে? সেক্ষেত্রে, কন্সট্রাক্টরে স্ট্রিং এর থেকেও বেশি কিছু দিতে হবে -- আমাদের কিছু কোড দিতে হবে। আমরা কীভাবে কোড পাঠাবো?
...ফাংশনের সাহায্যে! জাভাস্ক্রিপ্টে (সকল ভাষায় নয়), আমরা ফাংশনকে প্যারামিটার হিসেবে ফাংশনে পাঠাতে পারি। অনেক ক্ষেত্রেই এটা উপকারি, কিন্তু ব্যবহারকারীর ইন্টারফেস অর্থাৎ বাটন তৈরির ক্ষেত্রে এটা বেশি উপকারি। আমরা বাটনকে বলতে পারি, "এখানে এই ফাংশনটি দেওয়া হল, যেটাতে অনেকগুলি কোড আছে, যা ব্যবহারকারী বাটনটিতে ক্লিক করলে, আমরা কল করতে চাই।" আমরা এরূপ ফাংশনকে "callback" ফাংশন বলি কারণ তাদেরকে তৎক্ষণাৎ কল করা হয় না, তাদেরকে উপযুক্ত সময়ে "পুনরায় কল" করা হয়।
শুরুতে আমরা একটি
onClick
প্যারামিটার পাঠাতে পারি যা একটি ফাংশন:var btn1 = new Button({
x: 100,
y: 100,
label: "Please click!",
onClick: function() {
text("You made the right choice!", 100, 300);
}
});
তারপর পাঠানো উপাত্তের উপর ভিত্তি করে আমাদের কন্সট্রাক্টরে
onClick
বৈশিষ্ট্য নিশ্চিত করতে হবে। ডিফল্ট ক্ষেত্রে, যদি কোন onClick
পাঠানো না হয়, আমরা একটি "no-op" ফাংশন তৈরি করব -- একটি ফাংশন যা কোন "কাজই" করে না। এটি শুধুমাত্র এখানে আছে যাতে কোড চলাকালীন কোন ত্রুটি না থাকে:var Button = function(config) {
// ...
this.onClick = config.onClick || function() {};
};
অবশেষে, যখন ব্যবহারকারী বাটনে ক্লিক করে তখন আমাদের callback ফাংশনটিকে পুনরায় কল করা লাগবে। আসলে এটি খুবই সহজ- আমরা এটি যে নামে লিখেছি সেটি দিয়েই কল করতে পারবো যার শেষে ফাঁকা প্রথম বন্ধনী যোগ করতে হবে:
Button.prototype.handleMouseClick = function() {
if (this.isMouseInside()) {
this.onClick();
}
};
অবশেষে - আমাদের একটি
Button
অবজেক্ট আছে যা থেকে আমরা সহজেই বিভিন্ন ধরনের কার্যক্রমের বাটন তৈরি করতে পারবো। নিচের উদাহরণের বাটনে ক্লিক করে এবং প্যারামিটার পরিবর্তন করে দেখা যাক কি হয়:আমরা একটি বাটন তৈরি করা শিখলাম এবং একই সাথে এটির টেম্পলেটও পাওয়া গেল, যা ব্যবহার করে আমরা নিজেদের ইচ্ছামত রঙ এবং আকারের বাটন তৈরি করতে পারবো। নতুন তৈরি করা বাটনের কাজের প্রক্রিয়াটি সম্পূর্ণ ভিন্ন হতে পারে। নিজস্ব প্রোগ্রামে এটি ব্যবহারের চেষ্টা করা যাক!
আলোচনায় অংশ নিতে চাও?
কোন আলাপচারিতা নেই।