2017-08-23 2 views
0

Schreiben Angenommen, der Benutzer ganz oder teilweise ein Datum eingeben {Tag, Monat, Jahr}Cleanly zahlreiche Bedingungen gegen einen optionalen Eingang

Jedes Feld ist optional. Sie können nur den Tag, oder nur den Monat, oder den Tag und den Monat etc. eingeben.

Ich dann eine Liste von Daten durchlaufen, und überprüfen Sie, ob die Daten übereinstimmen, basierend auf was der Benutzer eingegeben hat (und je nachdem, wie viel davon traten sie):

Input: {D = 20} CheckDate: 2015/01/20 = true 
Input: {D = 20} CheckDate: 2015/01/15 = false 
Input: {D = 20, Month = 6} CheckDate: 2015/06/20 = true 
Input: {D = 20, Month = 6} CheckDate: 2015/01/20 = false 
Input: {D = 20, Month = 6, Year = 2016} CheckDate: 2016/06/20 = true 
Input: {D = 20, Month = 6, Year = 2016} CheckDate: 2015/06/20 = false 

ich durch Überprüfung jede mögliche Kombination von Eingabedatum vor dem Anreisedatum wie so diese Logik erreichen kann:

private bool IsInputDateMatch(InputDate inputDate, DateTime date) 
    { 
     if (inputDate.Day != 0 && inputDate.Month != 0 && inputDate.Year != 0) 
      return date.Day == inputDate.Day && date.Month == inputDate.Month && date.Year == inputDate.Year; 

     if(inputDate.Day !=0 && inputDate.Month != 0) 
      return date.Day == inputDate.Day && date.Month == inputDate.Month; 
     if (inputDate.Day != 0 && inputDate.Year != 0) 
      return date.Day == inputDate.Day && date.Year == inputDate.Year; 
     if (inputDate.Month != 0 && inputDate.Year != 0) 
      return date.Month == inputDate.Month && date.Year == inputDate.Year; 

     if (inputDate.Day != 0) 
      return date.Day == inputDate.Day; 
     if (inputDate.Month != 0) 
      return date.Month == inputDate.Month; 
     if (inputDate.Year != 0) 
      return date.Year == inputDate.Year; 

     return true; 
    } 

Aber das ist nicht sehr elegant.

Wenn Sie auf eine logische Situation wie diese stoßen (Überprüfung mehrerer Bedingungen basierend darauf, wie viel von etwas bereitgestellt wird), wie könnte es in einem sauberen Ansatz geschrieben werden? Kann ich vielleicht die erforderlichen Bedingungen dynamisch generieren?

+1

Es gibt einen Ausdruck, [Müll in Müll raus] (https://en.wikipedia.org/wiki/Garbage_in,_garbage_out). Ich denke, das könnte hier gelten, besonders wenn Sie nur Teile eines Datums zulassen. Konzentrieren Sie sich darauf, den Code zu ändern, in dem die Daten eingereicht werden (unabhängig davon, was dieser Eingabestream ist), und fügen Sie dort eine Validierung hinzu, um sicherzustellen, dass teilweise erforderliche Felder nicht zulässig sind (z. B. nur ein Monat eingeben, wenn ein ganzes Datum erwartet wird)? – Igor

+0

Sie können Zuordnungen in einer XML-Datei erstellen und dann basierend auf dem Ergebnis dieser Zuordnung eine bestimmte Logik aufrufen. –

Antwort

4

können Sie Ihren Code vereinfachen, wie folgt:

private bool IsInputDateMatch(InputDate inputDate, DateTime date) 
{ 
    if (inputDate.Day != 0 && date.Day != inputDate.Day) 
     return false; 

    if (inputDate.Month != 0 && date.Month != inputDate.Month) 
     return false; 

    return inputDate.Year == 0 || date.Year == inputDate.Year; 
} 
+0

Gut entdeckt zusammen mit Markos Antwort. Ich denke, das Muster ist: Wenn das Eingabefeld zur Verfügung gestellt wird, überprüfen Sie die Logik für dieses Feld (keine Berücksichtigung von Kombinationen). – FBryant87

0

Erstellen Sie die Methode in der Klasse InputDate. Es ist immer noch nicht sehr elegant, aber Sie müssen das nur einmal schreiben.

class InputDate 
{ 
    public bool IsMatch(DateTime date) 
    { 
     // real implementation here 
     return true; 
    } 
} 

Sie werden wahrscheinlich UnitTest die Hölle aus solchen Methoden wollen. Die Beispiele, die Sie in der Frage angegeben haben, wären allesamt gute Testkandidaten. Und jedes Mal, wenn Sie einen Fehler finden, fügen Sie einen neuen Test mit diesem Fall hinzu.

Sobald Sie die Tests installiert haben, können Sie den Methodenkörper einfach umstrukturieren und sicherstellen, dass alles weiterhin wie erwartet funktioniert.

1

Dies sollte etwas einfacher sein. Überprüfen Sie alle Teile, die zur Verfügung gestellt wurden und wenn etwas falsch ist, dann ist es kein Match. Wenn kein Teil mehr übrig ist, ist es sicherlich ein Match.

private bool IsInputDateMatch(InputDate inputDate, DateTime date) 
    { 
     if (inputDate.Day != 0 && date.Day != inputDate.Day) 
      return false; 
     if (inputDate.Month != 0 && date.Month != inputDate.Month) 
      return false; 
     if (inputDate.Year != 0 && date.Year != inputDate.Year) 
      return false; 

     return true; 
    } 

Zusätzlich könnten wollen Sie prüfen, ob ein Teil überhaupt submittied ist, aber ich erwarte, dass Sie dies überprüfen, vor dem Absenden.

+0

Ja, sollte es nicht? –

Verwandte Themen