Amir Mokarchi
Amir Mokarchi
خواندن ۳ دقیقه·۴ سال پیش

دیگه وقتشه استفاده از If-Else رو کنار بزاری

شما آموزش‌های بی شماری از دستورات If-Else شاهد بوده‌اید. همچنین احتمالاً شما کتابهای برنامه نویسی را نیز خوانده اید که استفاده از If-Else را به عنوان تکنیک منشعب سازی عملاً ترویج می کنند.

شاید حتی استفاده از If-Else حالت پیش فرض ذهنی شما باشد. اما ، بیایید با جایگزینی If-Else با اشیا state به این مساله خاتمه دهیم.

توجه داشته باشید که اگر در حال نوشتن کلاسی با متدهایی هستید که نیاز به اجرای آن با توجه به وضعیت فعلی داشته باشید، از این رویکرد استفاده خواهید کرد.

شما به راحتی می توانید رفتار اشیا را با استفاده از الگوی state به جای عبارات If-Else تغییر دهید.

به کد زیر دقت کنید:

منطق انشعاب در بالا حتی خیلی پیچیده نیست. اما سعی کنید شرط جدیدی اضافه کنید تا ببینید که همه چیز منفجر می شود.

نرم افزار بهتر بدون (If/Else) : 5 راه برای جایگزینی

" بسیار خوب، من متقاعد شده‌ام که If-Else بد است، حالا به من نشان بده که چطور از تقسیم‌بندی درهم و برهم کد اجتناب کنم."

بیایید یک کلاس Booking بسیار ساده ایجاد کنیم که دارای چند حالت است. همچنین دارای دو متد عمومی است: Accept و Cancel .

من حالت های مختلف رزرو بلیط رو به این صورت تصویر کردم

منطق Refactoring کد ما یک فرآیند سه‌مرحله‌ای است:

  • ایجاد یک کلاس state انتزاعی
  • هر حالت را به عنوان یک کلاس جداگانه که از کلاس پایه مرحله قبل به ارث می برد پیاده سازی کنید
  • اجازه دهید کلاس رزرو شده یک متد private یا internal داشته باشد که کلاس پایه را به عنوان یک پارامتر در نظر بگیرد

زمان نمایش

اول از همه ، ما به یک کلاس پایه نیاز داریم که همه state ها از آن به ارث می برند.

توجه کنید که چگونه این کلاس پایه دارای دو متد Accept و Cancel است - اگرچه در اینجا internal مشخص شده اند.

علاوه بر این ، کلاس پایه، یک متد "ویژه" EnterState(Booking booking) دارد. هر زمان که state جدیدی به شی book اختصاص داده شود ، فراخوانی می شود.

ثانیا ، ما برای هر state که می خواهیم نمایندگی کنیم کلاسهای جداگانه ای در نظر می گیریم.

توجه کنید که چگونه هر کلاس یک state را نشان می‌دهد همانطور که در نمودار زیبای بالا توضیح داده شد. همچنین، CancelledState اجازه انتقال به یک state جدید را نخواهد داد. این کلاس بسیار شبیه به الگوی Null Object است.
سرانجام خود کلاس booking به این شکل خواهد بود.

ببینید چگونه کلاس booking به سادگی اجرای Accept و Cancel را به state object خود واگذار می کند؟

انجام این کار به ما امکان می دهد بسیاری از منطق های شرطی را حذف کنیم و به هر state اجازه می دهیم فقط بر روی آنچه برای خود مهم است تمرکز کند - state فعلی همچنین این امکان را دارد که booking را به state جدید منتقل کند.

چگونه با ویژگی های شرطی جدید کنار بیاییم؟

اگر ویژگی جدید به طور معمول با استفاده از برخی بررسی های مشروط اجرا می شد ، اکنون می توانید فقط یک کلاس state جدید ایجاد کنید.

به همین سادگی. دیگر نیازی به کار با عبارت های نامطلوب if-else نیست.

چگونه می توانم state object را در یک پایگاه داده ادامه دهم؟

تو این کار رو نمی‌کنی.تنها دانستن state object و چگونگی نگاشت آن به ستون مهم است.شما می‌توانید یک state را با یک نوع ، یک enum یا یک عدد صحیح نگاشت کنید. یا هر چیزی که با آن راحت هستی، تا وقتی که راهی برای تبدیل مقدار ذخیره‌شده به یک state object داشته باشید.

آیا این تعداد کلاس های اضافی، زیاد نیست؟

در واقع. همانطور که در مقاله دیگری اشاره کردم ، پیچیدگی از تعداد کلاسهایی که شما تشکیل می دهید ناشی نمی شود ، بلکه از مسئولیتهایی است که کلاسها بر عهده دارند. داشتن کلاسهای بسیار زیاد ، کد شما را قابل خواندن ، نگهداری و به طور کلی کار با آن لذت بیشتری می بخشد.


برگرفته شده از مدیوم Nicklas Millard



best practicessoftware developmentprogrammingrefactoringcsharp
DotNet Developer
شاید از این پست‌ها خوشتان بیاید