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

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

الگوی طراحی (به انگلیسی: Design Pattern) عبارت است از یک راهکار قابل تکرار برای مسائل و مشکلات متداول.

آشنایی با مفاهیم[ویرایش]

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

تاریخچه[ویرایش]

بحث 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) برای اولین بار مورد بحث قرار دادند.

کاربرد[ویرایش]

گاهی اوقات برنامه‌نویسان هنگام طراحی و یا پیاده سازی برنامه‌های خود، با کلاس‌هایی روبرو می‌شوند که اصطلاحاً کلاس‌های کلاسیک نیستند. این گونه کلاس‌ها مشکلاتی را ایجاد می‌کنند که با کمک الگوها می‌توان مشکلات را تا حجم قابل قبولی حل کرد.

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

دسته بندی کلاسیک الگوها[ویرایش]

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

۱-الگوهای ایجادی[ویرایش]

  • (Abstract factory) رابطی برای ساخت فامیلی‌هایی از اشیاء مرتبط یا وابسته به هم بدون مشخص کردن کلاسهای واقعی آنها تدارک می‌بیند.
  • (Factory method) یک رابط برای ساخت اشیاء تعریف کرده و در عین حال اجازه می‌دهد تا زیر کلاسها در مورد اینکه چه شیء را نمونه سازی کنند تصمیم بگیرند. در واقع این الگو اجازه می‌دهد تا نمونه سازی را به زیر کلاسها محول نمود.
  • (Builder) فرآیند ساخت یک شیء را از نمایش آن جدا کرده تا بتوان همان فرآیند ساخت را برای ایجاد نمایش‌های مختلف بکار برد.
  • (Prototype) با استفاده از یک شیء بعنوان نمونه نوع اشیاء جدیدی که بایستی ساخته شوند را مشخص کرده و آن اشیاء را با ساختن کپی‌های جدید از این نمونه ایجاد می‌نماید.
  • (Singleton) این اطمینان را حاصل می‌کند که یک کلاس دارای تنها یک نمونه بوده و دسترسی به آن نمونه را تدارک می‌بیند.

۲-الگوهای ساختاری[ویرایش]

  • (Adapter) رابط یک کلاس را به رابط دیگری که مورد انتظار یک مشتری است تبدیل می‌کند. این الگو امکان همکاری بین اشیائی که قبلاً بخاطر داشتن رابط‌های ناسازگار نمی‌توانستند با هم کار کنند را فراهم می‌سازد.
  • (Bridge) یک مفهوم مجرد را از پیاده سازی اش مجزا کرده تا هردو بتوانند بطور مستقل تغییر کنند.
  • (Composite) اشیاء را بصورت ساختار درختی برای ایجاد ساختار سلسله مراتبی بفرم part-whole ترکیب می‌نماید. این الگو اجازه می‌دهد تا مشتریها اشیاء منفرد و مرکب را بصورت یکسانی پردازش کنند.
  • (Decorator) در زمان اجرا وظایف جدیدی به یک شی ء اضافه می‌کند. این الگو بدیلی قابل انعطاف برای گسترش عملکرد یک کلاس بوسیله زیر کلاس ساختن از آن را فراهم می‌کند.
  • (Facade) یک رابط منفرد برای مجموعه‌ای از رابط‌ها در یک زیر سیستم تدارک می‌بیند. در واقع یک facade رابط سطح بالاتری برای یک زیر سیستم تعریف کرده و باعث می‌شود تا زیر سیستم را بصورت ساده تری مورد استفاده قرار داد.
  • (Flyweight) از اشتراک منابع برای فراهم نمودن تعداد زیادی از اشیاء سبک بصورت کارا استفاده می‌کند.
  • (Proxy) یک جانشین یا جایگاه برای کنترل دسترسی به یک شیء ایجاد می‌کند.

۳-الگوهای رفتاری[ویرایش]

  • (Chain of responsibility) با دادن شانس به بیش از یک شیء برای پاسخگویی به یک درخواست از در هم آمیختن فرستنده و دریافت کننده یک درخواست جلوگیری می‌کند. به این ترتیب که اشیاء دریافت کننده یک درخواست را بصورت زنجیره‌ای در نظر گرفته و درخواست را در طول این زنجیره عبور داده تا اینکه یکی از اشیاء آنرا پاسخ پوید.
  • (Command) یک درخواست را بصورت یک شیء کپسول سازی می‌کند. بنابراین این امکان را فراهم می‌کند تا مشتری‌ها را با درخواستهای متفاوت پارامتردهی کرده، درخواستها را صف بندی یا Log کرده و اعمال قابل برگشت فراهم کنید.
  • (Interpreter) برای یک زبان، نمایشی از گرامرش به همراه مفسری که از آن نمایش برای تفسیر جملات مربوط به آن زبان استفاده می‌کند تعریف می‌نماید.
  • (Iterator) روشی برای دسترسی ترتیبی به عناصر یک شیء مجتمع (مرکب) بدون افشاء کردن نمایش آن فراهم می‌کند.
  • (Mediator) شیءی که نحوه تبادلات مجموعه‌ای از اشیاء را کپسول سازی می‌کند را تعریف می‌نماید. این الگو با پرهیز از ارجاعات مستقیم بین مجموعهای از اشیاء، اتصال حداقلی بین آنها را ترغیب نموده و اجازه می‌دهد تا تبادلات را بصورت مستقل تغییر دهید.
  • (Memento) بدون شکستن کپسول سازی، حالت درونی یک شیء را تسخیر و ذخیره کرده تا آن شیء بتواند بعداً به آن حالت برگشت یابد.
  • (Observer) یک نوع وابستگی یک- به- چند بین اشیاء تعریف کرده بطوریکه وقتی یک شیء حالتش را تغییر داد تمام اشیاء وابسته به آن خبردار شده تا آنها خود را با آن تغییر هماهنگ کنند.
  • (State) اجازه می‌دهد تا یک شیء هنگامیکه حالتش عوض شد رفتارش را تغییر دهد. اشیاء از این نوع رفتار کلاسی که در آن قرار دارند را تغییر می‌دهند.
  • (Strategy) یک خانواده از الگوریتم‌ها را تعریف؛ کپسول سازی و قابل جایگزین کردن می‌کند. استراتژی اجازه می‌دهد تا یک الگوریتم را بدون توجه به جائیکه مورد استفاده قرار می‌گیرد تغییر داد.
  • (Template method) اسکلت یک الگوریتم را تعریف کرده و پیاده سازی بعضی قدم‌های آنرا به زیر کلاسها محول می‌کند. این الگو امکان تغییر بعضی از قدم‌های یک الگوریتم را بدون تغییر در ساختار کلی الگوریتم به زیر کلاسها می‌دهد.
  • (Visitor) عملی که بایستی بر روی عناصر یک ساختار از اشیاء اعمال شود را نمایش می‌دهد. این الگو اجازه می‌دهد تا عمل جدیدی بدون نیاز به تغییر کلاسهای عناصری که بر روی آن عمل می‌کند را تعریف کنید.

برتری الگوی طراحی نسبت به برنامه‌نویسی شیءگرا[ویرایش]

الگوی طراحی پاسخگوی مشکلات بسیاری در تولید نرم‌افزار و طراحی برنامه‌های شیءگرا است. برنامه‌نویسی شیءگرا اگر چه راه حل مناسبی برای به کارگیری دوباره از کدها و اشیاء تولید شده در پروژه‌های نرم‌افزاری است، ولی محدودیت‌هایی را نیز ایجاد می‌کند. به عنوان نمونه در صورت نیاز به تغییر شیء به کار رفته در پروژه، بخش‌های زیادی از کدهای نوشته شده تغییر می‌یابند. به این ترتیب کدهای نوشته شده تا حد زیادی به آن شیء وابسته می‌باشند.

منابع[ویرایش]

http://sharif.ir/~ramsin/index_files/PSEAns1_289.pdf

پیوند به بیرون[ویرایش]