الگوی طراحی (دانش رایانه)

آشنایی با مفاهیم

در الگوی طراحی از اشیاء ویژه‌ای به نام آداپتور (واسطه) استفاده می‌شود. این آداپتورها به اشیاء مورد نیاز در پروژه مرتبط می‌شوند. نوشتن برنامه تا حد زیادی از طریق این واسطه‌ها انجام می‌شود. الگوهای طراحی را بر اساس دو معیار طبقه‌بندی می‌کنیم.

۱-اولین معیار، که مقصود نامیده شده، منعکس‌کننده آنچه یک الگو انجام می‌دهداست. یک الگو ممکن است هدف ایجادی، ساختاری یا رفتاری داشته باشد.

الگوهای ایجادی پروسه ایجاد اشیاء را مورد توجه قرار می‌دهند.

الگوهای ساختاری با ترکیب کلاس‌ها و اشیاء سروکار دارند.

الگوهای رفتاری طرقی که اشیاء با همدیگر فعل و انفعال انجام داده و وظایف را توزیع می‌کنند مشخص می‌سازند.

۲- معیار دوم، که محدوده نامیده شده، مشخص‌کننده اینکه الگو بر روی کلاس‌ها یا اشیاء اعمال می‌گردد.
است. الگوهای در محدوده کلاس‌ها با ارتباطات بین کلاس‌ها و زیر کلاس‌های آن‌ها سر و کار دارند. این‌گونه ارتباطات از طریق وراثت برقرار می‌گردد، که بنابراین در زمان کامپایل ثابت می‌شوند. الگوهای در محدوده اشیاء با ارتباطات بین اشیاء سرو کار داشته که می‌تواند در زمان اجرا تغییر کرده و در نتیجه پویا هستند. تقریباً تمام الگوها از وراثت استفاده می‌کنند. بنابراین الگوهایی که با برچسب "در محدوده کلاس" معین شده‌اند آن‌هایی هستند که تنها بر روی ارتباط بین کلاس‌ها تأکید دارند. توجه کنید که بیشتر الگوها در محدوده اشیاء عمل می‌کنند.

الگوهایایجادی که در محدوده کلاس‌ها هستند قسمتی از ایجاد اشیاء را به زیر کلاس‌ها محول می‌کنند، در حالیکه الگوهای ایجادی در محدوده اشیاء چنین عملی را به شیء دیگری محول می‌نمایند.

الگوهای ساختاری کلاسی از وراثت برای ترکیب کلاس‌ها استفاده کرده در عوض الگوهای ساختاری در محدوه اشیاء روش‌هایی برای آمیختن اشیاء را شرح می‌دهند.

الگوهای رفتاری کلاسی از وراثت برای تشریح الگوریتم‌ها و کنترل جریان اجرای برنامه‌ها استفاده می‌کنند در صورتی‌که الگوهای رفتاری شیئی چگونگی همکاری گروهی از اشیاء برای انجام یک وظیفه که یک شیء به تنهایی نمی‌تواند به انجام رساند را شرح می‌دهند.

تاریخچه

بحث Design Pattern برای اولین بار در دنیای نرم‌افزار توسط GoF صورت گرفت. یک گروه چهار نفره شامل:
Erich Gamma ،Richard Helm ،Ralph Johnson و John Vlissides ملقب به Gang of Four یا GoF هستند.
این گروه در ۲۱ اکتبر سال ۱۹۹۴ کتابی را تحت عنوان Design Patterns: Elements of Reusable Object-Oriented Software منتشر کردند. (این کتاب تا تاریخ آوریل ۲۰۰۷، سی و ۶ بار تجدید چاپ شده‌است)
آن‌ها در این کتاب ۲۳ الگوی طراحی کلاسیک را با زبان‌های شی گرا مطرح در آن زمان (++C و Smalltalk) برای اولین بار مورد بحث قرار دادند.

کاربرد

الگوهای طراحی می‌توانند سرعت فرآیند توسعۀ نرم‌افزار را با فراهم آوردن الگوهای توسعۀ اثبات‌شده و مورد آزمون قرار گرفته افزایش دهند. طراحی نتیجه‌بخش نرم‌افزار نیازمند در نظر گرفتن پیامدهایی است که ممکن است هنوز در پیاده‌سازی قابل رؤیت نباشند، اما بعدها خود را نشان خواهند داد. استفاده از الگوهای طراحی کمک می‌کند تا از بروز خطاهای کوچک که ممکن است مشکلات بزرگی را ایجاد کنند، جلوگیری شود و علاوه بر آن، خوانایی کد را برای کدنویسان و معمارانی که با الگوها آشنا هستند، افزایش می‌دهد.
برای دست‌یافتن به انعطاف‌پذیری در نرم‌افزار، الگوهای طراحی اغلب اعمال را به صورت غیرمستقیم انجام می‌دهند. این کار در شرایطی ممکن است طراحی حاصل را پیچیده کند و باعث افت کارایی برنامه شود.
طبق تعریف، برای استفاده از الگوها در هر برنامه‌ای که از آن‌ها استفاده می‌کند، باید از نو برنامه‌نویسی کرد. از آن‌جایی که بعضی از نویسندگان این نکته را مخالف با en:Code reuse  آن‌گونه که توسط مهندسی نرم‌افزار بر پایه پیکرپار فراهم می‌شود، می‌بینند، پژوهش‌گران تلاش کرده‌اند تا الگوها را به پیکرپارها تبدیل کنند. میر و آرنوت توانستند دو سوم الگوهایی را که رویشان کار می‌کردند، به صورت کامل یا جزئی به پیکرپار تبدیل کنند.
تکنیک‌های طراحی نرم‌افزار را به سختی می‌توان در گسترۀ وسیع‌تری از مسائل به کار برد. الگوهای طراحی راه‌حل‌هایی کلی را در قالبی بیان می‌کنند که وابسته به مسئلۀ مخصوصی نیست.
گاهی اوقات برنامه‌نویسان هنگام طراحی یا پیاده‌سازی برنامه‌های خود، با کلاس‌هایی روبرو می‌شوند که اصطلاحاً کلاس‌های کلاسیک نیستند. این گونه کلاس‌ها مشکلاتی را ایجاد می‌کنند که با کمک الگوها می‌توان مشکلات را تا حجم قابل قبولی حل کرد.
در واقع طراحی چنین کلاس‌هایی، به مرور زمان، گریبان‌گیر هر برنامه‌نویسی شده‌است و برنامه نویسان خبره با توجه به تجربیات شخصی خود و دیگران، تصمیم به ایجاد الگوهایی کرده‌اند که راه حل این گونه مشکلات خواهد بود.
در حال حاضر شاید در حدود صدها الگو در این رابطه وجود داشته باشد که تنها تعداد اندکی از آن‌ها استاندارد شده و مورد استفاده طراحان و برنامه‌نویسان قرار می‌گیرد.

دسته بندی کلاسیک الگوها

این ۲۳ الگو طبق دسته‌بندی فرض شده توسط آن‌ها (که هنوز هم رعایت می‌شود) در ۳ گروه زیر جای گرفتند :

انتقادها

مفهوم الگوهای طراحی به روش‌های مختلفی مورد نقد قرار گرفته‌است.
الگوهای طراحی ممکن است تنها حاکی از کمبود برخی قابلیت‌ها و ویژگی‌ها در یک زبان برنامه‌نویسی (مانند جاوا یا سی++) باشد. پیتر نورویگ نشان داد که ۱۶ تا از ۲۳ الگوی طراحی‌ در کتاب الگوهای طراحی (که عمدتا روی زبان سی‌پلاس‌پلاس متمرکز شده‌است) از طریق پشتیبانی مستقیم در زبان‌های لیسپ یا دیلان ساده‌سازی یا زدوده شده‌است. اظهارات مشابهی نیز توسط هانمان و کیکزالس که شماری از ۲۳ الگوی طراحی را به کمک یک زبان برنامه‌نویسی جنبه‌گرا (AspectJ) پیاده‌سازی کرده بودند، انجام شد. این دو نشان دادند که وابستگی‌های سطح کد در پیاده‌سازی ۱۷ تا از ۲۳ الگوی طراحی از بین رفت و برنامه‌نویسی جنبه‌گرا توانست پیاده‌سازی الگوهای طراحی را ساده‌سازی کند. هم‌چنین، مقالۀ پاول گراهام را با عنوان «انتقام نردها» ببینید.
مهم‌تر آن که، استفادۀ نامناسب از الگوها می‌تواند باعث افزایش پیچیدگی غیرضروری گردد.