2009-11-25 7 views
4

Le but du code ci-dessous est de déterminer si une date donnée est considéré comme un « week-end » soit après 24:00 le jeudi, 2 jours minimum et avant lundi 24:00C# Commutateur Déclaration refactorisation

Est il y a une meilleure façon? Si-Else devient laid et le modèle de stratégie est beaucoup trop de travail pour cela.

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

En plus de refactoring du code dupliqués dans sa propre méthode comme indiqué ci-dessous, je suis grand fan d'utiliser une approche plus fonctionnelle de la solution. Isolez votre logique pour chaque jour dans sa propre fonction spécifique, puis créez une carte qui a des jours comme clés et la méthode appropriée comme valeurs. Avec une combinaison de mettre vos dates de ramassage dans leurs propres méthodes comme je l'ai dit ci-dessus, puis en utilisant lamdas pour faire votre logique de sortie, je pense que le code devient nettement plus propre. –

Répondre

6

Vous devez certainement factoriser le dropoffDate out - parce que le code est dupliqué 3 fois! Le nettoyage plus simple: j'introduire une fonction de vérifier la pickupDate et un autre pour vérifier l'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; 

} 

Et maintenant votre fonction principale est un 2 revêtement:

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

Assez sûr que cela va vérifier pour 12 heures pas 12 heures – James

+0

@Grzenio: La fonction IsWeekendDropOff ne devrait-elle pas avoir samedi comme jour pour Drop OFf? Considérant que PickUpDate est 1300 heures jeudi, la date de tombée peut être samedi 14 heures. –

+0

Voir http://msdn.microsoft.com/fr-fr/library/system.datetime.hour.aspx spécifiquement "La composante heure, exprimée comme une valeur comprise entre 0 et 23" – James

3

Je pense que vous pouvez extraire une méthode ici:

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

Vous avez besoin d'un 'return false'. à la fin; sinon, tous les chemins ne renverront pas de valeur. Alternativement, déplacez simplement le 'return false'. vous avez en dehors de l'interrupteur. – Gorpik

+1

@Gorpik, le cas par défaut prend soin de cela. Chaque chemin retournera en fait une valeur. –

+0

Est-ce que samedi ne devrait pas être un cas dans ce code? S'il vous plaît laissez-moi savoir ce code fonctionnera en cas PickUpDate: Jeudi 1300 Hr et Drop Date: Samedi 1400 Hr? –

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

Pas beaucoup plus claire, mais ici vous allez:

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

Ma première fissure:

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

dans le commutateur essayer

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

je le ferais quelque chose comme ça

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

Voici mon coup de couteau à elle:

/// <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; 
    }