Skip to content

Chapter 25: JavaScript Final Projects

25-1: পকেট কাটে : shopping cart

সারা জীবন অনলাইনে কেনাকাটা করছস। ভিতরের জিনিস বুঝার অপশন ছিল না। এখন তুই যেহেতু জাভাস্ক্রিপ্ট জানস, তাই ভিতরের জিনিসগুলো বুঝতে পারবি। দরকার হলে নিজে নিজে করতেও পারবি। নিচে একটা ই-কমার্স ওয়েবসাইটের শপিং কার্টের সিম্পল কাজ দেয়া আছে। সেখানে অনেকগুলা প্রোডাক্ট আছে। আর একটা শপিং কার্ট অ্যারে আছে, আর একটা orders নামে অ্যারে আছে।

javascript
let products = [
  { id: 1, name: "Smartphone", price: 200, stock: 10 },
  { id: 2, name: "Laptop", price: 800, stock: 5 },
];

let cart = [];
let orders = [];

এখন সিম্পল কয়েকটা কাজ করে ফেল।

টাস্ক-১: একটা addToCart ফাংশন লিখে ফেল। এইটার মধ্যে প্রোডাক্টের আইডি, আর কয়টা প্রোডাক্ট কিনতে চায়, সেই কোয়ান্টিটি দিবি। ভিতরে গিয়ে প্রথমে চেক করবি, এই আইডির প্রোডাক্ট আছে কি না। যদি থাকে তাহলে, কিছু কাজ করবি। আর যদি না থাকে, তাহলে "Product not found." এরর রিটার্ন করবি।

প্রোডাক্ট পাওয়া গেলে চেক করবি, প্রোডাক্টের যে কোয়ান্টিটি কিনতে চায়, সেই কোয়ান্টিটির সমান বা বেশি স্টকে আছে কি না। যদি থাকে, তাহলে প্রোডাক্টের স্টক থেকে অর্ডার কোয়ান্টিটির সংখ্যা কমাবে। তারপর একটা অবজেক্ট বানাবি, সেখানে প্রোডাক্ট আইডি, কোয়ান্টিটি এবং প্রাইস থাকবে। প্রাইস নিবি প্রোডাক্ট থেকে। তারপর এই অবজেক্টটা cart-এর মধ্যে যোগ করে দিবি। আর একটা টেমপ্লেট স্ট্রিং দিয়ে ${product.name} added to cart. Quantity: ${quantity} লিখে সেটা রিটার্ন করবি।

টাস্ক-২: এইবার viewCart নামে একটা ফাংশন লিখে ফেল। এইটার কাজ হবে cart-এর মধ্যে যতগুলা আইটেম আছে। সেগুলাকে কনসোল লগ করবি।

টাস্ক-৩: শেষমেষ placeOrder নামে আরেকটা ফাংশন লিখ। এইটা চেক করবে cart-এর মধ্যে মিনিমাম একটা আইটেম আছে কি না। যদি না থাকে, তাহলে "Your cart is empty." লিখে রিটার্ন করে দিবি।

আর যদি cart-এর মধ্যে একটার বেশি আইটেম থাকে তাহলে লুপ করে cart এর মধ্যে যত আইটেম আছে। প্রত্যেকটার কোয়ান্টিটি এর সাথে দাম গুন্ করে গুনফল যোগ করে মোট কত টাকা দিতে হবে সেটা বের করবি।

এরপর একটা অবজেক্ট বানাবি, সেখানে টোটাল প্রাইস নামে একটা প্রোপার্টি থাকবে। সেটা oders অ্যারেতে যোগ করে দিবি। তারপর cart-এ যত আইটেম আছে, সব রিমুভ করে দিবি। এরপর "Order placed." রিটার্ন করে দিবি।

25-2: ফুড ডেলিভারি: পান্ডার আন্ডা

এইবার আমরা দুইজন মিলে কিছু কোড করে ফেলি। আমি কিছু করলাম, আর তুই বেশির ভাগ করে ফেলবি। মাঝে মধ্যে আমি কোডের আউটলাইন দিয়ে দিব। আর তুই সেটা পুরা কোড লিখে ফেলবি। কী বলিস?

— শুরু করে দে। কী আছে জীবনে?

আমার কাছে কয়েকটা অ্যারে আছে। প্রথমে আছে restaurants, সেখানে স্যাম্পল হিসেবে দুইটা রেস্টুরেন্টের ডাটা আছে। প্রত্যেকটা রেস্টুরেন্টের মধ্যে আইডি, নাম এবং ম্যানু আছে। ম্যানুর মধ্যে খাবারের নাম আর দাম আছে। এ ছাড়া আরও দুইটা অ্যারে আছে। সেগুলা orders, reviews, সবার শেষে একটা অবজেক্ট আছে। সেখানে কিছু ডিসকাউন্ট কোড আছে বা কুপন কোড আছে এবং একটা কমেন্টে বলা আছে, ডিসকাউন্টের মান পার্সেন্টে আছে।

javascript
const restaurants = [
  {
    id: 1,
    name: "Pizza Place",
    menu: [{ name: "Pepperoni Pizza", price: 12 }],
  },
  { id: 2, name: "Sushi House", menu: [{ name: "Salmon Sushi", price: 15 }] },
];
const orders = [];
const reviews = [];
// Discount in percentage
const discountCodes = { SAVE10: 10, WELCOME15: 15 };

এই প্রজেক্টের উদ্দেশ্য হলো, একটি ফুড ডেলিভারি অ্যাপের বেসিক কিছু ফাংশনালিটি তৈরি করা। যেখানে মানুষ রেস্টুরেন্ট থেকে খাবার অর্ডার করতে পারবে। কোন রেস্টুরেন্ট থেকে খাবার নিবে, সেটা ঠিক করতে পারবে। রিভিউ দিতে পারবে। ডিসকাউন্ট কুপন ইউজ করতে পারবে।

টাস্ক-১: খাবারের দাম পাওয়ার জন্য getFoodPrice নামে একটা ফাংশন লিখে ফেল। যেখানে দুইটা প্যারামিটার থাকবে। প্রথমটা হবে রেস্টুরেন্টের নাম, আর সেকেন্ডটা হবে সেই রেস্টুরেন্টের খাবারের নাম। সেই ফাংশনের ভিতরে restaurants নামক অ্যারেতে খুঁজে দেখবি, যে নাম দিছে, সেই নামের রেস্টুরেন্ট আছে কি না। যদি থাকে, তাহলে সেই রেস্টুরেন্টের মেনুতে গিয়ে যে খাবারের নাম দিছে, সেই খাবার আছে কি না, সেটা চেক করবি। যদি খাবার পেয়ে যায়, তাহলে সেটার দাম রিটার্ন করে দিবি। আর যদি খাবার না পায়, তাহলে একটা স্ট্রিং রিটার্ন করে বলবি "Food Item not found."।

আবার যখন রেস্টুরেন্টের নাম দিয়ে রেস্টুরেন্ট খুঁজবে, তখন যদি রেস্টুরেন্ট না পায়, তখন একটা স্ট্রিং রিটার্ন করে বলবে "Restaurant not found."।

টাস্ক-২: এইবার placeOrder নামে একটা ফাংশন লিখ। এইটার চারটা প্যারামিটার থাকবে customer, restaurantName, foodItem, discountCode। প্রথমেই getFoodPrice ফাংশনকে রেস্টুরেন্টের নাম আর খাবারের নাম দিয়ে খাবারের দাম জানার চেষ্টা করবি। যদি খাবারের দাম হিসেবে একটা সংখ্যা আসে, তাহলে এইটা ইউজ করে অর্ডার অবজেক্ট বানাবি। আর যদি খাবারের দাম না পায়, তাহলে এরর ম্যাসেজ পাঠাবে "Food Item not found."।

যদি ডিসকাউন্ট কোড হিসেবে কোনো আর্গুমেন্ট পাস করে, তাহলে discountCodes অবজেক্টে গিয়ে দেখবি, সেই কুপন আছে কি না। সেটা যদি থাকে, তাহলে খাবারের দাম ডিসকাউন্ট কুপনের ডিসকাউন্ট অনুসারে কমাবি। আর যদি ডিসকাউন্ট কুপন না থাকে, তখন একটা এরর ম্যাসেজ দিবি, কুপন কোড ইনভ্যালিড।

আর যদি কুপন না থাকে অথবা কুপন কোড ভ্যালিড থাকে, তাহলে একটা অর্ডার অবজেক্ট বানাবি। সেই অর্ডার অবজেক্টে কাস্টমারের নাম, রেস্টুরেন্টের নাম, খাবারের নাম, খাবারের দাম এবং status-এর ডিফল্ট মান থাকবে "Pending"। এইটা orders অ্যারেতে যোগ করে দিবি।

অর্ডার অবজেক্টে একটা আইডি (id) প্রোপার্টি থাকবে। আর এই আইডি প্রোপার্টির মান হবে orders নামক অ্যারেতে যতগুলা উপাদান আছে, সেই উপাদানের সংখ্যার সাথে 1 যোগ করে যোগফল হবে আইডির মান।

শেষমেশ অর্ডার ঠিকমতো হলে টেমপ্লেট স্ট্রিং দিয়ে একটা স্ট্রিং বানিয়ে সেটা রিটার্ন করবি। আর সেই স্ট্রিংয়ে থাকবে Your Order is Successfully placed। Order Id: দিয়ে দিবি।

টাস্ক-৩: কোনো একটা রেস্টুরেন্টের টোটাল বিক্রি বের করার জন্য একটা ফাংশন তৈরি কর। এই ফাংশনে একটা রেস্টুরেন্টের নাম নিবে। তারপর orders নামক অ্যারেতে এই রেস্টুরেন্টের যত অর্ডার আছে, সেগুলা ফিল্টার করবি। তারপর reduce ইউজ করে সেই রেস্টুরেন্টের টোটাল বিক্রির পরিমাণ বের করে সেটা রিটার্ন করে দিবি। আর যদি সেই রেস্টুরেন্টের জন্য কোনো অর্ডার খুঁজে না পায়, তাহলে 0 রিটার্ন করে দিবি।

টাস্ক-৪: কোনো একটা অর্ডার আইডি আর রেস্টুরেন্টের নাম দিয়ে কেউ রিভিউ সাবমিট করতে পারবে। এই ফাংশনের নাম দিবি submitReview, আর এইটার চারটা প্যারামিটার থাকবে। প্রথমে থাকবে অর্ডার আইডি, রেস্টুরেন্টের নাম। তারপর রেটিংস (0 থেকে 5-এর মধ্যে কোনো সংখা), তারপর থাকবে রিভিউর স্ট্রিং।

submitReview-এর মধ্যে প্রথমেই চেক করবি, যে অর্ডার আইডি আর রেস্টুরেন্টের নাম দিছে, সেটা ঠিক আছে কি না। অর্থাৎ অর্ডার আইডি আর রেস্টুরেন্ট নাম দুইটাই ম্যাচ করে, এমন কোনো অর্ডার আছে কি না। যদি থাকে, তাহলে বাকি কাজ করবি। আর যদি না থাকে, তাহলে বলবি— না খেয়ে ভুয়া রিভিউ দিবেন না, প্লিজ।

আর অর্ডার ভ্যালিড হলে চেক করবি, রেটিংসের সংখ্যা 0 থেকে 5-এর মধ্যে কি না। যদি 5-এর বেশি হয় বা 0-এর কম হয়, তাহলে এরর দিবি– রেটিংস 0 থেকে 5-এর মধ্যে হতে হবে।

এরপর চেক করবে, রিভিউর মধ্যে মিনিমাম 20 ক্যারেক্টার বা তার চেয়ে বড় রিভিউ লিখে দিছে কি না। যদি রিভিউর লেংথ কম হয়, তাহলে এরর ম্যাসেজ দিয়ে বলবি, রিভিউ 20 ক্যারেক্টারের চাইতে বড় হতে হবে। আর যদি রিভিউ ঠিক থাকে তাহলে, একটা রিভিউ অবজেক্ট বানিয়ে সেটা reviews নামক অ্যারেতে যোগ করে দিবি। প্রত্যেকটা রিভিউর একটা id থাকবে, অন্যান্য ডাটা থাকবে। রিটার্ন হিসেবে: রিভিউ ঠিকমতো যোগ হয়েছে এবং এইটা তোমার রিভিউ আইডি।

25-3: পই পই MFS: প্র্যাকটিস

এইবার বিকাশ, রকেট, নগদের মতো আর্থিক লেনদেন, টাকা পাঠানো, টাকা গ্রহণ, ব্যালেন্স চেক করার সিস্টেম বানিয়ে ফেল। আমি হালকা একটু শুরু করে দিব। বাকিটা তুই করবি।

একটা IIFE (Immediately Invoked Function Expression) লিখে ফেল। সেটাকে একটা ভেরিয়েবলে রাখ। নিচের মতো করে—

javascript
const userDatabase = (function () {})();

আপাতত এইটার মধ্যে কিছু নাই। এখন এইটার ভিতরে একটা users নামে অ্যারে ডিক্লেয়ার কর। নিচের মতো করে—

javascript
const userDatabase = (function () {
  const users = [];
})();

এরপর এই IIFE থেকে একটা অবজেক্ট রিটার্ন কর। আপাতত সেই অবজেক্টে কিছু নাই। জাস্ট খালি একটা অবজেক্ট। আর কিছু না।

javascript
const userDatabase = (function () {
  const users = [];
  return {};
})();

console.log(userDatabase);

Output: {
}

তাহলে userDatabase থেকে একটা খালি অবজেক্ট পাওয়া যাবে। কনসোল লগ করলেও এটাই আউটপুট হিসেবে দেখাবে।

এখন আমাদের কাজ হচ্ছে, IIFE থেকে যে অবজেক্ট রিটার্ন করা হচ্ছে, সেখানে একটা মেথড লিখে ফেলব। প্রথমটা হচ্ছে registerUser, আর এইটা দুইটা প্যারামিটার নিবে। একটা হচ্ছে ইউজারের নাম, আরেকটা হচ্ছে চার সংখ্যার একটা পিন নাম্বার।

javascript
const userDatabase = (function () {
  const users = [];

  return {
    registerUser: function (name, pin) {},
  };
})();

console.log(userDatabase);

Output: {
  registerUser: ƒ;
}

টাস্ক-১: তোর এখন একটা কাজ হচ্ছে, registerUser-এর ভিতরে কিছু সিম্পল ভ্যালিডেশন করে ফেলা। যদি name এবং pin— এই দুইটার মান না দেয়া থাকে, তাহলে তুই error রিটার্ন করবি। আবার pin যদি সংখ্যা না হয় বা চার ডিজিটের সংখ্যা না হয়, তাহলে তুই error রিটার্ন করবি। চার ডিজিটের সংখ্যা কিভাবে চেক করতে হয় সেটা তুই খুঁজে খুঁজে বের কর। তারপর বুঝে বুঝে কোড কর।

আর এই দুইটা ঠিক থাকলে তুই একটা অবজেক্ট বানিয়ে ফেলবি, যেখানে অবজেক্টের আইডি থাকবে। আইডির মান হবে ওপরের users-এর মধ্যে যতগুলা উপাদান আছে, তার সংখ্যার সাথে 1 যোগ করে। এর পাশাপাশি name, pin এবং balance যোগ করে দিবি। balance-এর প্রাথমিক মান হবে 0। আর ঠিকমতো ইউজার যোগ করতে পারলে true রিটার্ন করে দিবি।

javascript
const userDatabase = (function () {
  const users = [];

  return {
    registerUser: function (name, pin) {
      // add validation here
      const newUser = {
        id: users.length + 1,
        name,
        pin,
        balance: 0,
      };
      users.push(newUser);
      return true;
    },
  };
})();

টাস্ক-২ : লগইন সিস্টেম তৈরি কর, যেখানে registerUser-এর ফাংশন লিখছিস, সেখানে খেয়াল করে registerUser যেখানে শেষ হইছে, সেখানে কমা দিয়ে আরেকটা মেথড লিখে ফেল। এইটার নাম হবে loginUser । এইখানেও দুইটা প্যারামিটার নিবি। নাম আর চার ডিজিটের ফোন নাম্বার। তারপর ওপরের users নামক অ্যারেতে গিয়ে সেই user খুঁজে বের করে দেখবি, যে পিন দিছে, সেটা users থেকে যে ইউজার খুঁজে পাইছস, তার পিনের সাথে ম্যাচ করে কি না। যদি ম্যাচ খায়, তাহলে true রিটার্ন করবি। না হয় false রিটার্ন করবি।

এইবার তোর বানানো registerUser আর loginUser টেস্ট করে ফেল।

টেস্ট করার জন্য userDatabase লিখে ডট চিহ্ন দিয়ে registerUser লিখবি। এইটাকে ফাংশনের মতো করে কল করে দিবি। যে যে প্যারামিটার দরকার সেগুলা দিয়ে। একইভাবে userDatabase.loginUser-কে কল করে দিবি প্রয়োজনীয় প্যারামিটার দিয়ে।

জাস্ট কয়েকটা নাম আর পিন দিয়ে ইউজার বানিয়ে ফেল। তারপর আবার loginUser-কে কল করে কয়েকবার ঠিক নাম আর পিন দিবি, আবার কয়েকবার নাম বা পিন ভুল দিবি। দেখ, ঠিক দিলে true, আর ভুল দিলে false রিটার্ন করে কি না।

javascript
const userDatabase = (function () {
  const users = [];

  return {
    registerUser: function (name, pin) {},
    loginUser: function (name, pin) {},
  };
})();

userDatabase.registerUser("Alice", 1234);
userDatabase.registerUser("Bob", 5678);

টাস্ক-৩: শুরুতে কিন্তু ব্যালেন্স ছিল 0, তাই এইবার একাউন্টে টাকা যোগ করার কাজ। জাস্ট আগের মতো loginUser-এর পর কমা দিয়ে addMoney মেথড লিখবি। এইটা তিনটা প্যারামিটার নিবে: নাম, পিন, এমাউন্ট (অর্থাৎ কত টাকা যোগ করতে চাস)। এই মেথড থেকে নাম আর পিন দিয়ে loginUser মেথডকে কল করবি। যদি loginUser থেকে true রিটার্ন পায়, তাহলে users থেকে এই ইউজার খুঁজে বের করে তার বর্তমান ব্যালেন্সে এমাউন্ট প্যারামিটারের টাকা যোগ করে দিবি এবং একটা স্ট্রিং রিটার্ন করবি, যেখানে বলা থাকবে, কার একাউন্টে কত টাকা যোগ করা হইছে এবং তার বর্তমান ব্যালেন্স কত। আর যদি loginUser থেকে false রিটার্ন করে, তাহলে আরেকটা স্ট্রিং রিটার্ন করবি, যেখানে বলা থাকবে, সরি, টাকা একাউন্টে যোগ করতে পারি নাই। তোমার টাকা রিফান্ড করা হইছে।

javascript
const userDatabase = (function () {
  const users = [];

  return {
    registerUser: function (name, pin) {},
    loginUser: function (name, pin) {},
    addMoney: function () {},
  };
})();

টাস্ক-৪: কার একাউন্টে কত টাকা আছে, সেটা জানার জন্য checkBalance নামক একটি ফাংশন তৈরি করবি, যা ইনপুট হিসেবে নাম আর পিন নিবে। তারপর loginUser মেথড ইউজ করে চেক করবে, নাম আর পিন ঠিক আছে কি না। যদি ঠিক থাকে, তাহলে সেই ইউজার খুঁজে বের করে তার ব্যালেন্স রিটার্ন করে দিবে। আর যদি loginUser থেকে false রিটার্ন করে, তাহলে একটা স্ট্রিং রিটার্ন করে বলবি— তোমার এক্সেস নাই, এই একাউন্টের ব্যালেন্স জানার।

টাস্ক-৫: টাকা পাঠানোর জন sendMoney মেথড লিখে ফেল। এইটা চারটা প্যারামিটার নিবে। প্রথমে যে টাকা পাঠাবে, তার নাম তার পিন। তারপর যাকে টাকা পাঠাবে, তার নাম এবং কত টাকা পাঠাবে।

এই মেথডের ভিতরে প্রথমে loginUser মেথড ইউজ করে চেক করবি, যে টাকা পাঠাচ্ছে, তার নাম এবং পিন ঠিক আছে কি না। যদি সেন্ডারের নাম আর পিন ঠিক না থাকে, তাহলে একটা এরর ম্যাসেজ দিবি, তোমার টাকা পাঠানোর এক্সেস নাই।

আর যদি নাম আর পিন ঠিক থাকে, তাহলে সেই ইউজারকে খুঁজে বের করে চেক করবি, সে যত টাকা পাঠাতে চায়, তার সমান বা বেশি পরিমাণ টাকা তার ব্যালান্সে এ আছে কি না। যদি কম থাকে, তাহলে একটা এরর ম্যাসেজ দিবি, তোমার একাউন্টে যথেষ্ট টাকা নাই।

যদি যথেষ্ট টাকা থাকে, তাহলে যাকে টাকা পাঠাতে চায়, তার নাম দিয়ে তাকে users থেকে খুঁজে বের করার চেষ্টা করবি। যদি সেই নাম দিয়ে কাউকে খুঁজে না পায়, তাহলে একটা এরর ম্যাসেজ দিবে, টাকা রিসিভারকে পাওয়া যায় নাই।

যদি রিসিভারকে পাওয়া যায়, তাহলে যে সেন্ডার তার ব্যালেন্স থেকে যে এমাউন্ট সেন্ড করতে চাচ্ছে, সেটা কমিয়ে তার ব্যালেন্স প্রথমে আপডেট করবি। তারপর যে রিসিভার, তার ব্যালেন্সে সেই এমাউন্ট যোগ করে রিসিভারের ব্যালেন্স আপডেট করবি।

সব ঠিক হলে সবার শেষে একটা ম্যাসেজ পাঠাবি। টাকা ভালোভাবে সেন্ড করে দিয়েছি।

টাস্ক-৬: এইবার transactionHistory রাখতে পারস। যখন কেউ addMoney করে বা কাউকে sendMoney করে, সেই রিলেটেড কিছু তথ্য transactionHistory নামক একটা অ্যারেতে রাখতে পারস। প্রত্যেকটা transaction একটা অবজেক্ট হবে। সেখানে কিছু প্রোপার্টি থাকবে। যেমন: sender, receiver, amount ইত্যাদি।

টাস্ক-৭: কেউ টাকা সেন্ড করতে চাইলে send মানির জন্য 15 টাকা ফি যোগ করতে পারস। সেক্ষেত্রে যখন টাকা পাঠাবে, তখন চেক করবি, যে টাকা পাঠাবে, তার একাউন্টে সেন্ড এমাউন্ট প্লাস 15 টাকার বেশি আছে কি না। আবার যে টাকা রিসিভ করবে, সে কিন্তু এই প্রসেসিং ফি 15 টাকা পাবে না। এই প্রসেসিং ফি 15 টাকা জমা হবে কোম্পানির খাতায়। সেজন্য যেখানে users নামক অ্যারে আছে, সেখানে আরেকটা ভেরিয়েবল ডিক্লেয়ার করে দিতে পারস processingFee নামে এবং যতবার প্রসেসিং ফি পাবে, ততবার সেখানে টাকার পরিমাণ যোগ হবে।

25-4: কাজ করে কাজী, ফাঁকি দেয় পাঁজি

অনেক অনেক কাজ করতে করতেই কাজী হয়। আর নিজের সাথে ফাঁকিবাজি করলে নিজের ফিউচার নিজেই নষ্ট করে। তাই অনেকগুলা কাজের জন্য একটা সিম্পল এপ্লিকেশন বানাবি। সেটার জন্য একটা ফাইলে সব কোড রাখবি। সেজন্য একটা ফাইল তৈরি কর, নাম হতে পারে Todo.js। পুরো কোড এই এক ফাইলের মধ্যেই থাকবে। প্রজেক্টটিতে আমরা একটি TodoApp ক্লাস ব্যবহার করব, যেখানে সব কোড লিখে ফেলবি।

নিচে টাস্কগুলো ধাপে ধাপে দেয়া হলো:

১. সবার প্রথমে TodoApp ক্লাস তৈরি কর। এই ক্লাসের মধ্যে todos নামে একটি প্রোপার্টি (যেখানে কাজগুলো স্টোর হবে)। আরও কিছু প্রয়োজনীয় প্রোপার্টি থাকবে। প্রয়োজনীয় মেথড যেমন add, remove, complete, display ইত্যাদি থাকবে। সব একবারে লিখে ফেলা লাগবে না; বরং ধাপে ধাপে করবি।

২. নতুন কাজ যোগ করার জন্য addTodo নামে মেথড বানাবি। এই মেথড তিনটা প্যারামিটার নিবে। একটা হচ্ছে টাস্কের নাম, আরেকটা হচ্ছে এই কাজ করতে কত সময় লাগবে। আর থার্ডটা হচ্ছে, কোন ক্যাটাগরির টাস্ক। ক্যাটাগরি নামের মধ্যে Study, Entertainment, Personal, Health, Learning এই রকম যেকোনো কিছু হতে পারে।

এই মেথডের মধ্যে টাস্কের জন্য একটা অবজেক্ট বানাবি। যেখানে অবজেক্টের আইডি থাকবে। আইডির মান হবে, এই ক্লাসের todos-এর মধ্যে যতগুলা উপাদান আছে, তার সংখ্যার সাথে 1 যোগ করে তারপর task-এর নাম, টাস্কের ক্যাটাগরি, এই টাস্ক করতে কত সময় লাগবে এবং completed নামে একটা প্রোপার্টি থাকবে। প্রাথমিকভাবে completed-এর মান হবে false, তারপর এই টাস্ক অবজেক্টকে todos প্রোপার্টির মধ্যে যোগ করে দিবি।

৩. completeTodo নামে একটা মেথড তৈরি কর। এইটার মধ্যে প্যারামিটার হিসেবে কোনো একটা টাস্কের নাম নিবি। তারপর todos প্রোপার্টি থেকে সেই টাস্ককে কীভাবে খুঁজে বের করবি, সেটা আমি কিন্তু বলব না। তুই নিজে নিজে চিন্তা কর। তারপর টাস্কটি খুঁজে পেলে তার completed প্রোপার্টি true সেট করবি এবং টাস্ক কমপ্লিট হয়েছে, সেই হিসেবে রিটার্ন true পাঠিয়ে দিবি। আর যদি টাস্ক খুঁজে না পাস, তাহলে false রিটার্ন করবি।

৪. removeTodo নামে একটা মেথড তৈরি কর। সেখানে এই মেথড একটি প্যারামিটার নেবে টাস্কের নাম। আর মেথডের ভিতরে তোর কাজ হবে, এই টাস্কের পজিশন বা ইনডেক্স খোঁজ করা। তারপর todos থেকে সেটাকে রিমুভ করা। কেমনে করবি, তুই চিন্তা কর।

৫. displayTodoList মেথড তৈরি কর। এইখানে প্যারামিটার হিসেবে কোনো কিছু দিতে পারে, আবার নাও দিতে পারে। যদি প্যারামিটার হিসেবে কিছু না দেয়, তাহলে সব টাস্কের নাম, ক্যাটাগরি, সময়, আইডি— এইসব কনসোল লগ করবি। আর যদি প্যারামিটার হিসেবে কিছু দেয়, তাহলে সেটা হবে ক্যাটাগরির নাম। অর্থাৎ যদি প্যারামিটার হিসেবে ক্যাটাগরির নাম দেয়, তাহলে সেই ক্যাটাগরির সব টাস্ককে কনসোলে আউটপুট হিসেবে দেখাবি।

৭. hoursWorked নামে একটা মেথড তৈরি কর। এইটার কাজ হচ্ছে, এখন পর্যন্ত যতগুলা কাজ সম্পন্ন হয়েছে, সবগুলা কাজের জন্য টোটাল কত সময় লাগছে, সেটার যোগফল রিটার্ন করবে। চেষ্টা করবি, এইটা Array.reduce দিয়ে করতে। একান্তই না পারলে অন্য কোনো সিস্টেমে করতে পারস।

৮. timeNeeded নামে একটা মেথড তৈরি কর। এইটার কাজ হচ্ছে, এখন পর্যন্ত যে টাস্কগুলা করা হয়নি, সেগুলা করার জন্য টোটাল কত সময় লাগবে, সেটার যোগফল রিটার্ন করবে। চেষ্টা করবি এইটাও Array.reduce দিয়ে করতে। একান্তই না পারলে অন্য কোনো সিস্টেমে করতে পারস।

৯. editTodo নামে একটা মেথড যোগ কর। এই মেথডের কাজ হলো নির্দিষ্ট টাস্কের তথ্য আপডেট করা। মেথডটি দুইটি প্যারামিটার নেবে। প্রথম প্যারামিটার হচ্ছে টাস্কের নাম (যেটা আপডেট করতে চাচ্ছিস)। আর সেকেন্ড প্যারামিটার হচ্ছে একটা অবজেক্ট (যেখানে টাস্কের নাম, ক্যাটাগরি বা সময় থাকতে পারে, আবার নাও থাকতে পারে। যদি সেকেন্ড প্যারামিটার নাম থাকে, তাহলে ঐ টাস্কের নাম আপডেট করবি। যদি না থাকে, তাহলে আপডেট করবি না। একইভাবে যদি সেকেন্ড প্যারামিটারে ওই টাস্কের ক্যাটাগরি থাকে, তাহলে ক্যাটাগরি আপডেট করবি, না হয় করবি না। একইভাবে সেকেন্ড প্যারামিটার অবজেক্টে যদি সময় থাকে, তাহলে সেটা আপডেট করবি, না হয় করবি না। আর ফাইনালি যদি টাস্ক খুঁজে পাস এবং মিনিমাম একটা ডাটা আপডেট করিস, তাহলে true রিটার্ন করবি। আর যদি টাস্ক খুঁজে না পাস বা একটাও ডাটা আপডেট না করস, তাহলে false রিটার্ন করবি।

১০. getTodo নামে মেথড তৈরি কর। এই মেথডটি একটি প্যারামিটার নেবে। সেটা টাস্কের নাম বা ক্যাটাগরির নাম হতে পারে। তোর কাজ হবে, প্রত্যেকটা টাস্কের নাম অথবা ক্যাটেগরি চেক করবি। প্রথম একটা টাস্ক পেয়ে গেলে সেটাকে রিটার্ন করে দিবি। আর যদি কোনো টাস্ক না পাস, তাহলে undefined রিটার্ন করবি।

১১. largestTodo নামে মেথড যোগ কর। এই মেথড কোনো প্যারামিটার নিবে না। তবে যেসব কাজ এখনও কমপ্লিট হয়নি, তাদের মধ্যে যে কাজটার সময় সবচেয়ে বেশি, সেই টাস্কটা রিটার্ন করে দিবে।

১২. smallestTodo নামে মেথড যোগ কর। এই মেথড কোনো প্যারামিটার নিবে না। তবে যেসব কাজ এখনও কমপ্লিট হয়নি, তাদের মধ্যে যে কাজটার সময় সবচেয়ে কম, সেই টাস্কটা রিটার্ন করে দিবে।

১৩. sortTodos নামে মেথড যোগ কর। এই মেথড কোনো প্যারামিটার নিবে না। তবে যেসব কাজ এখনও কমপ্লিট হয়নি, সেগুলাকে সময় অনুসারে বেশি থেকে কম সময়, এই ক্রমানুসারে সাজিয়ে দিবে।

১৪. undoTodo নামে মেথড বানাবি। যদি কোনো টাস্ক ভুলবশত completed করা হয়ে যায়, তাহলে এই মেথড দিয়ে তা undo করতে পারবি। অর্থাৎ যদি টাস্কে completed যদি true থাকে, তাহলে সেটাকে false বানাবি। তারপর টাস্কের স্ট্যাটাস যদি চেঞ্জ হয়, তাহলে true রিটার্ন করবি, না হয় false রিটার্ন করবি।

১৫. completedPercentage নামে মেথড তৈরি কর। এই মেথড রিটার্ন করবে, টোটাল টাস্কের মধ্যে কত শতাংশ টাস্ক কমপ্লিট হয়েছে। ফলাফল পার্সেন্টেজ আকারে রিটার্ন করবি। যেটার মান ০-১০০%-এর মধ্যে হবে।

১৬. importTodos নামে মেথড যোগ কর। এই মেথডকে একটি JSON স্ট্রিং দেয়া হবে। সেই স্ট্রিংয়ের মধ্যে এক বা একাধিক টাস্ক থাকতে পরে। যদি টাস্ক থাকে, তাহলে সে JSON-কে কনভার্ট করে ধরে ধরে প্রত্যেকটা টাস্ক todos লিস্টে যোগ করবে।

১৭. clearAllTodos নামে একটি মেথড বানাবি, যা পুরো todos লিস্টকে একবারে ক্লিয়ার করে দেবে। অর্থাৎ আর কোনো todo থাকবে না।

একসাথে অনেকগুলা জিনিস প্র্যাকটিস কিন্তু তোর হয়ে গেল। কী মজা। এখন থেকে তুই নিজে নিজেই এইরকম কিছু প্রজেক্ট চিন্তা করে করে বের করবি। তারপর বসে বসে কোড করে ফেলবি।

Released under the MIT License.