الگوهای طراحی نرم افزار در جاوا اسکریپت – از صفر تا صد


فرض کنید که در زمان کار روی یک پروژه نرمافزاری بارها و بارها با مسئله مشخصی مواجه میشوید و هر بار نیز یک راهحل برای آن توسعه میدهید. این وضعیت در نهایت ملالآور میشود و حتی ممکن است برای اطرافیان شما سردرگمکننده شود، زیرا امکان بهینهسازی آن وجود نخواهد داشت. به جای این کار میتوانیم از الگوهایی برای حل مسئله استفاده کنیم. در زندگی روزمره این موضوع را «میانبر ذهنی» (Heuristics) و در صنعت نرمافزار آن را «الگوهای طراحی» مینامیم. در این مقاله به بررسی الگوهای طراحی نرم افزار در جاوا اسکریپت میپردازیم.
منظور از الگوی طراحی در صنعت نرمافزار، راهحلی برای یک مسئله است که به طور مکرر رخ میدهد و به طور کلی توافق وجود دارد که بهترین راهحل است. درک الگوهای طراحی موجب میشود که از مزیتهای زیر بهرهمند شویم:
- حل مسائل با رخداد متواتر، آسانتر و سریعتر میشود.
- امکان حل مسائل با راهحلهای ازپیشبهینهسازیشده فراهم میآید.
- میتوان کدی نوشت که برای افرادی که آن الگوی طراحی را درک میکنند، آشنا باشد.
الگوهای آفرینشی
در این بخش الگوهای «آفرینشی» (Creational) را معرفی میکنیم.
الگوی سازنده
مسئله: به روشی برای ایجاد یک وهله از یک شیء نیاز داریم تا بتوانیم کارکردش را بسط دهیم.
الگوی «سازنده» (Constructor) در جاوا اسکریپت از کلیدواژه new برای ساخت یک شیء جدید از یک تابع استفاده میکند. این شیء ساخته شده جدید به پروتوتایپ شیء لینک میشود، کلیدواژه this به دامنه این شیء جدید متصل میشود و به صورت صریح this را بازگشت میدهد.
جاوا اسکریپت برای بسط بیشتر کارکرد شیء از وراثت مبتنی بر پروتوتایپ نیز بهره میگیرد.
در نسخه ECMAScript 2015 از جاوا اسکریپت کلاسهایی برای ایجاد نسخههای متفاوت از وراثت مبتنی بر پروتوتایپ موجود اضافه شدهاند.
الگوی ماژول
الگوی «ماژول» (Module) برای گروهبندی تعدادی متد که به یک خانواده تعلق دارند، مورد استفاده قرار میگیرد.
مزیت عمده الگوی ماژول در افزایش قابلیت نگهداری، کاهش آلودگی فضای نام و همچنین در صورت داشتن طراحی خوب، در قابلیت بالای استفاده مجدد از کد نهفته است. رایجترین و سرراستترین پیادهسازی از الگوی ماژول در جاوا اسکریپت این است که نتیجه یک IIFE را به یک متغیر نسبت داده و آن متغیر را اکسپورت کنیم.
الگوی فکتوری
یک الگوی «فکتوری» (Factory) موجب تسهیل ایجاد شیء میشود. الگوی فکتوری زمانی مفید است که بخواهیم شیئی ایجاد کنیم که پیچیده خواهد بود و نسخههای مختلفی از شیء بسته به کانتکست ایجاد خواهد شد.
الگوی سینگلتون
الگوی «سینگلتون» (Singelton) برای محدودسازی یک شیء به یک وهله در سراسر اپلیکیشن طراحی شده است. به این ترتیب زمانی که این وهله فراخوانی شود، آخرین باری که فراخوانی شده بود را به خاطر میآورد و همان وهله شیء را بازگشت میدهد.
الگوهای ساختاری
در این بخش الگوهای ساختاری رایج در زبان جاوا اسکریپت را بررسی میکنیم.
الگوی دکوراتور
الگوی «دکوراتور» (Decorator) ریشه در برنامهنویسی شیءگرا دارد و در مواردی که امکان استفاده از وراثت نباشد، برای ارائه کارکردهای اضافی برای یک شیء منفرد در زمان اجرا مورد استفاده قرار میگیرد. برای ایجاد یک دکوراتور در جاوا اسکریپت، ابتدا باید یک وهله جدید از سازنده بسازیم و این وهله را به فراخوانی وهلهسازی دکوراتور ارسال کنیم. در نتیجه یک شیء جدید ایجاد میشود که دارای کارکردهای شیء اصلی است و سپس کارکردهای اضافی دکوراتور نیز به آن افزوده میشود.
الگوی نما
الگوی «نما» (Facade) برای ارائه یک اینترفیس یا API ساده برای یک زیرسیستم پیچیده استفاده میشود. زمانی که به نمای مقابل یک ساختمان مینگرید، با «نما» ی آن مواجه میشوید. این نمای ساختمان همه پیچیدگیهای بالقوه درون آن را پنهان میسازد.
React نمونه خوبی برای یک الگوی Facade است. پیچیدگی مدیریت یک DOM مجازی در پشت استفاده آسان از یک اینترفیس در کلاس کامپوننتها پنهان شده است.
الگوی Flyweight
الگوی Flyweight برای کار با مجموعههای بزرگی از اشیا استفاده میشود. این الگو با اشتراک بخشهایی از اشیا با اشیای دیگر در مجموعه موجب صرفهجویی در حافظه میشود.
الگوی Flyweight مشخصههای تکراری مییابد و ارجاع یکتایی به هر مشخصه یکتا ایجاد میکند و مشخصهها را روی مجموعه دادهها برای دستیابی به ارجاع یکتا با هم عوض میکند. این کار موجب ایجاد منحصر به فرد شدن مشخصهها میشود و سربار مجموعه دادهها را کاهش میدهد.
الگوهای رفتاری
در این بخش الگوهای رفتاری را در زبان جاوا اسکریپت بررسی میکنیم.
الگوی Observer
الگوی Observer به صورت یک رابطه یک به چند بین یک Observer و مشترکانش تعریف میشود. مشترکان مسئول ثبت نام و لغو ثبت نام در Observer هستند و خود Observer نیز مسئول ارسال بهروزرسانیها به مشترکانش است.
Observer دارای سه متد اصلی به صورت ثبت نام (Subscribe)، لغو ثبت نام (Unsubscribe) و انتشار (Broadcast) است. متد ثبت به صورت یک پارامتر با مشترک فراخوانی میشود و آن را به لیست مشترکان اضافه میکند. متد لغو ثبت نام مشترک را از لیست مشترکان Observer حذف میکند.
الگوی Mediator
زمانی که تعداد زیادی سرویس داخلی داشته باشید که بر دادهها و سرویسهای دیگری متکی باشند، ممکن است با مشکل در ارتباط بین سرویسها مواجه شوید. یک Mediator به صورت مرجعیت مرکزی برای سرویسهای داخلی عمل میکند تا مطمئن شویم که همه سرویسها از تغییرهای حالت آگاه هستند.
به این ترتیب به پایان این مقاله با موضوع معرفی الگوهای طراحی نرمافزار در جاوا اسکریپت میرسیم.