به زبان ساده دیزاین پترن یا الگو طراحی مسائلی از پیش آماده شده برای حل مشکلاتی عامیانه در زمینه مهندسی نرم افزار است. میتوان الگوهای طراحی را به عنوان یک کتابچه حل مشکلات نگاه کرد که هر بار در مواجه با مشکلی میتوانید به آن سری بزنید و راهکاری برای آن پیدا کنید.
البته به عنوان یک نکته مهم این موضوع را نیز بگوییم که دیزاین پترنها قطعه کدهایی نیستند که شما آنها را کپی کرده و در برنامهتان قرار دهید. هر دیزاین پترن بیشتر از آنکه تنها یک قطعه کد باشد یک مفهوم مهم برنامه نویسی است که میتواند در روشهای متفاوتی با استفاده از زبانهای برنامه نویسی مختلف پیادهسازی شود.
برخی از افراد دیزاین پترنها را با الگوریتمها اشتباه میگیرند در صورتی که این دو مورد تفاوتهایی با همدیگر دارند. الگوریتمها معمولا از یک ساختار بسیار منظمتر بهرهگیری کرده و اهداف معمولا در آن ثابت هستند در حالیکه دیزاین پترنها معمولا پیچیدهتر و بزرگتر از مفهوم الگوریتمها هستند.
الگوریتم بیشتر شبیه به یک دستور پخت است که به شما میگوید قدم به قدم اگر این کارها را انجام دهید در نهایت به یک نتیجه خواهید رسید اما دیزاین پترن بیشتر شبیه به یک دورنمای کلی از ویژگیهاست ولی دستور انجام دادن آن به شما بستگی دارد.
دیزاین پترنها شامل چه چیزهایی میشوند؟
هر دیزاین پترن به صورت کلی شامل یکسری بخش میشود که در زیر ما موارد اصلی را بیان خواهیم کرد:
- قصد: هر دیزاین پترن شامل یک توضیحات کلی مربوط به یک مشکل و راهحل آن است.
- انگیزه: بخش دیگری از هر دیزاین پترن است که توضیحات کاملی در ارتباط با مشکل و راه حل را ارائه میدهد.
- ساختار: این بخش ساختار کلاسی که در آن قصد حل مشکل را دارد توصیف میکند.
- نمونه کد: هر دیزاین پترن در نهایت باید پیادهسازی شود. معمولا دیزاین پترنها یک نمونه کد براساس محبوبترین زبانهای برنامهنویسی را در اختیار کاربران قرار میدهند.
این چهار بخش اصلیترین موضوعاتی است که یک دیزاین پترن در اختیار ما قرار میدهد. اما برخی از دیزاین پترنها اطلاعات بیشتری را در اختیار ما قرار میدهند.
تاریخچه
چه کسی برای اولین بار دیزاین پترنها را ایجاد کرد؟ این سوال خوبیست اما چندان درست نیست! در دنیای برنامه نویسی شئ گرایی وقتی فردی برای یک مسئله کدی را بارها و بارها تکرار میکند در نهایت روی آن اسمی گذاشته و آن را به اشتراک میگذارد. پس به شکلی نیست که شما فکر کنید بسیار سازماندهی شده هر دیزاین پترن منتشر شده و یک تلاش برنامهریزی شده است.
اما مفهوم کلمه دیزاین پترن را برای اولین بار فردی به اسم Christopher Alexander در کتابی با نام Pattern Language پیادهسازی کرد. این کتاب زبانی را معرفی میکند که به واسطه آن یک محیط شهری بزرگ را ایجاد میکند. تمرکز اصلی این زبان روی الگوهایی خاص از معماری شهری است. برای مثال پنجرههای ساختمانها باید به چه شکلی باشند؟ تعداد طبقات مجاز ساختمانها باید چقدر باشد و... .
اولین تلاش عملی برای ایجاد یک کتاب جامع در زمینه الگوهای طراحی مربوط به چهار نویسنده است که در سال ۱۹۹۴ کتابی تحت عنوان Design Patterns: Elements of Reusable Object-Oriented Software را نوشتند. در این کتاب از ۲۳ دیزاین پترن صحبت به میان می آید که روشهای منطقی و جذابی برای حل مشکلات مختلف به همراه کدهای پیادهسازیشان است. البته این کتاب چون نام طولانی دارد با نام The GoF Book نیز شناخته میشود.
بعد از انتشار این کتاب الگوها و روشهای جدید بسیار بیشتری نیز شکل گرفت و به ما کمک کرد تا بتوانیم روش پیادهسازی این موارد را نیز یاد بگیریم.
چرا باید دیزاین پترنها را یاد بگیریم؟
حقیقت این است که شما میتوانید برای سالها بدون استفاده از حتی یک دیزاین پترن به شغل برنامهنویسی خود ادامه دهید. اتفاقا بیشتر افراد همین کار را نیز انجام میدهند. حتی ممکن است شما یک دیزاین پترن را به صورت مستقل بدون آنکه بدانید ایجاد کنید. پس شاید بپرسید چرا باید دیزاین پترنها را یاد بگیرم؟
- دیزاین پترنها مجموعهای از ابزارهای تست شده و بسیار بهینه برای حل کردن مشکلات خاصی در دنیای برنامهنویسی است. حتی اگر شما با این دسته از مشکلات برخورد نکرده باشید دیزاین پترنها باز هم میتوانند به عنوان راهکار مناسبی برای یادگیری چگونگی حل کردن مشکلات در دنیای برنامه نویسی شئ گرا به شما آموزشهای خوبی را ارائه دهند.
- دیزاین پترنها به شما و هم تیمیهایتان یک زبان مشترک را ارائه میدهد که با استفاده از این زبان میتوانید به تعامل بهینهای دست پیدا بکنید. برای مثال شما کافیست بگویید «آن را با Singleton» بنویسید. در این صورت هم تیمیهای شما بدون توضیح اضافی مقصود شما را درک کرده و میدانند که باید چه کاری را انجام دهند.
انتقادهایی به دیزاین پترن
با وجود تمام نکات مثبتی که دیزاین پترنها دارند اما انتقاداتی نیز در ارتباط با آنها وجود دارد که باید در نظر گرفته شوند. این انتقادات طرفداران بسیار زیادی نیز داشته و مطمئنا درک کردن آنها جذاب خواهد بود:
- دیزاین پترنها حاوی حالتهایی است که برای پیادهسازی آنها نیاز است تا از یک زبان برنامهنویسی قدرتمند در حوزه شئ گرایی استفاده شود. در صورتی که امروزه اغلب زبانهای برنامه نویسی محبوب این سطح از قدرتمند بودن را در خود ندارند. برای مثال پایتون و جاوا اسکریپت زبانهای کاملی مانند جاوا یا سی پلاس پلاس نیستند. به همین دلیل برای پیادهسازی این دیزاین پترنها در زبانهایی مانند پایتون شما دردسرهای سینتکسی بسیار زیادی داشته و از مجموعه ابزارهای مختلفی باید استفاده کنید. مواردی که شاید حتی در دورههای آموزشی تدریس نشوند. از طرفی دیگر پایتون و یا جاوا اسکریپت حاوی توانمندیهای بروزی هستند که برای پیادهسازی یک دیزاین پترن شما دیگر نیازی به پیادهسازی آنها از ابتدا را ندارید چرا که آنها در یک دستور ساده آن را خلاصه کردهاند. برای مثال شما با استفاده از یک تابع لامبدا به سادگی میتوانید الگوی Strategy را پیادهسازی کنید.
- برخی از برنامه نویسان معتقد هستند که دیزاین پترنها را نباید همانگونه که هستند پیادهسازی کنیم. بلکه باید درکی عمیق از خود پروژه در ابتدا داشته باشیم و سپس براساس آن دیزاین پترنها را بهینه کنیم. این موضوعی است که توسعه دهندگان دیزاین پترنها آن را مردود میدانند.
- استفادههای بی مورد یکی دیگر از انتقادهایی است که توسط اغلب افراد حرفهای گرفته میشود. کسی که چکش در اختیار دارد همه را میخ میبیند! افراد مبتدی که به تازگی دیزاین پترنها را یاد میگیرند همواره از آنها در موارد بسیار زیادی استفاده میکنند که ممکن است استفاده از آنها در آن مسائل لزومی نداشته باشد.
دستهبندی دیزاین پترنها
دیزاین پترنها براساس سه مشخصه پیچیدگی، سطح جزئیات و مقیاس استفاده پذیریشان از همدیگر جدا میشوند.
سطح پایینترین دیزاین پترنها را idioms مینامند چرا که تنها برای یک زبان برنامهنویسی خاص طراحی میشوند. اما دیزاین پترنهایی که امروزه از محبوبیت و استفاده بسیار زیاد برخوردار هستند با همه زبانهای برنامهنویسی شئ گرا قابل استفاده هستند. این الگوها را architectural patterns مینامند.
اما به صورت کلیتر دیزاین پترنها به دسته تقسیم بندی میشوند که عبارت هستند از موارد زیر:
Creational patterns: این دیزاین پترن مکانیسم ایجاد اشیاء را فراهم میکنند که انعطاف و استفاده مجدد از کدهای موجود را بالا میبرند.
Structural patterns: این دیزاین پترن برای تعریف کلاسها و اشیاء در ساختارهای بزرگتر استفاده میشود. هدف این دیزاین پترن این است که این ساختارهای بزرگ را منعطف و بهینه نگهداری کند.
Behavioral patterns: این دیزاین پترن مسئول مطمئن شدن از ارتباط برقرار کردن سالم بین اشیاء و عملیاتهای مربوط به انتسابشان است.
در پایان
در این مقاله جزئیات اولیه مورد نیاز برای درک دیزاین پترنها را به شما ارائه دادیم. حال نوبت شماست که نگاهی به دیزاین پترنهای مختلف بیاندازید و به صورت جداگانه با هر کدام از آنها آشنایی پیدا بکنید. همچنین میتوانید دوره آموزشی «آموزش دیزاین پترنها» را از وبسایت راکت مشاهده کنید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید