الگوی طراحی استراتژی (Strategy) در زبان PHP

الگوی طراحی استراتژیاگر نمی‌دانید الگوی‌های طراحی چی هستند و به چه درد می‌خورند٬ می‌توانید اطلاعات ابتدایی در این زمینه را در مقدمه یکی دیگر از نوشته هام مطالعه کنید: https://virgool.io/@ali.bayat/%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%AF%DA%A9%D9%88%D8%B1%D8%A7%D8%AA%D9%88%D8%B1-decorator-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-php-pfmr6yy9jvzs الگوی طراحی استراتژی یکی از الگوهای طراحی رفتاری هست و قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن می‌سازد.بجای پیاده‌سازی مستقیم یک الگوریتم٬ کد در زمان اجرا دستورالعملی رو دریافت می‌کند که از کدام خانواده از الگوریتم‌ها استفاده کند.توضیحات ویکی‌ پدیا:الگوی استراتژی (همچنین به عنوان الگوی سیاست شناخته می‌شود) یک الگوی طراحی رفتاری نرم‌افزار است که قابلیت انتخاب یک الگوریتم در زمان اجرا را ممکن می‌سازد. الگوی استراتژی اجازه می‌دهد تا الگوریتم‌های متفاوت به‌طور مستقل از مشتریان استفاده‌کننده اجرا شوند. مراحل پیاده‌سازی الگوی استراتژی:یک خانواده از الگوریتم‌ها را معرفی می‌کنیم.هر الگوریتم را کپسوله می‌کنیم.باعث می‌شویم الگوریتم‌های آن خانواده به‌طور قابل تعویض٬ در زمان اجرا قابل استفاده باشند. حال برای مثال:همه می‌دانیم برای رسیدن به موفقیت در هر کاری٬ یک سری استراتژی‌ وجود دارد. اگر اشخاص مختلف رو در نظر بگیریم٬ هر شخص متد یا روش خودش را برای رسیدن به موفقیت دارد. ممکنه شخصی از هوش بالای خودش استفاده کند٬ و دیگری با تلاش زیاد و شخص دیگری با یادگیری مداوم به موفقیت دست پیدا کند و ...در نتیجه روش‌های (استراتژی‌های) کسب موفقیت با هم متفاوتند اما همگی یک خصوصیت مشترک دارند و آن هم: تمام این استراتژی‌ها به منظور دست‌یابی به یک هدف (موفقیت) اما با روش‌های مختلف طراحی می‌شوند. این روش‌ها همان خانوادهِ الگوریتم‌های ما هستند که ما هر کدام را در غالب یک کلاس نمایش می‌دهیم و کلاس App را برای تست عملکرد کدها به وجود می‌آوریم.و برای استفاده از کلاس هایی که ساختیم:آیا متوجه نقص کدهای بالا می‌شوید؟ فرض کنید در یک شرایط خاص ما نیاز داریم تا بجای خانواده الگوریتم HardWork , از الگوریتم Learning استفاده کنیم اما ما از قبل استراتژی HardWork را در درون متد سازنده کلاس اصلی اصطلاحا Hard-Code کردیم و کلاس App را مجبور به استفاده از مکانیزم منحصر بفردی کردیم. (راه رسیدن به موفقیت را تنها با روش تلاش زیاد پیاده‌سازی کرده‌ایم) و در نتیجه راه ساده‌ای برای تغییر این استراتژی در کلاس اصلی نداریم. پس مجبوریم کلاس اصلی را ویرایش کنیم و این کار خلاف قائده باز ـ بسته (Open–closed Principle) از سری قواعد ۵گانه سالید (پنج اصل اساسی برنامه‌نویسی و طراحی شیءگرا) است. پس چکار کنیم؟؟قائده باز - بسته: اجزای نرم‌افزار باید نسبت به توسعه باز (یعنی پذیرای توسعه باشد) و نسبت به اصلاح بسته باشند (یعنی پذیرای اصلاح نباشد). (یعنی مثلاً برای افزودن یک ویژگی جدید به نرم‌افزار نیاز نباشد که بعضی از قسمت‌های کد را بازنویسی کرد، بلکه بتوان آن ویژگی را مانند افزونه به راحتی به نرم‌افزار افزود) در واقع برای کلاس اصلی ما اهمیتی ندارد که ما دقیقا از چه راه و روشی به موفقیت میرسیم٬ کلاس اصلی ما تنها باید بداند که ما از روشی به این مهم دست پیدا می‌کنیم. چنین سناریویی دقیقا جایی است که الگوی طراحی استراتژی و پلی مورفیسم (Polymorphism) کارآیی دارند.حل مشکل با استفاده از الگوی طراحی استراتژی:یک اینترفیس (Interface) بوجود میاریم. در تمام خانواده الگوریتم‌ها الزام تبعیت از قرارداد (اینترفیس) رو بوجود میاریم. وابستگی تزریق‌شده در متد سازنده کلاس اصلی را٬ (که از خانواده الگوریتم‌هاست) با اینترفیس عوض می‌کنیم.پس کدی که باید داشته باشیم به این شکله: و حال در زمان اجرا خانواده الگوریتمی که میخواهیم از آن استفاده کنیم را به کلاس اصلی پاس میدهیم:با پیاده‌سازی الگوی طراحی استراتژی٬ دیگر کلاس اصلی ما محدود به استفاده از یک نوع عملکرد نیست و قائده باز و بسته (یک کلاس باید قابل توسعه و گسترش باشد اما غیر قابل ویرایش) نیز به درستی در کد ما اعمال شده است.نتیجه گیریبا استفاده از این الگو می‌توانیم به راحتی عملکردها و الگوریتم‌هایی را بدون ایجاد هرگونه اختلال در سایر بخش‌ها به نرم‌افزارمان اضافه و یا حذف کنیم.در موقعیت‌های زیر ٬ بهتر است از الگوی طراحی استراتژی استفاده کرد:کلاس‌هایی داریم که مربوط به انجام یک کار می‌شوند اما با روش‌های مختلف.زمانی که بخواهیم شرایط انتخاب الگوریتم را بوسیله کدنویسی مشخص کنیم.