دیزاین پترن
الگوها و مستنداتی از روشهای حل برای مشکلات رایج در برنامهنویسی شیءگرا هستند. این الگوها ابتدا توسط کریستوف الکساندر ارایه شد و سپس از سوی گروهی موسوم به دسته چهار (به انگلیسی: Gang of Four) یا به اختصار GOF مورد طبقهبندی قرار گرفت و تحت عنوان کتابی به نام الگوهای طراحی در سال ۱۹۹۴منتشر شد.
یک Design Pattern یک کد کاملی نیست که بشه اون رو به خودی خود اجرا کرد بلکه رویکردیه برای حل یک مسئله.
فرض کنیم میخوایم یک تعداد عدد ۲ و ۵ رو که بصورت در همریخته هستند با هم جمع کنیم. یک راه اینه که از ابتدا اعداد رو با هم جمع کنیم. راه بهتر اینه که ۵ هارو جدا کنیم و با هم جمع کنیم و ۲ها رو هم جدا کنیم و بصورت ضرب حاصل رو بدست بیاریم و سپس این دو عدد رو با هم جمع کنیم.
این رویکرد که شامل جدا کردن اعداد مشابه و ضربشون توی هم میشه رو میگیم دیزاین پترن یا الگوی طراحی.
کریستوف الکساندر الگوی طراحی را راه حلی برای مسایلی میداند که دایماً در محیط اطراف رخ میدهد، از این رو میتوان بدون دوباره کاری در آینده مسایل را با سرعت بالاتری حل نمود.
گاما و همکارانش از ارایهٔ روش تصویری برای هر الگو خودداری نمودند. به جای آن از روش توصیف نوشتاری آبوت استفاده نمودند. هر الگو دارای یک قالب است که عبارتند از:
- نام و طبقهبندی: نام الگو و توصیفی کوتاه برای آن را شامل میشود.
- قصد: متنی کوتاه در پاسخ به این پرسش که: این الگو چکاری را انجام میدهد؟ هدف و تفکر پشت این کار چیست؟ و این الگو چه مسالی را حل مینماید؟
- نام دیگر: در صورتی که نام شناختهشدهٔ دیگری برای آن وجود دارد ذکر گردد.
- انگیزه: سناریویی که در آن از الگوی طراحی استفاده شدهباشد و اینکه چگونه از کلاس و شی برای حل مشکل استفاده شدهاست.
- قابلیت کاربردی: توصیفگر شرایط است که این الگو در آن قابل پیادهسازی است.
- ساختار: یک نمایش گرافیکی است که براساس تکنیک مدلسازی شیء نمایش داده میشود (که امروزه از زبان مدلسازی یکپارچه برای این کار استفاده میشود)
- شرکتکنندگان: کلاس یا اشیا شرکتکننده در الگوی طراحی و بیان مسئولیتهایشان.
- همکاری: چگونگی همکاری شرکتکنندگان در الگو
- پیادهسازی: نکات پیادهسازی را بیان مینماید.
- کد نمونه: مثالی به زبان سی++ یا اسمالتاک (امروزه زبان جاوا جایگزین شدهاست)
- مثالهای شناختهشده: مثالهایی از کاربرد در سیستمهای واقعی
- الگوهای مرتبط: چه الگوهایی شبیه این الگو هستند؟ و تفاوتهای اساسی بین آنهای چیست؟
الگو های طراحی
به طور کلی ما ۲۳ الگو داریم که در سه گروه زیر خلاصا می شود:
-
الگوهای ساختاری (structural patterns)
این دسته امکان بهینه سازی ساختارها، متدها، کلاسها و اساسا هر موجودیتی را برقرارمی کند.
مثال الگوی Flyweight : فرض کنید تعداد زیادی از یک object داریم و قصد نگهداری و استفاده ازآنهارو داریم. به کمک این الگو ما بخشهایی که بین objectها مشترک هست رو بینشون به اشتراک میگزاریم.
مثالی دیگر ولی تا حدی غلط از این الگوریتم اینه که فرض کنید ما بین objectهامون ۱۰۰۰ تا علی داریم. به جای اینکه ۱۰۰۰ تا خانه حافظه برای علی اشغال شود . تنها یک خانه حافظه برای مقدار “علی” داشت و باقی خانهها به جایی که “علی” در آن ذخیره شده اشاره می کند.
الگوهای رفتاری (behavioral patterns)
الگوهای رفتاری هم به رفتار Entityها (موجودیتها شامل کلاس، متد، نمونه، اینترفیس و…) نسبت به مسائل مختلف دلالت می کند. مسئله میتونه تغییر یک entity دیگه باشه یا میتونه تغییر state داخل خود entity باشد.
مثال الگوی Servant فرض کنید ما قصد داریم یک سری اعمالی رو تحت عنوان Drive که برای کلاسهای Car, Bike, Airplane تعریف کنیم. ما میتونیم یک interface تحت عنوان Drive بنویسیم و تمام کلاسها اون رو پیادهسازی(implement) کند.
الگوهای همزمانی (Concurrency patterns)
الگوهایی که به همزمانی رویدادها در خلال اجرای برنامه میپردازد. این الگوها از نظر من یک مرحله پیشرفتهتر از الگوهای قبلی هستند.
پترنها Lock فرض کنید همزمان که یک task دارد مقداری را روی حافظه ذخیره می کند یک task دیگه سعی میکند در همان حافظه خونه مقدار دیگهای رو ذخیره کند. در اینصورت ممکن است مقدار نهایی با چیزی که باید باشه تفاوت داشته باشد، یا در نهایت هر دو task آدرس یکسانی از حافظه رو به عنوان مقصد نهایی ارسال کند و مشکلات دیگر. مکانیزم Lock به اینصورته که وقتی یک task با یک منبع سر و کار داره اون resource رو قفل می کند و اجازه نمی دهد بقیه ازش استفاده کنن و به این شکل جلوی خطا رو میگیرد.
دنوشته ای از
آموزش design pattern ویکی پدیا