آشنایی با دیزاین پترن‌ها: راهکارهای استاندارد برای حل مسائل برنامه‌نویسی


مقدمه

به عنوان یک برنامه‌نویس، حتما تا به حال با مسائل پیچیده‌ای در حوزه برنامه‌نویسی مواجه شده‌اید که آرزو می‌کردید کاش یک راه حل استاندارد و تضمین شده برای حل آنها وجود داشت. خبر خوب اینکه چنین راهکارهایی وجود دارند و نام آنها "دیزاین پترن" (Design Pattern) است. دیزاین پترن‌ها توسط برنامه‌نویسان باتجربه ابداع شده‌اند تا ما بتوانیم از تجربیات آنها برای حل مسائل تکراری استفاده کنیم.

دیزاین پترن چیست؟

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

تفاوت دیزاین پترن و الگوریتم

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

تاریخچه دیزاین پترن

مفهوم الگو اولین بار توسط کریستوفر الکساندر در کتاب "الگوی زبان: شهرها، سازه‌ها، ساخت‌وساز" مطرح شد. سپس در سال ۱۹۹۴ چهار نویسنده به نام‌های اریک گاما، جان ولیسیدس، رالف جانسون و ریچارد هلم کتاب "الگوهای طراحی: عناصر دوباره قابل استفاده نرم‌افزار شی‌گرا" را منتشر کردند که به کتاب "The book by the gang of four" مشهور شد. این کتاب ۲۳ الگوی رایج برای حل مشکلات طراحی شی‌گرا را توضیح می‌دهد.

انواع دیزاین پترن

دیزاین پترن‌ها به سه دسته کلی تقسیم می‌شوند:

  1. ایجادکننده (Creational): این الگوها به ایجاد و مدیریت اشیاء می‌پردازند.
  2. ساختاری (Structural): این الگوها به ساختار و ترکیب کلاس‌ها و اشیاء مربوط می‌شوند.
  3. رفتاری (Behavioral): این الگوها به تعامل و مسئولیت‌های اشیاء می‌پردازند.

در ادامه به بررسی چند نمونه از الگوهای ایجادکننده می‌پردازیم.

متد کارخانه (Factory Method)

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

کارخانه انتزاعی (Abstract Factory)

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

سازنده (Builder)

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



مثال دیزاین پترن ها

حالا با انواع دیزاین پترن ها آشنا شدیم بریم برای هر مورد یک مورد دیزاین پترن رو بهمراه مثالش مشاهده کنیم:

creational :

متد کارخانه (Factory Method) یکی از الگوهای طراحی است که از مدل creational میباشد و در زمینه ایجاد شیء استفاده می‌شود. این الگو به ما این امکان را می‌دهد که فرایند ایجاد یک شیء را از جزئیات کلاسی که آن شیء را ایجاد می‌کند، جدا کنیم. به این ترتیب، ما قادر خواهیم بود فرایند ایجاد شیء را در زمان اجرا مشخص کنیم.

برای مثال، فرض کنید که یک برنامه دارید که باید با انواع مختلفی از فایل‌ها کار کند، اما نوع فایل مورد نیاز ممکن است در هر زمان تغییر کند. در اینجا، الگوی متد کارخانه می‌تواند به شما کمک کند.

در این سناریو، ما یک کلاس انتزاعی برای ایجاد فایل‌ها ایجاد می‌کنیم که دارای یک متد کارخانه است. سپس، برای هر نوع فایل، یک زیرکلاس از این کلاس انتزاعی ایجاد می‌کنیم و متد کارخانه را بازنویسی می‌کنیم تا فایل مورد نیاز را ایجاد کند.

تطبیق‌گر (Adapter) یک الگوی طراحی است که یکی از مدل های Structural هست و به ما این امکان را می‌دهد تا رابط یک کلاس را به رابط دیگری تبدیل کنیم تا دو سیستم با رابط‌های متفاوت بتوانند با یکدیگر ارتباط برقرار کنند.

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

بیاید یک مثال ساده کدی از این پترن ببینیم :

دیزاین پترن دستور (Command) که یکی از مدل های Behavioral هست به ما امکان می‌دهد عملیات و درخواست‌ها را به عنوان یک شیء مستقل از درخواست‌کننده نمایش دهیم. این الگو به ما اجازه می‌دهد تا عملیات‌ها را به عنوان یک شیء قابل اجرا (Command) با پارامترهای مورد نیاز تعریف کنیم و درخواست‌های مختلف را به عنوان یک Command متفاوت در کلاس‌هایی جداگانه مدیریت کنیم.

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

فریم‌ورک‌ها

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

این فریم ورک ها قابلیت انجام کارهای مختلف و انعطاف‌پذیری زیادی دارن. مثلاً می‌تونند دیزاین پترن های مختلف رو فراهم کنند و برنامه‌نویس‌ها رو کمک کنند تا برنامه‌هایشون رو با سرعت بسازن و مدیریت کنن.

فریم ورک ها معمولاً یک ساختار ابتدایی رو برای برنامه ما فراهم می‌کنند و می‌تونند دیزاین پترن های مختلفی رو پشتیبانی کنن. به عنوان مثال، فریم ورک Spring در جاوا می‌تونه از پترن هایی مثل Singleton و Factory استفاده کنه و برای ما این امکان رو فراهم کنه که بدون زیاده‌روی، از این الگوها استفاده کنیم.

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

جمع‌بندی

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