C# Switch Statement refactoring
c#, refactoring, switch-statement
Solution
You definitely should refactor the dropoffDate out - because the code is duplicated 3 times! The simplest cleanup: I would introduce a function to check the pickupDate and another to check the dropoffDate:
private bool IsPickupWeekend(DateTime pickupDate)
{
switch (pickupDate.DayOfWeek)
{
case DayOfWeek.Thursday:
return pickupDate.Hour >= 12;
case DayOfWeek.Friday:
case DayOfWeek.Saturday:
return true;
}
}
return false;
}
private bool IsWeekendDropOff(DateTime dropoffDate)
{
switch (dropoffDate.DayOfWeek)
{
case DayOfWeek.Sunday:
return true;
case DayOfWeek.Monday:
if (dropoffDate.Hour <= 12)
{
return true;
}
return false;
}
return false;
}
And now your main function is a 2 liner:
if (ts.TotalDays >= 2 && ts.TotalDays <= 4)
{
return IsPickupWeekend(pickupDate) && IsWeekendDropOff(dropoffDate);
}
Problem
The purpose of the code below is to determine if a particular date qualifies as a "weekend" i.e after 12:00 PM on Thursday, minimum 2 days and before Monday 12:00 PM Is there a better way? If-Else turns ugly and the Strategy pattern is way too much work for this. ``` public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) { TimeSpan ts = dropoffDate.Subtract(pickupDate); if (ts.TotalDays >= 2 && ts.TotalDays <= 4) { switch (pickupDate.DayOfWeek) { case DayOfWeek.Thursday: if (pickupDate.Hour >= 12) { switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } } break; case DayOfWeek.Friday: switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } break; case DayOfWeek.Saturday: switch (dropoffDate.DayOfWeek) { case DayOfWeek.Sunday: return true; case DayOfWeek.Monday: if (dropoffDate.Hour <= 12) { return true; } return false; } return false; } } return false; } ```