Module Pattern և Revealing Module Pattern
Module Pattern և Revealing Module Pattern JavaScript-ում
Module Pattern և Revealing Module Pattern JavaScript-ում
Մոդուլային մտածելակերպը հանդիսանում է ժամանակակից JavaScript ծրագրավորման անկյունաքարերից։ Module Pattern-ը և Revealing Module Pattern-ը թույլ են տալիս գրել մաքուր, ինկապսուլացված, վերահսկելի կոդ՝ առանց գլոբալ տարածքի աղտոտման։
Մինչև ES6 modules
-ի ի հայտ գալը, JavaScript-ում մոդուլների ստեղծման հիմնական միջոցը եղել են IIFE-ները (Immediately Invoked Function Expressions)։
Module Pattern
Այն օգտագործում է IIFE՝ ստեղծելով փակ տարածք (scope), որտեղ կարող ենք սահմանել private (փակ) և public (բաց) անդամներ։
const CounterModule = (function () { // private members let count = 0;
function increment() { count++; }
function getCount() { return count; }
// public API return { increment, getCount }; })();
CounterModule.increment();
console.log(CounterModule.getCount()); // 1 console.log(CounterModule.count); // undefined (private)
Կարևոր հատկանիշներ՝
- Փակ տարածքում պահվում են private տվյալները
- Արտաքին աշխարհին ներկայացվում է միայն public API-ն
Revealing Module Pattern
Սա Module Pattern-ի պարզեցված և ավելի կարդացվող տարբերակն է։ Բոլոր ֆունկցիաները և փոփոխականները հայտարարվում են փակ տարածքում, իսկ հետո վերադարձվում է միայն այն, ինչ ուզում ենք բացել՝ օգտագործելով նույն անուններով օբյեկտ։
const MathModule = (function () { let PI = 3.14159;
function area(radius) { return PI * radius * radius; }
function circumference(radius) { return 2 * PI * radius; }
return { area, circumference }; })();
console.log(MathModule.area(2)); // 12.56636 console.log(MathModule.PI); // undefined
Արտահայտված առավելություններ՝
- Կոդի կառուցվածքը ավելի պարզ է և ընթեռնելի
- Հստակ է, թե որոնք են հասանելի արտաքին աշխարհին
Բարդ օրինակ՝ Dependency Injection Reveal Pattern-ով
Ներառելով կախվածություն մոդուլի մեջ՝ կարող ենք հասնել ավելի մոդուլային և թեստավորվող համակարգի։
const Logger = (function () { function log(message) { console.log(`[LOG]: ${message}`); }
return { log }; })();
const UserService = (function (logger) { let users = [];
function addUser(user) { users.push(user); logger.log(User ${user} added); }
function getUsers() { return users; }
return { addUser, getUsers }; })(Logger);
UserService.addUser('Anna'); console.log(UserService.getUsers());
Արդյունք՝
- Մոդուլները միմյանցից բաժանված են՝ loose coupling
- Կարող ենք թեստերի ժամանակ փոխարինել
Logger
-ը mock տարբերակով
Եզրակացություն
Module Pattern-ը և Revealing Module Pattern-ը JavaScript-ում թույլ են տալիս գրագետ կառավարել private/public տարանջատումը և կառուցել ինկապսուլացված մոդուլներ։ Չնայած այժմ ES6 մոդուլներն ավելի ընդունված են, այս մոտեցումները դեռ օգտակար են՝ closure-ների և encapsulation-ի համար, հատկապես library-ներ գրելու ժամանակ։
Հաջորդ մասում կանդրադառնանք ES6 դասերին և մոդուլներին՝ ժամանակակից OOP կիրառմամբ JavaScript-ում։
- 0
- 1