Design Patterns TypeScript-д
Design pattern бол программ хөгжүүлэлтэд байнга тохиолддог асуудлуудын батлагдсан шийдэл юм. Эдгээрийг цээжлэх биш — ямар нөхцөлд хэрэглэхийг мэдэх нь чухал. TypeScript-ийн төрлийн систем design pattern-уудыг илүү аюулгүй, уншихад хялбар болгодог.
Энэ хичээлд хамгийн түгээмэл гурван pattern — Singleton, Factory, Observer — TypeScript-ааp хэрэгжүүлнэ.
Singleton Pattern
Singleton нь тухайн class-ийн зөвхөн нэг л объект байхыг баталгаажуулдаг. Датабаасын холболт, тохиргоо, лог систем зэрэгт өргөн хэрэглэгддэг.
class ТохиргооныМенежер {
// Цорын ганц instance-ийг хадгалах
private static instance: ТохиргооныМенежер | null = null;
private тохиргоо: Map<string, string> = new Map();
// constructor-ийг private болгоно — шууд new хийхийг хориглоно
private constructor() {
this.тохиргоо.set("хэл", "mn");
this.тохиргоо.set("загвар", "харанхуй");
}
// Цорын ганц нэвтрэх цэг
static авах(): ТохиргооныМенежер {
if (!ТохиргооныМенежер.instance) {
ТохиргооныМенежер.instance = new ТохиргооныМенежер();
}
return ТохиргооныМенежер.instance;
}
утгаАвах(түлхүүр: string): string | undefined {
return this.тохиргоо.get(түлхүүр);
}
утгаТохируулах(түлхүүр: string, утга: string): void {
this.тохиргоо.set(түлхүүр, утга);
}
}
// Ашиглах
const тохиргоо1 = ТохиргооныМенежер.авах();
const тохиргоо2 = ТохиргооныМенежер.авах();
тохиргоо1.утгаТохируулах("хэл", "en");
console.log(тохиргоо2.утгаАвах("хэл")); // "en" — нэг л объект
console.log(тохиргоо1 === тохиргоо2); // true — яг нэг объект
Factory Pattern
Factory нь объект үүсгэх логикийг нэг газар төвлөрүүлж, new хийх кодыг нуудаг. Ямар class үүсгэхийг нөхцөлөөс хамааруулан шийдэхэд тохиромжтой.
// Мэдэгдэл (notification) илгээдэг систем
interface Мэдэгдэл {
илгээх(хүлээн_авагч: string, мэдэгдэл: string): void;
}
class И_МэйлМэдэгдэл implements Мэдэгдэл {
илгээх(хүлээн_авагч: string, мэдэгдэл: string): void {
console.log(`И-мэйл → ${хүлээн_авагч}: ${мэдэгдэл}`);
}
}
class СМСМэдэгдэл implements Мэдэгдэл {
илгээх(хүлээн_авагч: string, мэдэгдэл: string): void {
console.log(`СМС → ${хүлээн_авагч}: ${мэдэгдэл}`);
}
}
class ПушМэдэгдэл implements Мэдэгдэл {
илгээх(хүлээн_авагч: string, мэдэгдэл: string): void {
console.log(`Push → ${хүлээн_авагч}: ${мэдэгдэл}`);
}
}
// Factory — ямар төрлийн мэдэгдэл үүсгэхийг шийдэнэ
type МэдэгдлийнТөрөл = "и_мэйл" | "смс" | "пуш";
class МэдэгдлийнFactory {
static үүсгэх(төрөл: МэдэгдлийнТөрөл): Мэдэгдэл {
switch (төрөл) {
case "и_мэйл":
return new И_МэйлМэдэгдэл();
case "смс":
return new СМСМэдэгдэл();
case "пуш":
return new ПушМэдэгдэл();
}
}
}
// Ашиглах — ямар class үүсэхийг мэдэх шаардлагагүй
const мэдэгдэл = МэдэгдлийнFactory.үүсгэх("и_мэйл");
мэдэгдэл.илгээх("user@example.com", "Хичээл дууслаа! +10 XP");
Observer Pattern
Observer нь нэг объектод болсон өөрчлөлтийг хэд хэдэн объектод автоматаар мэдэгддэг. Энэ нь JavaScript-ийн event system-ийн суурь зарчим юм.
// Сонсогч (observer) interface
interface Сонсогч<T> {
шинэчлэх(өгөгдөл: T): void;
}
// Мэдэгдэл тараагч (subject)
class XPТараагч {
private сонсогчид: Сонсогч<number>[] = [];
private _xp: number = 0;
// Сонсогч нэмэх
бүртгэх(сонсогч: Сонсогч<number>): void {
this.сонсогчид.push(сонсогч);
}
// Сонсогч хасах
цуцлах(сонсогч: Сонсогч<number>): void {
this.сонсогчид = this.сонсогчид.filter((с) => с !== сонсогч);
}
// XP нэмэхэд бүх сонсогчид мэдэгдэнэ
xpНэмэх(хэмжээ: number): void {
this._xp += хэмжээ;
this.сонсогчид.forEach((с) => с.шинэчлэх(this._xp));
}
}
// Сонсогчдын хэрэгжүүлэлт
class ТүвшингийнШалгагч implements Сонсогч<number> {
шинэчлэх(xp: number): void {
if (xp >= 100) console.log("🏆 Анхны түвшин хүрлээ!");
if (xp >= 500) console.log("⭐ Гарамгай суралцагч!");
}
}
class ДэлгэцийнШинэчлэгч implements Сонсогч<number> {
шинэчлэх(xp: number): void {
console.log(`UI шинэчлэгдлээ: ${xp} XP`);
}
}
// Ашиглах
const тараагч = new XPТараагч();
const түвшин = new ТүвшингийнШалгагч();
const дэлгэц = new ДэлгэцийнШинэчлэгч();
тараагч.бүртгэх(түвшин);
тараагч.бүртгэх(дэлгэц);
тараагч.xpНэмэх(50); // дэлгэц шинэчлэгдэнэ
тараагч.xpНэмэх(60); // дэлгэц шинэчлэгдэж, түвшин ахина
Дараагийн хичээлд:
SOLID зарчмуудыг TypeScript-ааp хэрхэн хэрэгжүүлэх тухай сурна — цэвэр, дахин ашиглагдах код бичих философи.