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

دیزاین پترن (Design Pattern) رو میشه الگوی طراحی تعریف کرد.

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

یک Design Pattern یک کد کاملی نیست که بشه اون رو به خودی خود اجرا کرد بلکه رویکردیه برای حل یک مسئله.

این مثالی که می‌زنم دقیق نیست اما مفهوم رو به خوبی بیان میکنه. فرض کنید بخوایم ۱۰۰۰ تا عدد یکسان رو جمع کنیم. جمع کردن ۱۰۰۰ تا عدد زمان بر خواهد بود. بنابراین ما از مفهوم ضرب استفاده میکنیم که در ظاهر قوانین متفاوتی هم داره ولی در ذات خودش همون جمع هست. استفاده از ضرب برای جمع کردن عددهای یکسان یک الگوی طراحی حساب میشه. ضرب به خودی خود معنی نداره و قابل لمس نیست، بلکه ضرب دو یا چند عدد در هم معنی داره. Design Pattern هم به خودی خود معنی نداره و صرفا یک رویکرد هست. برای اینکه رویکرد بودن مشخص بشه یک مثال دیگه هم میزنم.

فرض کنیم میخوایم یک تعداد عدد ۲ و ۵ رو که بصورت در همریخته هستند با هم جمع کنیم. یک راه اینه که از ابتدا اعداد رو با هم جمع کنیم. راه بهتر اینه که ۵ هارو جدا کنیم و با هم جمع کنیم و ۲ها رو هم جدا کنیم و بصورت ضرب حاصل رو بدست بیاریم و سپس این دو عدد رو با هم جمع کنیم.

این رویکرد که شامل جدا کردن اعداد مشابه و ضربشون توی هم میشه رو میگیم دیزاین پترن یا الگوی طراحی.

انواع مختلفی از الگو‌های طراحی وجود داره:

الگوهای تکوینی (Creational Patterns)

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

برای مثال احتمال خیلی زیاد تا حالا (حتی بدون اینکه بدونید چیکار میکنید) از Abstract Factory استفاده کردید. Abstract Factory به ما اینترفیسی میده تا از یک object نمونه خامی رو بسازیم و بدون اینکه اسم واقعیش رو مشخص کنیم. مثلا بارها پیش میاد ما یک view میسازیم بدون اینکه مشخص کنیم این ویو button هست یا image view یا هرچیز دیگر و بعد در خلال کد زدن این رو مشخص می‌کنیم.

عملا سلسله‌مراتب (hierarchy) که در شیء‌گرایی وجود داره به ما این امکان رو میده که از کلاس پدر جای فرزند استفاده کنیم و بعد هر زمان که احتیاج شد object رو به کلاس مورد نظر cast کنیم.

الگوهای ساختاری (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 رو قفل میکنه و اجازه نمیده بقیه ازش استفاده کنن و به این شکل جلوی خطا رو میگیره. پترن جالب دیگه‌ای توی این زمینه Join هست که اجازه میده دو task مختلف همزمان از یک منبع استفاده کنن.

پی‌نوشت:این پست پیش‌نیازی برای درک و یادگیری بیشتر Design Pattern  ها خواهد بود.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *