2009-11-25 99 views
4

下面的代码的目的是确定某一特定日期下午12:00周四后有资格作为“周末”,即最少2天前周一下午12:00C#的switch语句重构

是有更好的方法吗?如果 - 其他人变得丑陋,战略模式对于这一点太过分了。

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; 
    } 
+0

除了重构代码复制到自己的方法,下面列出的,我是一个使用功能更强大的解决方案的忠实粉丝。将你每天的逻辑分解成它自己的特定功能,然后建立一个有几天作为关键字和适当的方法作为值的地图。如上所述,将您的提取日期放入自己的方法中,然后使用lamdas执行放弃逻辑,我认为代码变得更加清晰。 – 2009-11-25 15:56:00

回答

6

你一定要重构dropoffDate出来 - 因为代码重复了3次!最简单的清理:我想介绍一个函数来检查pickupDate,另一个检查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; 

} 

现在你的主要功能是一个2班轮:

if (ts.TotalDays >= 2 && ts.TotalDays <= 4) 
{ 
    return IsPickupWeekend(pickupDate) && IsWeekendDropOff(dropoffDate); 
} 
+0

很确定这将检查12 AM而不是12 PM – James 2009-11-25 15:50:26

+0

@Grzenio:不应该IsWeekendDropOff函数有星期六为Drop OFf的一天吗?考虑到PickUpDate星期四是1300小时,那么下落日期可以是星期六1400HR。 – 2009-11-25 15:54:46

+0

具体参见http://msdn.microsoft.com/en-us/library/system.datetime.hour.aspx“小时组件,表示为0到23之间的值” – James 2009-11-25 15:55:20

3

我想你可以在这里提取方法:

private bool ValidateDropoff(DateTime dropoffDate) 
{ 
    switch (dropoffDate.DayOfWeek) 
    { 
     case DayOfWeek.Sunday: 
      return true; 
     case DayOfWeek.Monday: 
      return dropoffDate.Hour <= 12; 
     default: 
      return false; 
    } 
} 
+0

您需要'返回false';最后;否则,不是每个路径都会返回一个值。或者,只需移动'return false;'你在交换机之外。 – Gorpik 2009-11-25 15:38:35

+1

@Gorpik,默认情况下,照顾这一点。实际上每条路径都会返回一个值。 – 2009-11-25 15:40:44

+0

这个代码不应该是星期六吗?请让我知道此代码的工作情况PickUpDate:周四1300小时和下落日期:周六1400小时? – 2009-11-25 16:13:03

1
if (ts.TotalDays >= 2 && ts.TotalDays <= 4) 
{ 
    var hour_limit = new Func<Boolean>(() => { 
     switch (dropoffDate.DayOfWeek) 
     { 
      case DayOfWeek.Sunday: 
       return true; 
      case DayOfWeek.Monday: 
       return dropoffDate.Hour <= 12; 
      default: 
       return false; 
     } 

    }); 

    switch (pickupDate.DayOfWeek) 
    { 
     case DayOfWeek.Thursday: 
      if (pickupDate.Hour >= 12) return hour_limit(); 
      break; 
     case DayOfWeek.Friday: 
     case DayOfWeek.Saturday: 
      return hour_limit(); 
     default: 
      break; 
    } 
} 

return false; 
0

不多清晰,但在这里你去:

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: 
          return dropoffDate.Hour <= 12; 
        } 
       } 
       break; 
      case DayOfWeek.Friday: 
       switch (dropoffDate.DayOfWeek){ 
        case DayOfWeek.Sunday: 
         return true; 
        case DayOfWeek.Monday: 
         return dropoffDate.Hour <= 12; 
       } 
       break; 
      case DayOfWeek.Saturday: 
       switch (dropoffDate.DayOfWeek){ 
        case DayOfWeek.Sunday: 
         return true; 
        case DayOfWeek.Monday: 
         return dropoffDate.Hour <= 12; 
       } 
       return false; 
     } 
    } 
    return false; 
} 
0

我第一次破裂:

if (ts.TotalDays >= 2 && ts.TotalDays <= 4) 
     { 
      switch (pickupDate.DayOfWeek) 
      { 
       case DayOfWeek.Thursday: 
       case DayOfWeek.Friday: 
       case DayOfWeek.Saturday: 
        if (pickupDate.DayOfWeek == DayOfWeek.Thursday && pickupDate.Hour <= 12) 
         return false; 

        switch (dropoffDate.DayOfWeek) 
        { 
         case DayOfWeek.Sunday: 
          return true; 
         case DayOfWeek.Monday: 
          return dropoffDate.Hour <= 12; 
        } 
        return false; 

       default: 
        return false; 
      } 
     } 
     return false; 
0

在开关尝试

retrun (dropoffDate.DayOfWeek == DayOfWeek.Sunday && dropoffDate.Hour <= 12 || dropoffDate.DayOfWeek == DayOfWeek.Sunday) 
0

我会做这样的事情

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) 
       { 
        reurn DayOfWeek(dropOffDate.DayOfWeek); 
       } 
       break; 
      case DayOfWeek.Friday, DayOfWeek.Saturday: 
       { 
        return DayOfWeek(dropOffDate.DayOfWeek); 
       } 
     } 
    } 
    return false; 
} 

public bool DayOfWeek(DateTime dropOffDate) 
    { 
switch (dropoffDate.DayOfWeek) 
    { 
     case DayOfWeek.Sunday: 
      { 
       return true; 
      } 
     case DayOfWeek.Monday: 
      { 
       if (dropoffDate.Hour <= 12) 
        { 
         return true; 
        } 
       return false; 
      } 
     return false; 
    } 
} 
0

这里是我的刺吧:

/// <summary> 
    /// Gets the weekend days. 
    /// </summary> 
    /// <returns></returns> 
    public List<DayOfWeek> GetWeekendDays() 
    { 
     List<DayOfWeek> days = new List<DayOfWeek>() 
            { 
             DayOfWeek.Thursday, 
             DayOfWeek.Friday, 
             DayOfWeek.Sunday 
            }; 
     return days; 
    } 

    /// <summary> 
    /// Validates the weekend. 
    /// </summary> 
    /// <param name="pickupDate">The pickup date.</param> 
    /// <param name="dropoffDate">The dropoff date.</param> 
    /// <returns></returns> 
    public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) 
    { 
     bool isValid = false; 
     TimeSpan ts = dropoffDate.Subtract(pickupDate); 

     if (ts.TotalDays >= 2 && ts.TotalDays <= 4) 
     { 
      List<DayOfWeek> days = GetWeekendDays(); 

      foreach (DayOfWeek day in days) 
      { 
       if(pickupDate.DayOfWeek == day) 
       { 
        isValid = ValidateDropOff(dropoffDate); 
        break; 
       } 
      } 
     } 

     return isValid; 
    } 

    /// <summary> 
    /// Validates the drop off. 
    /// </summary> 
    /// <param name="dropoffDate">The dropoff date.</param> 
    /// <returns></returns> 
    private static bool ValidateDropOff(DateTime dropoffDate) 
    { 
     bool isValidDropOff = (dropoffDate.DayOfWeek == DayOfWeek.Sunday); 

     if(dropoffDate.DayOfWeek == DayOfWeek.Monday) 
     { 
      if (dropoffDate.Hour <= 12) 
      { 
       isValidDropOff = true; 
      } 
     } 

     return isValidDropOff; 
    } 
0
private readonly TimeSpan Midday = new TimeSpan(12, 0, 0); 

    public bool ValidateWeekend(DateTime pickupDate, DateTime dropoffDate) 
    { 
     TimeSpan lengthOfTrip = dropoffDate.Subtract(pickupDate); 

     if (lengthOfTrip.TotalDays < 2 || lengthOfTrip.TotalDays > 4) 
      return false; 

     return IsPickupDateConsideredWeekend(pickupDate) && IsDropoffDateConsideredWeekend(dropoffDate); 
    } 

    private bool IsPickupDateConsideredWeekend(DateTime pickupdate) 
    { 
     if (pickupdate.DayOfWeek == DayOfWeek.Thursday && pickupdate.TimeOfDay > Midday) 
      return true; 
     return false; 
    } 

    private bool IsDropoffDateConsideredWeekend(DateTime dropoffDate) 
    { 
     if (dropoffDate.DayOfWeek == DayOfWeek.Monday && dropoffDate.TimeOfDay <= Midday) 
      return true; 
     return false; 
    }