Design patterns
@code_craftersالگوی طراحی یا دیزاین پترن چیست؟
به عبارت دیگر مجموعه ای از بهترین راه حلهای مشکلات متداول در فرآیند برنامه نویسی را الگوهای طراحی مینامند. دیزاین پترن ها برای حل مشکلات رایج در برنامه نویسی شی گرا به وسیله برنامه نویسانی باتجربه توسعه داده شده اند.
همچنین باید در نظر داشت که مفهوم دیزاین پترن وابسته به یک زبان خاص نیست و یک دیزاین پترن خوب باید قابلیت پیاده سازی در اکثر زبان ها را داشته باشد.
دیزاین پترن ها عموما در سه گروه طبقه بندی میشوند
Structural (ساختاری)
Creational (تکوینی)
Behavioral (رفتاری)
دیزاین پترن های ساختاری به طور معمول درباره ارتباط بین یک سری Entity (موجودیت) هستند که باعث میشوند کار کردن این انتیتی ها با یکدیگر اسان تر شود.
دیزاین پترن های تکوینی معمولا اراعه دهنده یکسری مکانیزم های نمونه سازی هستند که باعث میشود ساخت ابجکت های مناسب در موقعیت های مختلف اسان تر گردد و در نهایت دیزاین پترن های رفتاری به منظور برقرار ارتباط بین انتیتی ها به کار میرود و باعث میشوند ارتباط انتیتی ها با یکدیگر انعطاف پذیر تر بشود.

1- Strategy pattern
این دیزاین پترن جز دسته رفتاری است که به شما اجازه میدهد بسته به شرایط خاصی که برای برنامه رخ میدهد سولوشن های مختلفی را انتخاب کنید.
در پاسخ به این سؤال که چه مواقعی میتوان از Strategy Pattern استفاده کرد، بایستی گفت فرض کنید کلاسی دارید که میتواند رکورد کاربر فعلی را آپدیت کرده یا کاربر جدیدی را ایجاد نماید. این کلاس در هر دو حالت، نیازمند به ورودی یکسانی منجمله نام، آدرس، شمارهٔ همراه و غیره است اما بسته به موقعیت مورد نظر، باید از فانکشنهای مختلفی برای بهروزرسانی یا ایجاد کاربر استفاده کند.
در سادهترین حالت ممکن، شما میتوانید از دستور شرطی if-else استفاده کنید؛ اما اگر خواستید این کلاس را در جای دیگری به کار ببرید چهطور؟ در چنین مواقعی باید همین if-else را در ماژول جدید نیز بازنویسی کنید که کاری منطقی به نظر نمیرسد. آیا اگر این امکان فراهم شود که فقط نام کلاس را به کار ببرید و بقیه کار را به آن بسپارید، راحتتر نخواهید بود؟ به عنوان مثال داریم:
2- Adapter pattern
این الگوی طراحی در اصل یک دیزاین پترن از نوع اصطلاحاً Structural است که به شما این امکان را میدهد تا یک کلاس را با اینترفیس متفاوتی سازگار کنید که این کار امکان استفاده از کلاس توسط سیستمی که از متدهای فراخوانی مختلفی استفاده میکند را امکانپذیر میسازد. این الگو همچنین به شما امکان تغییر برخی از ورودیهایی را میدهد که از آبجکت ساختهشده از روی کلاس دریافت شده که همین مسئله باعث میشود بتوانید آنها را به چیزی که با فانکشنهای این پترن نیز همخوانی داشته باشد تبدیل نمایید.

Wrapper
اصطلاحی است که به مفهوم آداپتر کلاس اشاره دارد؛ به عبارت دیگر، به دولوپر این اجازه داده میشود تا تَسکهایی را در داخل یک کلاس اصطلاحاً Wrap (بستهبندی) کند و آنها را در موقعیتهای مناسبی مورد استفاده قرار دهد. به عنوان مثال، به جای فراخوانی کلاسهای متفاوت و صدا زدن فانکشنهای آنها به صورت تکبهتک، میتوانید تمامی این متدها را در یک متد واحد توسط کلاس آداپتر اصطلاحاً Encapsulate کنید که این کار نه تنها امکان استفادهٔ مجدد از این قابلیتها را به هر صورتی که بخواهید به شما میدهد، بلکه از بازنویسی کدهای مربوط به یک تَسک خاص که قصد استفاده از آن در ماژول دیگری دارید نیز جلوگیری میکند. اگر بخواهیم بدون استفاده از آداپتر پترن کدنویسی کنیم، کدی بدین شکل خواهیم داشت :
@code_crafters