زمان تخمینی مطالعه: 7 دقیقه
الگوهای طراحی راه حلهای معمولی برای مشکلات رایج در طراحی نرم افزار هستند. در واقع دیزاین پترنها(Design Pattern) مانند نقشههای از پیش ساخته شدهای هستند که میتوانید آنها را برای حل یک مشکل طراحی تکراری در برنامه نویسی و کد خود سفارشی کنید. کاربر نمیتواند فقط یک الگو را پیدا کرده و آن را در برنامه خود کپی کند، همانطور که با توابع یا کتابخانههای بیرونی میتواند. الگوی طراحی یک قطعه کد خاص نیست، بلکه یک مفهوم کلی برای حل یک مشکل خاص است. شما میتوانید جزئیات الگو را دنبال کنید و راه حلی متناسب با واقعیتهای برنامه خود را پیاده سازی کنید.
الگوها اغلب با الگوریتمها اشتباه گرفته میشوند، زیرا هر دو مفهوم راه حلهای معمولی برای برخی از مسائل شناخته شده را توصیف میکنند. در حالی که یک الگوریتم همیشه مجموعه واضحی از اقدامات را تعریف میکند که میتواند به هدفی دست یابد در حالی که یک الگوی طراحی توصیف سطح بالایی از یک راه حل است. کد یک الگوی اعمال شده برای دو برنامه مختلف ممکن است متفاوت باشد. اگر بخواهیم الگوریتم و Design pattern را با هم مقایسه کنیم باید گفت هر دو دارای مراحل روشن برای رسیدن به یک هدف هستند. از سوی دیگر، یک الگوی طراحی بیشتر شبیه یک طرح اولیه است: شما میتوانید ببینید که نتیجه و ویژگیهای آن چیست، اما ترتیب دقیق اجرای آن به شما بستگی دارد.
الگوی طراحی از چه چیزی تشکیل شده است؟
بیشتر الگوهای طراحی بسیار رسمی(Formal) توصیف میشوند تا افراد بتوانند آنها را در زمینههای مختلف بازتولید کنند. در ادامه بخشهایی که معمولاً در توضیحات الگوهای طراحی وجود دارند آورده شده است:
- هدف الگوی طراحی به طور خلاصه هم خود مسئله و هم راه حل را تشریح میکند.
- انگیزه بیشتر مسئله و راه حلی را که دیزاین پترن ممکن میسازد را توضیح میدهد.
- ساختار کلاسها هر بخش از الگو و نحوه ارتباط آنها را نشان میدهد.
- مثال کد در یکی از زبانهای برنامه نویسی محبوب، درک ایده پشت الگو را آسانتر میکند.
برخی از کاتالوگهای الگو، جزئیات مفید دیگری مانند قابلیت کاربرد الگو، مراحل اجرا و روابط با سایر الگوها را لیست میکنند.
تاریخچه الگوهای طراحی
چه کسی الگوهای طراحی در حوزه برنامه نویسی را اختراع کرد؟ این یک سوال خوب است، اما خیلی دقیق نیست. الگوهای طراحی مفاهیم مبهم و پیچیدهای نیستند. الگوها راه حلهای معمولی برای مشکلات رایج در طراحی شی گرا هستند. هنگامی که یک راه حل بارها و بارها در پروژههای مختلف تکرار میشود، در نهایت کسی نامی برای آن میگذارد و راه حل را با جزئیات شرح میدهد. این اساساً چگونگی ایجاد و خلق یک الگوی طراحی است.
مفهوم الگوها اولین بار توسط کریستوفر الکساندر در کتاب A Pattern Language: Towns, Buildings, Construction توضیح داده شد. این کتاب یک “زبان” برای طراحی محیط شهری را توصیف میکند. واحدهای این زبان الگوها هستند. این زبان قادر به توصیف موارد متنوع مانند این است که پنجرهها چقدر باید بلند باشد، یک ساختمان باید چند سطح داشته باشد، فضای سبز در یک محله چقدر بزرگ است و غیره.
این ایده توسط چهار نویسنده دیگر شامل اریش گاما، جان ولیسیدز، رالف جانسون و ریچارد هلم انتخاب شد. در سال 1994 آنها Design Patterns: Elements of Reusable Object-Oriented Software را منتشر کردند که در آن مفهوم الگوی طراحی یا Design Pattern را در برنامه نویسی به کار گرفتند. این کتاب دارای 23 الگو بود که مشکلات مختلف طراحی شی گرا را حل میکرد و خیلی سریع به یکی از پرفروش ترین کتابهای حوزه برنامه نویسی تبدیل شد. به دلیل نام طولانی این کتاب، در بین برنامه نویسان این کتاب با نام «the book by the gang of four» شناخته میشود و حتی به طور خلاصه آن را «کتاب GoF» مینامند.
از آن زمان، دهها الگوی شی گرا دیگر کشف شده است. “رویکرد الگو” در سایر زمینههای برنامه نویسی بسیار محبوب شد، بنابراین بسیاری از الگوهای دیگر در حال حاضر خارج از طراحی شی گرا نیز وجود دارند.
چرا باید Design Pattern را یاد بگیرم؟
حقیقت این است که شما ممکن است بتوانید سالها به عنوان یک برنامهنویس کار کنید بدون اینکه از یک الگوی واحد اطلاع داشته باشید. بسیاری از مردم این کار را انجام میدهند. با این حال، حتی در آن صورت، ممکن است برخی از الگوها را بدون اینکه بدانید استفاده میکنید. پس چرا باید وقت خود را صرف یادگیری این الگوها بکنیم؟ در ادامه پاسخ این سوال بیان شده است:
- الگوهای طراحی مجموعه ابزاری از راه حلهای آزمایش شده و تست شده برای مشکلات رایج در طراحی نرم افزار هستند. حتی اگر هرگز با این مشکلات روبرو نشوید، دانستن الگوها همچنان مفید است زیرا به شما میآموزد که چگونه انواع مشکلات را با استفاده از اصول طراحی شی گرا حل کنید.
- الگوی طراحی یک زبان مشترک را تعریف میکنند که شما و هم تیمیهایتان میتوانید برای برقراری ارتباط موثرتر از آن استفاده کنید. به عنوان نمونه فقط کافی است بگویید: «در این مورد فقط از یک singleton برای آن استفاده کنید» و با این گفته کل تیم برنامه نویسی ایده پشت پیشنهاد شما را درک خواهند کرد. اگر خود الگو و نام آن را بدانید نیازی به توضیح نیست که singleton چیست.
انتقادات وارده به الگوهای طراحی
بیایید نگاهی به معمولترین استدلالها علیه استفاده از الگوهای طراحی بیندازیم.
- راه حل سریع(Kludges) برای یک زبان برنامه نویسی ضعیف : معمولاً نیاز به الگوها زمانی ایجاد میشود که افراد زبان برنامهنویسی یا فناوریای را انتخاب میکنند که سطح انتزاع لازم را ندارد. در این مورد، الگوها تبدیل به یک راه حل سریع میشوند که تواناییهای فوقالعاده مورد نیاز را به زبان میبخشد. به عنوان مثال، الگوی استراتژی(Strategy) را میتوان با یک تابع ساده ناشناس (لامبدا) در اکثر زبانهای برنامه نویسی مدرن پیادهسازی کرد.
- راه حلهای ناکارآمد: الگوها سعی میکنند رویکردهایی را که قبلاً به طور گسترده مورد استفاده قرار گرفتهاند، نظام مند کنند. این یکپارچگی توسط بسیاری به عنوان یک عقیده(ِdogma) تلقی میشود، و آنها الگوها را جزء به جزء پیاده میکنند، بدون اینکه آنها را با زمینه پروژه خود تطبیق دهند.
- استفاده غیر موجه: به طور خلاصه میتوان گفت که اگر تنها چیزی که دارید دیزاین پترن است، میخواهید آن را در همه جا استفاده کنید. این مشکلی است که بسیاری از تازه کارها را که به تازگی با الگو طراحی آشنا شدهاند آزار میدهد. با یادگیری الگوها، سعی میکنند آنها را در همه جا اعمال کنند، حتی در شرایطی که کد سادهتر به خوبی قابل پیاده سازی است.
انواع Design Pattern
الگوهای طراحی با اساس پیچیدگی، سطح جزئیات و مقیاس کاربرد آنها برای کل سیستم طراحی شده، متفاوت هستند. ابتدایی ترین و سطح پایین ترین الگوها را اغلب اصطلاحات(idioms) مینامند. آنها معمولا فقط برای یک زبان برنامه نویسی اعمال میشوند. کلیترین و سطح بالاترین الگوها الگوهای معماری هستند. توسعه دهندگان میتوانند این الگوها را تقریباً در هر زبانی پیاده سازی کنند. بر خلاف سایر الگوها، میتوان از آنها برای طراحی معماری کل برنامه استفاده کرد. علاوه بر این، همه الگوهای طراحی را میتوان بر اساس هدف یا هدفشان دسته بندی کرد. این مقاله سه گروه اصلی از الگوها را پوشش میدهد:
- الگوهای Creational(ایجاد) مکانیسمهای ایجاد شی را ارائه میدهند که انعطاف پذیری و استفاده مجدد از کد موجود را افزایش میدهد.
- الگوهای Structural(ساختاری) نحوه جمع آوری و سر هم کردن اشیاء و طبقات را در ساختارهای بزرگتر توضیح میدهند، در حالی که این ساختارها را انعطاف پذیر و کارآمد نگه میدارند.
- الگوهای Behavioral(رفتاری) از ارتباطات مؤثر و تخصیص مسئولیتها بین اشیا مراقبت میکنند.
در مقالات بعدی الکتروهایو این سه دسته را به طور کامل تشریح خواهیم کرد.