در برنامهنویسی معمولا یک سری مسئله های خیلی ساده و شناخته شدهای داریم که بسیار پر رخداد و تکراری هستند. برای حل این مسئلهها هرکسی احتمالا یک راهحلی ارائه می دهد. در طول زمان برای این مسائل یک سری راهحل استاندارد و قابل تکرار نیز ارائه شده است که به آن ها الگوهای طراحی می گوییم.
دیزاین پترن (Design Pattern) را می شود نوعی الگوی طراحی در برنامه نویسی تعریف کرد.
یک Design Pattern یک کد کاملی نیست که بشود آن را به خودی خود اجرا کرد بلکه رویکردی است که برای حل یک مسئله مورد استفاده قرار می گیرد . به عبارت دیگر یک دیزاین پترن، یک کلاس برنامه نویسی یا یک کتابخانه و یا تابعی در برنامه که ما معمولا به کدهایمان اضافه میکنیم نیست.دیزاین پترن یه قالب است که باید در شرایطی درست از آن استفاده کنیم. همچنین مستقل از زبان برنامه نویسی می باشد. یک دیزاین پترن خوب باید قابلیت پیاده سازی روی اکثر زبان های برنامه نویسی (نسبت به قابلیت های آن زبان) را داشته باشد. به این نکته مهم توجه داشته باشید که دیزاین پترن مثل چاقوی دولبه هست. اگه در جای نادرست استفاده بشود می تواند فاجعه آمیز باشد و مشکلات زیادی را برای پروژه و هندل کردن آن ایجاد کند ولی اگر در جای درستی استفاده شود می تواند “فرشته ی نجات” برنامه نویسان و توسعه دهندگان باشد!
یک مثال مفهومی می زنیم
فرض کنید بخواهیم ۱۰۰۰ تا عدد یکسان رو جمع کنیم. جمع کردن ۱۰۰۰ تا عدد زمان بر خواهد بود. بنابراین ما از مفهوم ضرب استفاده می کنیم که در ظاهر قوانین متفاوتی هم دارد ولی در ذات خودش همون جمع هست. استفاده از ضرب برای جمع کردن عددهای یکسان یک الگوی طراحی حساب می شود. ضرب به خودی خود معنی نداره و قابل لمس نیست، بلکه ضرب دو یا چند عدد در هم معنی داره. Design Pattern هم به خودی خود معنی نداره و صرفا یک رویکرد هست.
برای اینکه رویکرد بودن مشخص بشود یک مثال دیگر هم می زنیم
فرض کنیم می خواهیم یک تعداد عدد ۲ و ۵ رو که بصورت در هم ریخته هستند با هم جمع کنیم. یک راه این است که از ابتدا اعداد را با هم جمع کنیم. راه بهتر این است که ۵ ها را جدا کنیم و با هم جمع کنیم و ۲ ها را هم جدا کنیم و به صورت ضرب ، حاصل را بدست بیاوریم و سپس این دو عدد را با هم جمع کنیم.
این رویکرد که شامل جدا کردن اعداد مشابه و ضرب شان در هم ، را می گوییم دیزاین پترن یا الگوی طراحی.
دیزاین پترن ها سه نوع اصلی و یک نوع پیشرفته دارند
- ساختاری (structural): این دسته از پترنها این امکان رو به ما میدن که به شکل بهینهتری بین ساختارها، متدها، کلاسها و اساسا هر موجودیتی که در زبانمون داریم ارتباط برقرار کنیم.
- تکوینی یا ایجادی (creational) : این الگوها همونطوری که از اسمشون هم مشخصه راهحلهایی رو در ایجاد اقلام مختلف مثل متدها، نمونهها و… برای ما تعریف میکنن.
- رفتاری (behavioral): الگوهای رفتاری هم به رفتار Entityهامون (موجودیتها شامل کلاس، متد، نمونه، اینترفیس و…) نسبت به مسائل مختلف میپردازن. مسئله میتونه تغییر یک entity دیگه باشه یا میتونه تغییر state داخل خود entity باشه.
- الگوهای همزمانی (Concurrency patterns): الگوهایی که به همزمانی رویدادها در خلال اجرای برنامه میپردازن. این الگوها از نظر من یک مرحله پیشرفتهتر از الگوهای قبلی هستن.
الگوهای ساختاری به طور کلی با ارتباط بین موجودیت ها سرو کار دارد و باعث می شود آنها با هم بهتر کار کنند.
الگوهای ایجادی ، ساز و کار نمونه سازی ای ارائه می دهد که ایجاد اشیا (اشیا برنامه نویسی شیء گرا) را متناسب با موقعیت آن، ساده تر می کند
الگوهای رفتاری در ارتباط بین موجودیت ها استفاده می شود و این ارتباط را ساده تر و انعطاف پذیر تر می کند.
الگوهای طراحی در اصل راه حلی برای حل کردن مشکلات برنامه نویسی است، که در مورد اون راه حل، به خوبی فکر شده است. بسیاری از برنامه نویسان با این مشکلات برخورد کردن و راه حل اون مشکلات رو هم پیدا کردن. اگر شما با این مسائل برخورد کنی چرا دوباره راه حلی رو بسازی که قبلا یکی دیگه اون رو ساخته و اثبات کرده!
مثال
فرض کنیم میخواهیم دو کلاس رو که در شرایط مختلف کارهای مختلف انجام میدن رو با هم مرج کنیم. این کلاس ها به شدت در جاهای مختلف برنامه استفاده شدن. خب معلومه که خیلی سخته که این دو کلاس رو حذف کنیم و یک کلاس به جاش بنویسیم و همه جای برنامه جاهایی که از این کلاس ها استفاده شده رو تغییر بدیم. بعد لازمه همه بخش های سیستم رو دوباره تست کنیم و تازه ممکنه کامپوننت های دیگه این هم با این کلاس ها کار میکردند که براشون مشکل ایجاد میشه. در نهایت کلی هم باگ ایجاد میشه. به جای این کار میتونیم از دو الگوی استراتژی و آداپتر استفاده کنیم که به راحتی این مسئله رو حل میکنه
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید