دیزاین پترن چیست:الگوی طراحی یا Design Pattern چیست؟

دیزاین پترن چیست:الگوی طراحی یا Design Pattern چیست؟
فهرست مقاله [نمایش]

    اگر در حال مطالعه این مقاله هستید تصمیم گرفته‌اید پا به دنیای برنامه‌نویسان حرفه‌ای بگذارید. به شما تبریک عرض می‌کنم. 

    حالا چرا دنیای برنامه‌نویسان حرفه‌ای؟

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

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

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

    برای آشنایی کامل با دیزاین پترن ها آموزش دیزاین پترن ها در #C رو در سایت ببینید.

     

    بررسی یک چالش در پروژه‌های نرم‌افزاری

    challenges in project

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

    فرض کنید شما به‌عنوان یک مدیر فنی در یک شرکت طراحی نرم‌افزار مشغول به کار هستید و تیم شما در حال طراحی یک نرم‌افزار واژه‌پرداز مثل Office Word  می‌باشد.

    حالا نیاز کارفرما این است که در این نرم‌افزار واژه‌پرداز قابلیت‌های Undo/Redo  هم اضافه شود و شما به‌عنوان مدیر فنی باید بهترین راه‌حل، برای پیاده‌سازی این قابلیت‌ها رو ارائه کنید.

    فرض ما بر این است که شما و اعضای تیم تابه‌حال در هیچ نرم‌افزاری قابلیت‌های Undo/Redo را پیاده‌سازی نکرده‌اید و با نحوه پیاده‌سازی همچنین قابلیت‌هایی آشنایی ندارید.

    شما با یک چالش جدید روبه‌رو شده‌اید و مجبورید راه حلی برای غلبه بر این چالش ارائه کنید.

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

    راه‌حل ارائه شده توسط شما باید بتواند به این سؤال‌ها پاسخ مثبت دهد:

     

    1.  آیا در آینده توسعه برنامه را بدون مشکل می‌توانیم انجام دهیم؟
    2.  این راه‌حل انعطاف‌پذیر هست؟آیابعد از پیاده‌سازی این راه‌حل سیستم ما Reusable هست؟
    3.  استفاده مجدد از کدها بالاتر می‌رود؟
    4.  با این راه‌حل طراحی برنامه بهتر می‌شود؟
    5.  آیا کدنویسی تمیزی انجام شده؟
    6. این راه‌حل مورد پذیرش اعضای تیم هست؟ و همه اعضای تیم می‌توانند آن را به‌خوبی درک کنند؟
    7.  می‌توانیم راه حلی که استفاده کرده‌ایم را ضمانت کنیم؟ آن‌قدر به راه‌حل اعتماد داریم که بتوانیم قاطع بگوییم این بهترین راه‌حل این مشکل است؟
    8. هر راه حلی که ارائه می‌کنید باید به این سؤالات پاسخ دهد و به این صورت می‌توانیم تشخیص دهید که راه‌حل مناسبی ارائه کرده‌ایم یا خیر؟

     

    حالا شما به‌عنوان مدیر فنی تیم توسعه می‌توانید در سریع‌ترین زمان ممکن یک راه‌حل مناسب برای قابلیت‌های Undo/Redo  به تیم ارائه بدهید؟ راه حلی که بتواند به سؤالات بالا پاسخ مثبت بدهد؟

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

    خب حالا که ما نمی‌توانیم خیلی سریع یک راه‌حل مناسب برای این مشکل ارائه کنیم باید چه کاری انجام دهیم؟

    question

     

     

    مشکل شما با استفاده از دیزاین پترن‌ها برطرف می‌شود باید از یک دیزاین پترن که مخصوص این کار ارائه شده است استفاده کنید.

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

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

    چرا از دیزاین پترن‌ها استفاده کنیم؟

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

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

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

    معروف‌ترین دیزاین پترن‌ها کدام‌اند؟

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

    در سال 1994 برای اولین‌بار چهار نفر تصمیم گرفتند از میان دیزاین پترن‌های ارائه شده تا آن زمان محبوب‌ترین و پرکاربردترین دیزاین پترن‌ها را در کتابی به نام   Design Patterns: Elements of Reusable Object- Oriented Software  جمع آوری کنند.

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

     در مقاله کدام دیزاین پترن ها در برنامه نویسی معروف هستند؟ دیزاین پترن های معروفی که برنامه نویس ها بیشتر از آنها استفاده میکنند را معرفی کرده ایم.

    gof

     

    در این کتاب 23 دیزاین پترن در سه دسته ارائه شدند. با این که از زمان ارائه این دیزاین پترن‌ها سال‌ها می‌گذرد اما همچنان این دیزاین پترن‌ها مورداستفاده قرار می‌گیرند و در همین وب‌سایت باگتو تا به امروز حداقل از 3 دیزاین پترن Gof استفاده شده است.

    البته بعد از سال 1994 دیزاین پترن‌های دیگری هم ارائه شدند که کاربردهای زیادی در برنامه‌نویسی دارند و امروزه هم از دیزاین پترن‌های Gof استفاده می‌شود و هم از دیزاین پترن‌های جدیدی که ارائه شده‌اند.

    دیزاین پترن‌های ساختاری(Structural Design Patterns)

     

    دیزاین پترن‌های ساختاری به این موضوع می‌پردازند که چگونه کلاس‌ها یا شیءها را می‌توان با یکدیگر ترکیب یا هم‌جمع کرد تا ساختارهای جدید ایجاد شود.

    دیزاین پترن‌های ساختاری شامل:

    1. Adapter (تطبیق دهنده -هماهنگ ساز ): یک رابط بین دو کلاس ناسازگار را ایجاد می‌کند، به طوری که یک کلاس بتواند از توابع یک کلاس دیگر استفاده کند.
    2. Bridge (پل): انتزاع از پیاده‌سازی جدا کرده و به طوری آن‌ها را مستقل می‌کند که هر دو می‌توانند به صورت مستقل تغییر کنند.
    3. Composite (ترکیبی): به شیء‌ها امکان می‌دهد تا به شکل ساختار درختی سازماندهی شوند و به شیء تکی یا گروهی از شیء‌ها به یکسان پاسخ دهند.
    4. Decorator (تزیین‌کننده): به شیء موجود ویژگی‌ها یا وظایف اضافی را اضافه می‌کند.
    5. Facade (نمای بیرونی ): یک رابط یکپارچه برای مجموعه‌ای از رابط‌ها در یک سامانه فراهم می‌کند، و کار با سامانه را ساده‌تر می‌کند.
    6. Flyweight (شی سبک وزن ): فاکتور گیری از اشیائ تکراری و صرفه جویی در مصرف حافظه .
    7. Proxy (نماینده- واسطه ): یک شیء نماینده برای شیء دیگر فراهم می‌آورد تا به دسترسی به آن نظارت کند.

    این الگوها به توسعه‌دهندگان کمک می‌کنند تا ساختار کد را بهبود ببخشند، مدیریت وابستگی‌ها را بهتر کنند و با کارایی بالاتری کد بنویسند.

    دیزاین پترن‌های ایجادی(Creational Design Patterns)

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

    دیزاین پترن‌های ایجادی شامل:

    1. Singleton (تک نمونه): ضمانت می‌کند که یک کلاس تنها یک نمونه داشته باشد و یک نقطه دسترسی به آن نمونه ارائه می‌دهد.
    2. Factory Method (روش کارخانه): واسطی تعریف می‌کند که از کلاس‌هایی که اشیاء را می‌سازند جدا است. به طوری که زیرکلاس‌ها تصمیم بگیرند که کدام کلاس از آن‌ها باید مورد استفاده قرار گیرد.
    3. Abstract Factory (کارخانه انتزاعی): واسطی برای ایجاد خانواده‌های وابسته یا وابسته به هم از اشیاء بدون مشخص کردن کلاس‌های محدد ارائه می‌دهد.
    4. Builder (سازنده): جدا کردن نحوه ساخت یک شی مرکب از نحوه نمایش آن. به این ترتیب، همان شی می‌تواند با انواع مختلفی از نمایش‌ها ساخته شود.
    5. Prototype (نمونه اولیه): ایجاد یک نمونه اولیه کامل از یک شی و سپس کپی کردن آن شی برای ساخت نمونه‌های جدید.

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

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

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

     

    دیزاین پترن‌های رفتاری(Behavioral)

     

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

    دیزاین پترن‌های رفتاری شامل:

    1. Chain of Responsibility (زنجیره مسئولیت): چندین شی را به گونه‌ای پیوسته می‌کند تا به ترتیب، هر یک از آن‌ها شانس پردازش درخواست را داشته باشد.
    2. Command (دستور): درخواست را به عنوان یک شی در نظر می‌گیرد، اجازه می‌دهد که کاربران با پارامتر‌های مختلف درخواست‌ها را پارامتریزه کنند.
    3. Interpreter (تفسیرگر): یک گرامر برای زبان ساده را تعریف می‌کند و ارائه می‌دهد.
    4. Iterator (تکرارگر): دسترسی به عناصر یک اشیاء مجموعه را بدون نیاز به آشنایی با ساختار آن فراهم می‌کند.
    5. Mediator (واسطه): تعریف یک شی است که کپسوله‌سازی یک سری از تعامل‌های بین اشیاء است.
    6. Memento (یادداشت): حفظ و بازیابی حالت داخلی یک شیء بدون نقض اصول کپسوله‌سازی آن.
    7. Observer (مشاهده‌کننده): وضعیت یک شیء در هنگام تغییر به یک سری از اشیاء وابسته به آن اطلاع می‌دهد.
    8. State (وضعیت): اجازه می‌دهد یک شیء رفتار خود را زمانی که وضعیت داخلی آن تغییر می‌کند، تغییر دهد.
    9. Strategy (استراتژی): تعریف یک مجموعه از الگوریتم‌ها، قابل تبدیل آن‌ها به یک‌دیگر، و قابل استفاده بر اساس انتخاب در زمان اجرا.
    10. Template Method (روش الگو): تعریف ساختار یک الگوریتم در یک روش، اما تأخیر در تصمیم گیری در مورد پیاده‌سازی بخش‌هایی از آن به زیرکلاس‌ها.
    11. Visitor (بازدید کننده): اضافه کردن عملیات به اشیاء بدون تغییر کلاس‌هایی که آن‌ها را تعریف می‌کنند.

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

     

    Types of pattern designs

     

    چه کسانی باید کار با این دیزاین پترن‌ها را یاد بگیرند؟

     

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

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

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

    تحلیل‌گران نیازمندی‌ها و تحلیل‌گران سیستم: این افراد می‌توانند با فهمیدن دیزاین پترن‌ها بهتر با تیم توسعه هم‌فکری کنند و نیازمندی‌ها و تحلیل‌های خود را به صورت واضح‌تر ارائه دهند.

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

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

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

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

     

    برای قابلیت‌های undo/Redo  از چه دیزاین پترنی استفاده کنیم؟

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

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

     

    نتیجه‌گیری:

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

    و از طرفی چون یک روش عمومی می‌باشند که احتمالاً همه اعضای تیم با آن آشنایی دارند همه افراد تیم به‌راحتی می‌توانند آن را درک کنند و آن را به‌درستی به کار ببرند.

     

     


    • نویسنده: احسان بابائی

    ارسال دیدگاه

    برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربری‌تان شوید


    دیدگاه کاربران

    avatar
    مصطفی
    1400/09/07

    عالی بود