آشنایی با الگوهای طراحی Design Patternsآشنایی با الگوهای طراحی Design Patterns

آشنایی با الگوهای طراحی Design Patterns

نویسنده: رحیم لطفی

دسته بندی: طراحی نرم افزار
10 دقیقه زمان مطالعه
۱۴۰۰/۰۴/۱۵
0 نظر
امتیاز 4.8 از 5

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

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

مقدمه‌ای بر الگوهای طراحی

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

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

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

منظور از الگوهای طراحی چیست؟

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

تاریخچه الگوهاي طراحی

مفهوم الگو چیزی نیست که فقط در دنیای نرم‌افزار کاربرد داشته باشد، بلکه در سایر زمینه‌های علمی نیز استفاده شده و می‌شود. در حقیقت، نخستین بار یک معمار به نام کریستوفر الکساندر (Christopher Alexander)  بود که در سال 1970 ایده الگو را برای ایجاد مجموعه‌ای از واژگان مشترک یا یک زبان در مبحث طراحی (ساختمان، عمارت، نقشه‌کشی، شهرسازی و ...) معرفی کرد.

کريستوفر الکساندر مي‌گويد: «هر الگو، مسئله‌اي را که در پيرامون‌مان بارها و بارها اتفاق مي‌افتد تشريح می‌کند و آن‌گاه راه ‌حل اساسي آن‌ را به‌ صورتي شرح می‌دهد که مي‌توانيد آن ‌را ميليون‌ها بار به ‌کار بريد بدون آن که حتی دو نمونه از آن‌ها مانند هم باشد». اگر چه الکساندر در مورد الگوهايي در ساختمان‌ها و برج‌ها صحبت کرده، آن چه او مي‌گويد درباره الگوهاي طراحي شي گرا نيز صادق است. در معماری راه‌ حل‌ها به‌ صورت اشيا و روابط بين آن‌ها به ‌جاي ديوارها و درها تشريح شده است ولي در هر دو مبحث، الگو به عنوان راه ‌حلي براي يک مسئله در يک بستر تعريف‌شده شناخته می‌شود.

با وجودی که الگوهای طراحی نتیجه دستاورد تجربیات برنامه‌نویسان بی‌شماری هستند، در سال 1994 برای نخستین بار مجموعه‌ای از مشهورترین الگوها در کتابی به عنوانDesign Patterns : Elements or Reusable Object Oriented Software  گردآوری شد که تقریبا به عنوان انجیل الگوهای طراحی شناخته می‌شود. این کتاب توسط چهار نفر به‌نام اریک گاما (Erich Gamma)، ریچارد هلم (Richard Helm)، رالف جانسون (Ralph Johnson) و جان ولیسیدس (John Vlissides) نوشته شد که به Gang of Four معروف هستند. آن‌ها در این کتاب، ایده استفاده از الگوها را در طراحی نرم‌افزار شرح دادند و یک ساختار استاندارد براي مستندسازي الگوها ایجاد کردند.

عناصر الگوهای طراحی

به طور کلي يک الگو داراي چهار عنصر اساسي است:

  1. نام الگو: سمبلي است که مي‌توانيم براي ارجاع به يک مسئله طراحي، راه‌ حل و دستاوردهايش، در يکي دو کلمه به کار بريم.
  2. مسئله: معين مي‌کند که یک الگو تحت چه شرايطي مي‌تواند به ‌کار رود و محل بحث و بستر آن را مشخص مي‌سازد. گاهي اوقات مسئله شامل فهرستی است از شرايطی که بايد قبل از به‌کارگیری الگو فراهم شوند.
  3. راه‌ حل: عناصري که طرح را مي‌سازد و همچنین ارتباطات، وظایف و همکاری‌ها را تشريح مي‌کند.
  4. دستاورد: نتايج، مزايا و معايب به‌کارگيري الگو را مشخص مي‌سازد.

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

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

الگوهای طراحی چه مزایایی دارند؟

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

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

بنابراین به ‌طور خلاصه می‌توان موارد زیر را به عنوان مزایای استفاده از الگوها بیان کرد:

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

انواع الگوهای طراحی

الگوهاي بیان شده در کتاب GOF: design patterns در سه دسته تقسیم‌بندي شده‌اند و در مجموع 23 الگو هستند. در ادامه نگاهی کوتاه به این الگوها خواهیم داشت. البته بعد از این کتاب الگوهای دیگری نیز شناخته شد مانند  multiton که آن‌ها را نیز می‌توان در یکی از این دسته‌ها جای داد. 

الگوهاي ایجادی یا آفرینشی (Creational Pattern)

این الگوها به ساخت اشیا و ارجاع به آن‌ها می‌پردازند و با انتزاعی کردن روند نمونه‌سازی از کلاس‌ها، مسئولیت این کار را خودشان بر عهده می‌گیرند؛ یعنی دیگر نیازی نیست کلاینت، خودش به طور صریح از یک کلاس نمونه‌سازی کند. این الگوها، اتصال بین کلاس‌ها را ضعیف می‌کنند و اتصال سست (Loose-coupling) را ترویج می‌دهند.

هدف الگوهای ایجادی این است که یک سیستم را از چگونگی ساخت، تشکیل و ارائه اشیاء جدا کنند. این الگوها انعطاف‌پذیری سیستم را از نظر این‌که چه کسی، چگونه و چه هنگام شی را ایجاد می‌کند، افزایش می‌دهند. الگوهای ایجادی، دانش این که چه کلاس‌هایی توسط سیستم استفاده می‌شود را کپسوله و جزئیات نمونه‌سازی از آن‌ها را پنهان می‌کنند.

اهداف کلی این الگوها به شرح زیر است:

  • تسریع نمونه‌سازی از کلاس‌های سنگین  (Prototype)
  • متمرکز کردن نمونه‌سازی از کلاس‌های هم شکل  (Factory Method)
  • ایجاد کلاسی که باید تنها یک نمونه داشته‌ باشد  (Singleton)
  • متمرکز کردن نمونه‌سازی از مجموعه‌ای از کلاس‌ها که می‌توان آن‌ها را در قالب دسته‌های هم شکل تقسیم کرد  (Abstract Factory)
  • جدا کردن یک شی از روند ساخت آن  (Builder)

الگوهاي ساختاري (Structural Patten)

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

اهداف کلی الگوهای ساختاری به شرح زیر است:

  • اضافه یا حذف کردن یک قابلیت به طور پویا به اشیا در زمان اجرا  (Decorator)
  • یکسان‌سازی واسط چندین کلاس مختلف مرتبط با هم  (Composite)
  • دسترسی غیر مستقیم به اشیا از طریق اشیا واسطه و اعمال کنترل دسترسی (Proxy) 
  • جدا ساختن قسمت پیاده‌سازی از قسمت انتزاعی یک کلاس و امکان تغییر آن‌ها به صورت مستقل (Bridge)
  • فراهم کردن امکان استفاده از واسط‌های ناهمگون (Adapter) 
  • کاهش مصرف منابع با فاکتورگیری از اشیا تکراری و استفاده از اشیا سبک وزن (Flyweight) 
  • ساده‌سازی و خلاصه‌سازی چندین زیرسیستم بزرگ در قالب یک لایه ساده‌تر (Façade) 

الگوهاي رفتاري (Behavioral Pattern)

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

اهداف کلی الگوها به شرح زیر است:

  • قابلیت استخدام چند الگوریتم برای انجام یک کار مشخص (Strategy) 
  • فراهم کردن رفتار پویا برای یک شی با وجود ثابت بودن واسط آن(State) 
  • توانایی دخل و تصرف در بعضی از مراحل اجرای یک الگوریتم مشخص (Template Method) 
  • فاصله انداختن بین درخواست‌دهنده و کسی که درخواست را اجابت می‌کند با ایجاد زنجیره‌ای از پاسخ‌دهنده‌ها با وظایف و مسئولیت‌های مختلف (Chain of Responsibility) 
  • نگهداری سابقه فرمان‌های اجرا شده در برنامه به منظور فراهم کردن قابلیت Redo و Undo (Command)
  • مهیا کردن قابلیت تکرار و شمارش برای اشیایی که از مجموعه‌ای از آیتم‌ها تشکیل می‌شوند  (Iterator)
  • متمرکز کردن منطق داخلی یک مولفه‌ی بزرگ در قالب یک شی مرکزی(Mediator) 
  • توانایی آگاه کردن تعدادی از اشیا از تغییرات یک شی دیگر(Observer) 
  • اجرای یک عملیات بر روی مجموعه‌ای از اشیا ناهمگون (Visitor) 
  • ایجاد مدلی ساده برای نمایش شی گرای جملات یک زبان(Interpreter) 
  • حفظ وضعیت یک شی در یک منبع خارجی به منظور بازیابی وضعیت شی در آینده(Memento) 

جمع‌بندی

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