Thuta Learning
ရှာဖွေရန်
ProjectsProgrammingintermediate

Mini Project: Task Manager - Part 2 (Class & Filtering)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Mini Project: Task Manager - Part 2 (Class & Filtering) ကို လက်တွေ့ project ထဲမှာ အသုံးချတတ်မယ်
  • ကိုယ်တိုင် code ရေးပြီး run ကြည့်တတ်မယ်
  • Project တစ်ခုလုံးကို အဆင့်လိုက် ဆောက်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

Part 1 မှာ global variable နဲ့ function တွေအဖြစ် ရေးထားတဲ့ code ကို ဒီအပိုင်းမှာ class တစ်ခုအောက် ပြန်လည် organize လုပ်ပါမယ်။ Classes ကို အသုံးပြုခြင်းက state (tasks array) နဲ့ behavior (addTask, listTasks) တွေကို တစ်နေရာတည်း စုစည်းပေးပြီး၊ private field များဖြင့် data ကို encapsulate လုပ်နိုင်ပါတယ်။ ထို့အပြင် union types နဲ့ type narrowing ကို အသုံးပြုပြီး status အလိုက် task များကို filter လုပ်တဲ့ method တစ်ခု ထည့်ပါမယ်။ ဒီအဆင့်ကနေတဆင့် real-world application တွေမှာ class-based structure ဘယ်လို အသုံးဝင်လဲဆိုတာ သိသာစွာ မြင်ရပါလိမ့်မယ်။

လက်တွေ့ ဆောက်ကြည့်မယ်

TaskManager class တစ်ခု ဖန်တီးပြီး private tasks: Task[] = [] နှင့် private nextId: number = 1 ဆိုတဲ့ field များ ထည့်ပါ။ Class ထဲမှာ addTask(), listTasks() method များကို Part 1 ကနေ ပြောင်းရေးပါ။ updateStatus(id: number, status: TaskStatus): boolean ဆိုတဲ့ method တစ်ခု ထပ်ထည့်ပြီး၊ tasks array ထဲက id တူတဲ့ task ကို ရှာပြီး status ကို update လုပ်ပါ (မတွေ့ရင် false ပြန်ပါ)။ filterByStatus(status: TaskStatus): Task[] ဆိုတဲ့ method ကိုလည်း ထည့်ပြီး status နှင့် ကိုက်ညီတဲ့ task များကိုသာ array အသစ်အဖြစ် ပြန်ပါ (Array.filter() သုံးပါ)။ နောက်ဆုံးမှာ TaskManager instance တစ်ခု ဖန်တီးပြီး task များ ထည့်၊ status update လုပ်၊ filter လုပ်ပြီး result ကို console.log ဖြင့် စမ်းသပ်ပါ။

Code နမူနာ

typescript
class TaskManager {
  private tasks: Task[] = [];
  private nextId: number = 1;

  addTask(title: string, priority: Task["priority"]): Task {
    const task: Task = {
      id: this.nextId++,
      title,
      status: TaskStatus.Todo,
      priority,
    };
    this.tasks.push(task);
    return task;
  }

  listTasks(): void {
    this.tasks.forEach((t) =>
      console.log(`#${t.id} [${t.status}] ${t.title} (${t.priority})`)
    );
  }

  updateStatus(id: number, status: TaskStatus): boolean {
    const task = this.tasks.find((t) => t.id === id);
    if (!task) return false;
    task.status = status;
    return true;
  }

  filterByStatus(status: TaskStatus): Task[] {
    return this.tasks.filter((t) => t.status === status);
  }
}

const manager = new TaskManager();
manager.addTask("Learn generics", "high");
manager.addTask("Deploy project", "medium");
manager.updateStatus(1, TaskStatus.InProgress);

console.log("In Progress tasks:");
manager.filterByStatus(TaskStatus.InProgress).forEach((t) =>
  console.log(`- ${t.title}`)
);
You should see
"In Progress tasks:" ဆိုတဲ့ heading အောက်တွင် status update လုပ်ထားသော task title ("Learn generics") ကိုသာ ပြသပေးမည်။

၅ မိနစ် စမ်းကြည့်

removeTask(id: number): boolean ဆိုတဲ့ method တစ်ခု TaskManager class ထဲသို့ ထည့်ပြီး၊ id တူသော task ကို tasks array ထဲက filter() သုံးပြီး ဖယ်ရှားနိုင်အောင် implement လုပ်ကြည့်ပါ။

သတိလေးတစ်ချက်

Array.find() က တွေ့လျှင် object reference ကို ပြန်ပေးသောကြောင့် ၎င်းအပေါ် field တန်ဖိုး ပြောင်းလိုက်ခြင်းက original array ထဲက object ကိုပါ တိုက်ရိုက် ပြောင်းလဲသွားနိုင်တဲ့အတွက် side-effect ဖြစ်နိုင်ကြောင်း သတိထားပါ။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • class field များကို private ဟု သတ်မှတ်ထားပြီးနောက် instance အပြင်ဘက်မှ manager.tasks ကဲ့သို့ တိုက်ရိုက် access လုပ်ရန် ကြိုးစားလျှင် compile error ရရှိမည်ကို မထင်မှတ်ခြင်း
  • filter() method သည် original array ကို မပြောင်းလဲဘဲ array အသစ်တစ်ခု return ပြန်ကြောင်း မသိဘဲ return value ကို variable ထဲ မသိမ်းပဲ ချန်ထားခြင်း

အခု ကိုယ်တိုင် စမ်းကြည့်

removeTask(id: number): boolean ဆိုတဲ့ method တစ်ခု TaskManager class ထဲသို့ ထည့်ပြီး၊ id တူသော task ကို tasks array ထဲက filter() သုံးပြီး ဖယ်ရှားနိုင်အောင် implement လုပ်ကြည့်ပါ။

You'll know it worked when: "In Progress tasks:" ဆိုတဲ့ heading အောက်တွင် status update လုပ်ထားသော task title ("Learn generics") ကိုသာ ပြသပေးမည်။

Mini Project: Task Manager - Part 2 (Class & Filtering) | Thuta Learning