اگر تا الآن با مفاهیم Object، Closure و( IIFE )immediately-invoked functional expression در جاوااسکریپت آشنا هستید، وقت آن است که از این مفاهیم در قالب الگوهای طراحی استاندارد، استفاده کنید. در واقع module pattern در جاوااسکریپت نوعی شبیهسازی از کلاسها است که ممکن است با مفهوم آن در زبانهای دیگر آشنا باشید.
برای آنکه بتوانید کمی با هدفش آشنا شوید، معنی کلمهی module میتواند کمک کند:
"هر مجموعهای از قسمتهای استاندارد یا واحدهای مستقل، که در ساخت ساختارهای پیچیده استفاده میشود."
با این الگو میتوانیم در یک object انواع تابعها و متغیرهای private یا public داشته باشیم و آنها را از قسمت global جدا کنیم. این کار احتمال تشابهات اسمی در تابعها را کاهش میدهد.
خب فعلاً از توضیحات تئوری میگذرم و با یک مثال ادامه میدهم:
در این مثال یک shopping basket با استفاده از module pattern پیادهسازی شده. آرایهی basket در داخل ماژول به شکل private قرار دارد. فقط تابعهایی که به scope آن دسترسی داشته باشند، میتوانند آن را بخوانند، مانند ()addItem و ()getItemCount و ...( اینها مرتبط به بحث closure در جاوااسکریپت است. )
همچنین میبینید که در آخر module, یک object برگردانده میشود، تا بتوانیم در بیرون از basketModule به تابع های public دسترسی داشته باشیم.
برای برنامهنویس هایی که پیش زمینه کار با زبانهای object-oriented را دارند، تمیزتر است.
از اطلاعات private استفاده میکند. یعنی در این الگو، قسمتهای public کدتان میتواند به قسمتهای private دسترسی داشته باشد. ولی باقی برنامهها فقط میتوانند از قسمتهای public استفاده کنند.( که قسمتهای public میتواند شامل بخشی از قسمتهای private باشد. )
این الگوی طراحی، راهی را ایجاد میکند تا ترکیبی از تابعها و متغیرهای public و private را به شکل بستهبندی داشته باشیم، به طوری که به بخش global کد، آشکار نشوند. این کار، راهحل خوبی است تا منطق برنامه را مخفی کنیم و فقط نوعی interface را به بقیه برنامههایمان نمایش دهیم. این الگو شباهت زیادی با IIFE ها دارد. به جز اینکه در این الگوی طراحی، یک object برگردانده میشود. ولی در IIFE یک تابع برگردانده میشود.
البته باید توجه داشت که در جاوااسکریپت، مفهوم "privacy" به معنای واقعی کلمه وجود ندارد. زیر برعکس بعضی از زبانها شامل access modifier نیست. متغیرها به طور دقیق نمیتوانند به شکل private یا public تعریف شوند. پس ما از scope تابعها استفاده میکنیم تا این مفهوم را شبیهسازی کنیم. در module pattern به لطف مفهوم closure، متغیرها و تابعهای تعریف شده، فقط در داخل module قابل دسترسیاند. ولی متغیرها و تابعهای موجود در returning object، توسط همه قابل دسترسی اند.
ترجمهای از بخشی از کتاب Learning JavaScript Design Patterns از Addy Osmani