আমরা এই টিউটোরিয়ালে অবজেক্ট ওরিয়েন্টেড ডিজাইন সম্পর্কে যা শিখেছি এটি হল তার পর্যালোচনা।
কোন প্রোগ্রাম তৈরি করার সময় আমরা বিভিন্ন ধরনের অবজেক্ট তৈরি করি এবং অনেক সময় এসকল অবজেক্টের বৈশিষ্ট্য একই হয়ে থাকে - যেমন অনেকগুলো বিড়াল, যাদের পশমের রঙ এবং আকৃতি একে অপরের থেকে কিছুটা আলাদা অথবা অনেকগুলো বাটন, যেগুলোর শুধু নাম এবং অবস্থান আলাদা। আমরা বলতে চাই "সাধারণত বিড়াল দেখতে এমন হয়" এবং তারপর বলবো "আমরা এই বিড়ালকে নির্দিষ্ট করি, সাথে এই বিড়ালটাও এবং তাদের মধ্যে কতিপয় বিষয়ে মিল এবং অমিল থাকবে।" এক্ষেত্রে, আমরা অবজেক্ট-অরিয়েন্টেড ডিজাইন ব্যবহার করে অবজেক্টগুলো সংজ্ঞায়িত করে সেগুলোর অস্তিত্ব (instance) তৈরি করি।
জাভাস্ক্রিপ্টে অবজেক্ট নির্ধারণ কারার জন্য, প্রথমে "কন্সট্রাক্টর ফাংশন" সংজ্ঞায়িত করতে হবে। অবজেক্টের নতুন অস্তিত্ব তৈরি করার জন্য এই ফাংশনটি ব্যবহার করবো। এখানে Book অবজেক্টের জন্য একটি কন্সট্রাক্টর ফাংশন হল:
var Book = function(title, author, numPages) {
  this.title = title;
  this.author = author;
  this.numPages = numPages;
  this.currentPage = 0;
};
ফাংশনটি প্রতিটি বইয়ের পার্থক্যকারী বৈশিষ্ট্যগুলোর আর্গুমেন্ট গ্রহণ করে থাকে - যেমন: শিরোনাম, লেখক এবং পৃষ্ঠা সংখ্যা। তারপর আর্গুমেন্টের উপর ভিত্তি করে অবজেক্টের প্রাথমিক বৈশিষ্ট্যগুলো this কীওয়ার্ড ব্যবহার করে নিয়োগ করে থাকে। অবজেক্টে this ব্যবহার করার মাধ্যমে, অবজেক্টের বর্তমান অস্তিত্বকে বোঝানো হয়, যা ঐ অবজেক্টকেই নির্দেশ করে। পরবর্তীতে মনে রাখার জন্য বৈশিষ্ট্যগুলোকে this এ সংরক্ষণ করা প্রয়োজন।
Book অবজেক্টের অস্তিত্ব তৈরী করার জন্য, একটি নতুন চলক সংজ্ঞায়িত করি যার মধ্যে এই অবজেক্টটি সংরক্ষিত হবে, তারপর new কীওয়ার্ডটি ব্যবহার করে কন্সট্রাক্টরের ফাংশনের নাম লেখি এবং প্রত্যাশিত আর্গুমেন্টেগুলো কন্সট্রাক্টরে পাঠাই:
var book = new Book("Robot Dreams", "Isaac Asimov", 320);
তারপর অবজেক্টে সংরক্ষিত যে কোন বৈশিষ্ট্যই আমরা বিন্দু প্রতীক ব্যবহার করে পেতে পারি:
println("I loved reading " + book.title); // Robot Dreams পড়তে আমি পছন্দ করতাম
println(book.author + " is my fav author"); // "Isaac Asimov" আমার প্রিয় লেখক
এক মিনিটের জন্য ভিন্নভাবে চিন্তা করে দেখা যাক যে, কন্সট্রাক্টর ফাংশনকে আমরা যদি সঠিকভাবে সংজ্ঞায়িত না করতাম তাহলে কি হত:
var Book = function(title, author, numPages) {
};
var book = new Book("Little Brother", "Cory Doctorow", 380);
println("I loved reading " + book.title); // I loved reading undefined
println(book.author + " is my fav author"); // undefined is my favorite author
যদি আমরা কন্সট্রাক্টর ফাংশনে আর্গুমেন্ট পাঠাই কিন্তু এদের this এ সংরক্ষণ না করি, তাহলে পরবর্তীতে আমরা তাদের আর ব্যবহার করতে পারবো না! অবজেক্টটি তাহলে আর ঠিকমত কাজ করবে না।
যখন অবজেক্টকে সংজ্ঞায়িত করা হয়, প্রায়ই আমরা অবজেক্টগুলির বৈশিষ্ট্য এবং আচরণ একসাথে করতে চাই - যেমন আমাদের সকল বিড়াল অবজেক্ট যেন নিচের এই দুইটি কাজ করতে পারে- সে দুইটি কাজ হল meow() এবং eat()। এটা করার জন্য অবজেক্টের ধরনের সংজ্ঞাতে ফাংশন যোগ করতে হবে এবং আমরা এই কাজটি অবজেক্ট প্রোটোটাইপ ব্যবহার করে করতে পারি:
Book.prototype.readItAll = function() {
  this.currentPage = this.numPages;
  println("You read " + this.numPages + " pages!");
};
সাধারনভাবে এটা ফাংশনকে সংজ্ঞায়িত করার মতই, এখানে সার্বজনীনভাবে সংজ্ঞায়িত না করে আমরা এখানে Book এর প্রোটোটাইপের সাথে সংজ্ঞায়িত করছি। এভাবেই জাভাস্ক্রিপ্ট বোঝে যে ফাংশনটিকে যেকোন Book অবজেক্ট থেকে কল করা যাবে এবং ফাংশনটি, অবজেক্টটির this ব্যবহার করতে পারবে।
তারপর আমরা ফাংশনটিকে এভাবে কল করতে পারি (আমরা একে মেথড বলি, কারণ এটি অবজেক্টের সাথে জড়িত):
var book = new Book("Animal Farm", "George Orwell", 112);
book.readItAll(); // 112 পৃষ্ঠাই পড়া হয়েছে!
মনে রাখতে হবে যে, একই ধরনের একাধিক অবজেক্টকে (অবজেক্টের অস্তিত্ব) সহজে তৈরি করাই হল অবজেক্ট অরিয়েন্টেড ডিজাইনের মূল উদ্দেশ্য। এটার কোড নিচে দেওয়া হল:
var pirate = new Book("Pirate Cinema", "Cory Doctorow", 384);
var giver = new Book("The Giver", "Lois Lowry", 179);
var tuck = new Book("Tuck Everlasting", "Natalie Babbit", 144);

pirate.readItAll(); // তুমি 384 পৃষ্ঠায় পড়ে ফেলেছ!
giver.readItAll(); // তুমি 179 পৃষ্ঠায় পড়ে ফেলেছ!
tuck.readItAll(); // তুমি 144 পৃষ্ঠায় পড়ে ফেলেছ!
উপরের কোড আমাদের একই রকম তিনটি বই দেয় - তাদের বৈশিষ্ট্য এবং আচরণের ধরন এক হলেও তারা একে অপরের থেকে ভিন্ন। চমৎকার!
এখন, পৃথিবীর কথা চিন্তা করা যাক, বিড়াল এবং কুকুর ভিন্ন ধরণের অবজেক্ট, সেজন্য বিড়াল এবং কুকুর প্রোগ্রাম করার ক্ষেত্রে সম্ভবত ভিন্ন অবজেক্ট টাইপ তৈরী করা হবে। একটি বিড়াল meow() করবে এবং একটি কুকুর bark() করবে। কিন্তু তাদের মধ্যে মিলও আছে- বিড়াল এবং কুকুর উভয়েরই eat() (খাওয়ার বৈশিষ্ট্য) থাকবে, তাদের একটি age (বয়স) থাকবে, একটি birth (জন্ম) এবং death (মৃত্যু) থাকবে। তারা উভয়ই স্তন্যপায়ী প্রাণী এবং এর অর্থ হল তাদের অনেক বৈশিষ্ট্য একই রকম হলেও তারা একে অপর থেকে ভিন্ন।
এক্ষেত্রে, আমরা অবজেক্ট ইনহেরিটেন্স ধারণাটি ব্যবহার করবো। একটি অবজেক্ট, তার প্যারেন্ট অবজেক্ট থেকে নিজেস্ব বৈশিষ্ট এবং আচরণ ইনহেরিট করতে পারবে কিন্তু এছাড়াও তার স্বতন্ত্র কিছু বৈশিষ্ট্যও থাকবে। বিড়াল এবং কুকুর গুলো স্তন্যপায়ী থেকে ইনহেরিট করতে পারে, যেন eat() ফাংশনটি কোড করার জন্য আমাদের আবার শুরু থেকে কোড করতে না হয়। জাভাস্ক্রিপ্টে এটা আমরা কিভাবে করব?
চল বইয়ের উদাহরণে ফেরত যাওয়া যাক এবং ধরি বই হল "প্যারেন্ট" অবজেক্ট এবং আমরা এমন দুইটি অবজেক্ট তৈরি করতে চাই যেগুলো এই প্যারেন্ট অবজেক্ট থেকে ইনহেরিট করবে - অবজেক্ট দুইটি হল Paperback এবং EBook
Paperback বইয়ের মতই, কিন্তু আমাদের প্রোগ্রামের জন্য এর অন্তত একটি বিষয় আলাদা, : এটির একটি প্রচ্ছদ আছে। একারণে, নতুন তথ্যের জন্য আমাদের কন্সট্রাক্টরকে এখানে চারটি আর্গুমেন্ট নিতে হবে:
var PaperBack = function(title, author, numPages, cover) {
  // ...
}
আমরা Book কন্সট্রাক্টরে প্রথম তিনটি আর্গুমেন্ট সংরক্ষণ করার জন্য যে কাজ করেছিলাম সেটি আর করতে হবে না - আমাদের সুবিধার্থে আমরা একই কোড ব্যবহার করতে পারবো। তাহলে আমরা Book কন্সট্রাক্টরটি, PaperBack কন্সট্রাক্টরটি থেকে কল করতে পারি এবং ঐ আর্গুমেন্টগুলো দিয়ে দিতে পারি:
var PaperBack = function(title, author, numPages, cover) {
  Book.call(this, title, author, numPages);
  // ...
};
যদিও প্রচ্ছদের বৈশিষ্ট্যটি আমাদের অবজেক্টের ভিতরে সংরক্ষণ করতে হবে, সেজন্য এক লাইনের একটি কোড আমাদের লেখতে হবে:
var PaperBack = function(title, author, numPages, cover) {
  Book.call(this, title, author, numPages);
  this.cover = cover;
};
এখন PaperBack এর কন্সট্রাক্টর আছে, যা Book এর বৈশিষ্ট্যের সমান, কিন্তু আমরা চাই PaperBack যেন মেথডগুলোও ইনহেরিট করে। আমরা কাজটি করব, প্রোগ্রামকে Book এর প্রোটোটাইপের উপর ভিত্তি করে PaperBack এর প্রোটোটাইপ নিয়ে কাজ করতে বলার মাধ্যমে:
PaperBack.prototype = Object.create(Book.prototype);
আমরা যদি এখানে Paperback ভিত্তিক কোনো আচরণ যুক্ত করতে চাই যেমন, এটাকে পুড়িয়ে ফেলা, এই কাজটি করার জন্য আমাদের উপরের লাইনটির পরে প্রোটোটাইপের উপর ভিত্তি করে একটি ফাংশন সংজ্ঞায়িত করতে হবে:
PaperBack.prototype.burn = function() {
  println("Omg, you burnt all " + this.numPages + " pages");
  this.numPages = 0;
};
এখন আমরা নতুন একটি Paperback তৈরী করতে পারি, সম্পূর্ণটি পড়তে পারি এবং পুড়িয়েও ফেলতে পারি!
var calvin = new PaperBack("The Essential Calvin & Hobbes", "Bill Watterson", 256, "http://ecx.images-amazon.com/images/I/61M41hxr0zL.jpg");

calvin.readItAll(); // তুমি 256 পৃষ্ঠায় পড়ে ফেলেছ!
calvin.burn(); // ওহো, তুমি 256 পৃষ্ঠায় পুড়িয়ে ফেলেছ!
(আমরা বইটি আসলে পোড়াতে চাইছি না কারণ, এটি অসাধারণ একটি বই। কিন্তু আমরা যদি কোন হিমবাহে আটকে পড়ি এবং একটু উষ্ণতার জন্য মরিয়া হয়ে উঠি তাহলে তখন এই কাজটি করা যেতে পারে।)
এখন বোঝা যাচ্ছে যে, আমরা অবজেক্ট ওরিয়েন্টেড ডিজাইন নীতি ব্যবহার করে জাভাস্ক্রিপ্ট দিয়ে সহজেই প্রোগ্রামে জটিল উপাত্ত তৈরি করতে পারি এবং প্রোগ্রামটিকে আরও উন্নতভাবে কোড করতে পারি। অবজেক্ট অরিয়েন্টেড ডিজাইন প্রোগ্রামকে দ্রুত এবং কোডিংকে বোধগম্য করে তোলে।
লোড করা হচ্ছে