خانه توسعهدهنده دیزاین پترن چیست ؟ – هرچه باید درمورد الگوی طراحی (Design Pattern) بدانید
دیزاین پترن چیست ؟ – هرچه باید درمورد الگوی طراحی (Design Pattern) بدانید
در حوزهی توسعهی نرمافزار، طراحی اپلیکیشنهایی که قابل اتکا و مقیاسپذیر باشند اهمیت زیادی دارد. دیزاین پترنها در این مسیر به ما کمک میکنند تا نهتنها با استفاده از راهکارهایی که قبلا پیادهسازی و تست شدهاند به این مهم دست پیدا کنیم، بلکه در برنامهنویسی شیگرا، طراحی رابط کاربری و حتی وظایف کوچکتری مثل طراحی کدهای QR هم کاربردی ظاهر میشوند. اگر به یادگیری و آموزش Design Pattern علاقهمند هستید، با کوئرا بلاگ همراه باشید تا بگوییم دیزاین پترن چیست و چه انواعی دارد و چه مزایایی برای فرایند توسعه نرمافزار ما به همراه میآورد.
فهرست مطالب
Toggleالگوی طراحی یا دیزاین پترن چیست ؟
در طراحی نرمافزار، دیزاین پترنها را میتوان راهکارهایی رایج برای مشکلاتی پرتکرار به حساب آورد. الگوی طراحی مثل یک نقشه کار یا «بلوپرینت» از پیش آماده اما قابل سفارشیسازی است که به شما اجازه میدهد مشکلاتی که دائما در فرایند طراحی کد به وقوع میپیوندند را برطرف کنید.
البته که برخلاف بسیاری از توابع و کتابخانهها، نمیتوانید این الگوها را خیلی ساده درون برنامه خود کپی کنید. در واقع پترن به معنی یک قطعه کد نیست، بلکه مفهومی کلی است که نحوه رسیدگی به مشکلات بهخصوص را تشریح میکند.
گاهی از اوقات، پترن را با الگوریتم نیز اشتباه میگیرند، چرا که هر دو مفهوم به برطرفسازی مشکلات مربوط میشوند. درحالی که الگوریتم معمولا مجموعهای از فرمانهای مختلف را تعریف میکند که منجر به دستیابی به اهداف گوناگون میشوند، پترن بیشتر راجع نحوه پیشبرد کار و ساختار کلی الگوریتم است. بنابراین کدهایی که از پترنی واحد پیروی میکنند، میتوانند بسته به ماهیت هر برنامه کاملا متفاوت ظاهر شوند.
مثالی سادهتر میزنیم. الگوریتم تعویض لاستیک پنجره شده، ساده است. ابتدا به سراغ ابزار لازم میرویم، چرخ را باز میکنیم، لاستیک جدید را جای آن قرار میدهیم و در نهایت، پیچها را سفت میکنیم. اما در این مسیر با مشکلاتی نظیر بسته نشدن پیچها در جای درست یا پایین آوردن ماشین از روی جک روبهرو خواهیم شد. در این حالت، دیزاین پترن در واقع راهکار ما برای حل این مشکلات پرتکرار به حساب میآید.
تاریخچه Design Patterns
شاید این سوال برایتان مطرح باشد که چه کسی پترنها را اختراع کرد؟ طرح چنین سوالی خوب است، اما آنقدرها دقیق نیست. دیزاین پترنها مفاهیمی آنقدرها پیچیده و گنگ نیستند و اتفاقا کاملا برعکس، راهکارهایی دم دستی برای مشکلات رایج در طراحی به حساب میآیند. وقتی راهکارها در پروژههای گوناگون تکرار میشوند، یک نفر بالاخره نامی روی آن میگذارد و تمام جزییات راهکار را تشریح میکند. الگوهای طراحی نیز به این شکل کشف شدند.
نخستین بار «کریستوفر الکساندر» بود که در کتاب «الگوی زبان: شهرها، سازهها، ساختوساز» راجع به مفهوم پترنها صحبت کرد. این کتاب «زبانی» را توصیف میکند که میشود از آن در طراحی محیطهای شهری کمک گرفت. واحدهای خرد این زبان، پترنها هستند. برای مثال از پترنها برای توصیف قامت پنجرهها، تعداد طبقات ساختمانها، وسعت محیطهای سبز و هر چیز مشابه دیگری استفاده شده است.
این ایده مورد توجه چهار نویسنده به نامهای «اریک گاما»، «جان ولیسیدس»، «رلف جانسون» و «ریچارد هلم» قرار گرفت. آنها در سال ۱۹۹۴ میلادی کتابی مشترک به نام «الگوهای طراحی: عناصر دوباره قابل استفاده نرمافزار شیگرا» (Design Patterns: Elements of Reusable Object-Oriented Software) منتشر کردند و به شرح پیادهسازی این مفهوم در برنامهنویسی پرداختند. این کتاب به ۲۳ الگویی میپردازد که مشکلات رایج در طراحی شیگرا را برطرف میکنند و خیلی زود به پرفروشترین کتاب حوزه خود نیز تبدیل شد. از آنجایی که نام کتاب واقعا بلند است، مردم نامی دیگر برایش انتخاب کردند و آن را «The book by the gang of four» (به معنی «کتاب اون گنگ چهار نفره») صدا زنند که در گذر زمان به شکل مختصر «The GoF Book» درآمد.
از آن زمان به بعد، افراد مختلف صدها الگوی شیگرای دیگر کشف کردهاند. «رویکرد پترن» خیلی زود راهش را به دیگر زمینههای برنامهنویسی هم باز کرد و بنابراین این روزها در بیرون از جهان طراحی شیگرا هم با پترنهای گوناگون روبهرو خواهید شد.
اجزای تشکیلدهنده دیزاین پترن چیست ؟
اکثر پترنها به شکلی رسمی و کلی توصیف شدهاند تا مردم بتوانند آنها را در سناریوهای مختلف به کار ببندند. در ادامه میبینید در توصیف هر پترن، معمولا باید منتظر چه بخشهایی باشید:
- هدف (Intent) پترن به شکلی خلاصه به توصیف مشکل و راهکار میپردازد.
- انگیزه (Motivation) به تشریح هرچه بیشتر مشکل و راهکاری که به کمک پترن امکانپذیر خواهد شد، اختصاص مییابد.
- ساختار (Structure) کلاسها نشاندهنده اجزای مختلف پترن و ارتباط آنها با یکدیگر است.
- مثال کد (Code Example) هم که معمولا به یکی از زبانهای برنامهنویسی محبوب نوشته میشود، درک ایدههای پشت پترن را آسانتر خواهد کرد.
ناگفته نماند که برخی پترنها جزییات دیگری مانند میزان کاربردپذیری پترن، گامهای لازم برای پیادهسازی آن و همینطور ارتباط با سایر پترنها را هم در بر میگیرند.
انواع دیزاین پترن چیست ؟
به صورت کلی سه نوع الگوی طراحی داریم که در ادامه به صورت مختصر به هرکدام میپردازیم.
۱. دیزاین پترن خلاقانه (Creative Design Pattern)
این دیزاین پترنها تماما راجع به نمونهسازی کلاس (Class Instantiation) و ساخت شی یا آبجکت (Object Creation) هستند و دقیقا به همین خاطر، در دستهبندیهایی خردتر به نام پترنهای «کلاس-خلاقانه» و «آبکجت-خلاقانه» قرار میگیرند. درحالی که الگوهای کلاس-خلاقانه استفادهای موثر از «وراثت» (Inheritance) در فرایند نمونهسازی میکنند، الگوهای آبجکت-خلاقانه بر «واگذاری» (Delegation) تمرکز دارند.
از جمله دیزاین پترنهای خلاقانه میشود به «متد کارخانه» (Factory Method)، «کارخانه انتزاعی» (Abstract Factory)، «سازنده» (Builder)، «یگانه» (Singleton)، «مخزن آبجکت» (Object Pool) و «پروتوتایپ» (Prototype) اشاره کرد.
دو مثال از کاربرد دیزاین پترن خلاقانه
- دیزاین پترن متد کارخانه به تعریف یک رابط کاربری برای ساخت آبجکتهایی در یک «ابرکلاس» (Super Class) میپردازد، اما به زیرکلاسها (Subclasses) اجازه میدهد نوع آبجکتها را دگرگون کنند یا تصمیم بگیرند که از کدام کلاس، نمونهبرداری شود.
- «تزریق وابستگی» (Dependency Injection) نوعی دیزاین پترن خلاقانه است که در آن، کلاسها به جای ساخت وابستگیها، آنها را از منبعی بیرونی دریافت میکنند. به این ترتیب اتصال قوی (Tight Coupling) میان کلاسها کاهش مییابد و هرگونه تغییر در نحوه پیادهسازی وابستگی آسانتر میشود، بدون اینکه تغییری در کلاس به وجود آید.
۲. دیزاین پترن ساختاری (Structural Design Pattern)
این دیزاین پترنها راجع به ساماندهی کلاسها و آبجکتها هستند، به گونهای که ساختاری بزرگتر شکل بگیرد و کارکردهایی تازه پدید آید. از جمله دیزاین پترنهای ساختاری میشود به «مبدل» (Adapter)، «پل» (Bridge)، «مرکب» (Composite)، «دکوراتور» (Decorator)، «نما» (Facade) و «پراکسی» (Proxy) اشاره کرد.
مثالی از کاربرد دیزاین پترن ساختاری
- زمانی که دو رابط کاربری (Interface) با یکدیگر سازگاری ندارند و میخواهیم از طریق یک مبدل، میان آنها ارتباط برقرار کنیم، به سراغ Adapter Design Pattern میرویم. الگوی Adapter میتواند رابط کاربری یک کلاس را به یک رابط یا کلاس دیگر – که کلاینت به آن نیاز دارد – تبدیل کند. در واقع مبدل اجازه میدهد کلاسهایی که هیچگونه سازگاری با یکدیگر ندارند، باهم کار کنند.
۳. دیزاین پترن رفتاری (Behavioral Design Pattern)
دیزاین پترن رفتاری راجع به شناسایی الگوهای ارتباطی رایج میان آبجکتها و بهرهبرداری از آن الگوهاست. از جمله دیزاین پترنهای این دستهبندی میشود به «زنجیره پاسخگویی» (Chain of Responsibility)، «فرمان» (Command)، «مفسر» (Interpreter)، «میانجی» (Mediator)، «یادبود» (Memento) و «متد قالب» (Template Method) اشاره کرد.
مثالی از کاربرد دیزاین پترن رفتاری
- پترن قالب یا تمپلیت به تعریف استخوانبندی الگوریتم در عملیاتی میپردازد که برخی از گامها را به زیرکلاسها (Sub-Classes) واگذار میکند. در متد قالب، به زیرکلاسها اجازه میدهیم بدون تغییر دادن ساختار الگوریتم، برخی گامهای بهخصوص را بازتعریف کنند. برای مثال ممکن است به دنبال گسترش ماژولی در پروژه خود باشید تا همزمان با تغییرات اپلیکیشن و نیازهای جدید آن، رفتارهایی جدید و متفاوت از خود نشان دهد. در عین حال، احتمالا اجازه نداشته باشید که سورس کد پروژه را تغییر دهید. در چنین سناریوهایی که نمیشود ساختار کلی را دستکاری کرد، توسعهدهنده میتواند از دیزاین پترنهای تمپلیت کمک بگیرد.
مهمترین مزایا و معایب Design Pattern چیست ؟
حالا که میدانیم دیزاین پترن چیست و چه شکل و شمایلهای مختلفی دارد، بیایید مزایای بهکارگیری الگوهای طراحی را هم بررسی کنیم:
- دقت بالا: برجستهترین مزیت طراحی الگو این است که محاسبات و اندازهگیریهای دقیق را امکانپذیر میکند و منجر به شکلگیری پوششی کمنقص یا بینقص برای نرمافزار میشود.
- بهینگی: با بهکارگیری پترنها، در زمان و تلاش لازم برای پیشبرد فرایند تولید صرفهجویی خواهید کرد. زمانی که پترنی شکل میگیرد، میتوانید استفادهای چندباره از آن داشته باشید.
- خلاقیت: طراحی الگو به توسعهدهنده و طراح اجازه میدهد که دست به آزمون و خطاهای خلاقانه بزند و تکنیکها و رویکردهای مختلف را بیازماید.
- تداوم در عملکرد: پایبندی به پترنها باعث یکپارچگی در سراسر فرایند تولید میشود و شاهد یکدستی در محصولی نهایی خواهید بود که ویژگی مهمی برای پروژههای مقیاس بالا به حساب میآید.
- تکرارپذیری: پترنها را میتوان تکرار کرد و در ابعاد و اشکال مختلف به کار بست. بنابراین داریم راجع به ابزاری برای ارزشمند برای طراحان و توسعهدهندگان صحبت میکنیم.
حالا که مزایا را بررسی کردیم، در ادامه میبینیم برخی از معایب دیزاین پترن چیست و استفاده از الگوهای چه بهایی برای پروژه خواهد داشت:
- هزینه: بهکارگیری الگوهای طراحی میتواند اندکی هزینهبر باشد، خصوصا اگر از نرمافزارها و تجهیزات تخصصی استفاده کنید.
- مهارت: برای پیادهسازی اصولی دیزاین پترنها نیاز به نیروی ماهر و متخصصی دارید که به راحتی قابل یافتن نخواهد بود.
- هزینه زمانی: برای پیادهسازی الگوها نیاز به توجه فراوان به جزییات و اعمال تغییرات مختلف خواهید بود تا همهچیز به خوبی پیش برود.
- محدودیتهای گاه خلاقانه: در برخی سناریوها، پایبندی به چارچوبهای یک پترن میتواند از خلاقیت توسعهدهنده بکاهد و پیادهسازی طرحهای منحصر به فرد و نوآورانه را دشوار کند.
جمعبندی و پاسخ به سوالات متداول
اکنون که به پایان مقاله رسیدهایم، میدانیم پترن دیزاین چیست و ابزاری تا چه حد ارزشمند برای توسعهدهندگان نرمافزار به حساب میآید. پترنها میتوانند راهکارهایی ساده برای چالشهای تکراری باشند و به کمک آنها، مقیاسپذیری و نگهداشتپذیری کدهای خود را بهبود خواهید داد. در مجموع باید گفت که آشنایی با دیزاین پترنهای مختلف و نحوه استفاده صحیح از آنها میتواند تفاوتهایی عظیم از نظر بهینگی در فرایند توسعه نرمافزار رقم بزند.
دیزاین پترنها به شما اجازه میدهند رویکردهایی اثباتشده و جایگزین را در فرایند توسعه نرمافزار در پیش بگیرید که منجر به کاربردپذیری و مقیاسپذیری هرچه بیشتر سیستم میشوند.
دیزاین پترنها در دستهبندی کلی قرار میگیرند: خلاقانه (Creative)، ساختاری (Structural) و رفتاری (Behavioral). پترنهای خلاقانه با ساخت و راهاندازی آبجکتها سر و کار دارند، پترنهای ساختاری با ترکیببندی و چیدمان آبجکتها سر و کله میزنند و با پترنهای رفتاری میتوان الگوهای ارتباطی میان آبجکتها را مدیریت کرد.
منبع: Refactoring و GeeksForGeeks