Բազային և աբստրակտ class-եր
Բազային և աբստրակտ class-եր JavaScript-ում
JavaScript-ում չնայած բացակայում է abstract
keyword-ը, հնարավոր է ստեղծել աբստրակտ (կիսով չափ բացակայող իրականացման) class-երի նման կառուցվածքներ։ Սա թույլ է տալիս սահմանել ընդհանուր կառուցվածք, որն օգտագործելու համար պետք է իրականացվի երեխա class-երում։
Աբստրակտ class-երի նպատակը՝ ապահովել ընդհանուր ինտերֆեյս և թողնել կոնկրետ իրագործումը երեխաներին։
Սովորական base class-ում մենք կարող ենք ստեղծել մեթոդներ, որոնք կարող են վերաձևակերպվել (override) երեխաների կողմից։
class Animal { constructor(name) { this.name = name; }
speak() { console.log(${this.name} makes a sound); } }
Երեխա class-երը կարող են ժառանգել և override անել speak()
մեթոդը՝ իրենց կարիքներին համապատասխան․
class Dog extends Animal { speak() { console.log(`${this.name} barks`); } }
const d = new Dog('Rex'); d.speak(); // Rex barks
Չնայած JavaScript-ը չունի աբստրակտ class-երի համար հատուկ սինտաքս, կարող ենք դրանք իմիտացնել՝ օրինակ՝ պարտադրելով որոշ մեթոդների իրականացում երեխաների կողմից։
class Shape { constructor() { if (this.constructor === Shape) { throw new Error("Abstract class 'Shape' cannot be instantiated directly."); } }
area() { throw new Error("Method 'area()' must be implemented."); } }
Սա թույլ չի տալիս անմիջապես ստեղծել Shape
object․
const s = new Shape(); // Error: Abstract class 'Shape' cannot be instantiated directly.
Երեխան պետք է իրականացնի area()
մեթոդը․
class Rectangle extends Shape { constructor(w, h) { super(); this.w = w; this.h = h; }
area() { return this.w * this.h; } }
const r = new Rectangle(4, 5); console.log(r.area()); // 20
Այս կառուցվածքը օգտակար է, երբ ցանկանում ես սահմանել ընդհանուր կառուցվածք՝ պարտադրելով երեխային վերագրել որոշ մեթոդներ։
JavaScript-ում բացակայում է interface
, բայց կարող ենք օգտագործել JSDoc և ստատիկ գործիքներ (օր.՝ TypeScript կամ ESLint-ի հատուկ կարգավորումներ)՝ ինտերֆեյսների ստուգման համար։
Օրինակ՝
/** * @interface ShapeInterface * @method area */
/**
@implements {ShapeInterface} */ class Circle { area() { return Math.PI * 2 ** 2; } }
Այսպիսի նշումներն օգնում են IDE-ին և ստատիկ ստուգման գործիքներին ցույց տալ՝ որ class-ը պետք է համապատասխանեցվի տվյալ ինտերֆեյսին։
Բազային և աբստրակտ class-երը JavaScript-ում թույլ են տալիս ստեղծել ուժեղ հիմք OOP դիզայնի համար՝ չնայած լեզուն չունի ուղղակի abstract
և interface
հասկացություններ։ Այս մոտեցումները նպաստում են կոդի վերահասարակեցմանը, նոր class-երի անվտանգ ավելացմանը և OOP-ի սկզբունքների պահպանմանը։
Հաջորդ մասում կխոսենք՝ SOLID սկզբունքների կիրառումը JavaScript-ի OOP-ում՝ մասնավորապես՝ ինչպես է ամեն սկզբունք կիրառվում իրական նախագծերում։