محمد جواد فخار
محمد جواد فخار
خواندن ۴ دقیقه·۵ سال پیش

پیاده سازی Feature toggle در سوئیفت

اگر تصمیم دارید از Feature toggle در پروژه های ios خود استفاده کنید، حتما این مقاله رو بخونید. چند وقت پیش تصمیم گرفته شد که از این امکان در پروژه استفاده بشه. امروز فرصت کردم تا بررسی کنم و سایت هایی رو بخونم. گفتم نتیجه اشو برای شما بنویسم. نتیجه ای که قطعا در اجرای شما تاثیر خواهد داشت.

وقتی میخواهید شروع کنید به پیاده سازی، باید به این فکر کنید که بهترین روش برای توسعه یک امکان جدید چیه؟ در این موارد یک مثال ساده بهترین راه برای رسید به بهترین روش هست.

در گیف زیر تکه کدی از یک کلاس رو دیدم که خیلی گویا هست.

در تصویر بالا جابجایی بین دو اکشن مختلف، با true یا false بودن یک مقدار صورت میگیره. با بررسی این مثال ساده میتونید مشکلات پیاده سازی استخراج کنیم.

اول اینکه استفاده از if-else در فایل ها و کلاس های مختلف باعث میشه فهم و خوانایی کد پایین بیاد.

دوم اینکه اگر فرض کنیم شرط Toggles.Vehicle.carsCanFly در بیش از یک فایل و کلاس استفاده بشه، چون Feature toggle باید به راحتی از سورس حذف بشه بدون اینکه به سایر بخش لطمه ای بزنه، پس بایستی به گونه ای طراحی و پیاده سازی بشه که این نوع مشکلات رو ایجاد نکنه.

یکی از راه هایی که میتونه دو نکته ی بالا رو حل کنه استفاده از پروتکل (POP) برای پیاده سازی Feature toggle هست. به تکه کد زیر توجه کنید:

protocol CarFleetFeatureToggleLogic {
var fuelToUse: Fuel { get }
func transport(car: Car, to position: Position)
}

extension CarFleetFeatureToggleLogic where Self: CarFleet {
/**
Get the fuel to be used on cars.
- Toggle Options:
- Toggle on: return fuel type for rockets.
- Toggle off: return fuel type for cars.
*/
var fuelToUse: Fuel {
switch Toggles.Vehicle.carsCanFly.enabled {
case true : Fuel.rocket
case false : Fuel.car
}
}

/**
Transport cars to their destination.
- Toggle Options:
- Toggle on: Fly cars to destination.
- Toggle off: Drive cars to destination.
*/
func transport(car: Car, to position: Position) {
switch Toggles.Vehicle.carsCanFly.enabled {
case true : fly(to: location)
case false : drive(to: location)
}
}
}

به اکستنشن بخش دوم کد بالا دقت کنید. هر وقت از اکستنشنی به صورت where Self: x استفاده می کنید، یعنی برای کلاس x به صورت پیش فرض توسعه یا پیاده سازی انجام شده است.

اصلاح شده ی مثال اول به صورت کد زیر پیاده سازی می شود:

class CarFleet{

//init class

}

extension CarFleet: CarFleetFeatureToggleLogic {
func moveCarsToPosition(cars: [Car], position: Position) {
cars.forEach({ transport(car: $0, to: position) })
}

func refuel(cars: [Car]) {
cars.forEach({ refuel(car: $0, using: fuelToUse) })
}

func refuel(car: Car, using: Fuel) {
}
}

برای حذف این Feature toggle کافیه این extension و پروتکل را از پروژه حذف کنید.


نتیجه گیری

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

از دوستان تقاضا دارم اگر تجربیاتی در این خصوص دارن حتما کامنت بذارن و به همه منتقل کنند.

swiftiosسوئیفتبرنامه نویسی
توسعه دهنده وب و iOS
شاید از این پست‌ها خوشتان بیاید