6

Was wäre der beste Weg, um eine mehrfache bedingte Prüfung wie unten gezeigt zu schreiben?Der einfachste Weg, um eine einfache bedingte Prüfung zu schreiben

Zwei Möglichkeiten, die ich mir vorstellen könnte (das ist Java aber die Sprache ist wirklich egal, hier):

Option 1:

boolean c1 = passwordField.getPassword().length > 0; 
    boolean c2 = !stationIDTextField.getText().trim().isEmpty(); 
    boolean c3 = !userNameTextField.getText().trim().isEmpty(); 

    if (c1 && c2 && c3) { 
     okButton.setEnabled(true); 
    } 

Option 2:

if (passwordField.getPassword().length > 0 && 
     !stationIDTextField.getText().trim().isEmpty() && 
     !userNameTextField.getText().trim().isEmpty() { 
     okButton.setEnabled(true); 
    } 

Was ich an Option 2 nicht mag, ist, dass die Zeilenumbrüche und dann die Einrückung ein Schmerz wird . Was ich an Option 1 nicht mag, ist, dass es Variablen für nichts schafft und zwei Orte betrachtet.

Also was denkst du? Irgendwelche andere Optionen?

+1

Die modernen IDs haben Auto-ID-Tools, also warum Botter? – fbinder

Antwort

26
if (HasPassword() && HasStation() && HasUserName()) 
    okButton.setEnabled(true); 


bool HasPassword() { 
return passwordField.getPassword().length > 0; 
} 

usw.

4

Ich würde Option 1 ändern, so dass Sie Variablennamen verwenden, die tatsächlich eine Bedeutung haben. Das heißt, ändern Sie den Namen von "c2" zu etwas wie "stationIDIsEmpty" (und verschieben Sie das NOT in die Bedingung). Auf diese Weise ist die Bedingung lesbar, ohne für jede Variable hin und her blicken zu müssen.

So würde mein Code wahrscheinlich wie folgt aussehen:

boolean enteredPassword = passwordField.getPassword().length > 0; 
boolean stationIDIsEmpty = stationIDTextField.getText().trim().isEmpty(); 
boolean userNameIsEmpty = userNameTextField.getText().trim().isEmpty(); 

if (enteredPassword && !stationIDIsEmpty && !userNameIsEmpty) { 
    okButton.setEnabled(true); 
} 
1

Persönlich mag ich die zweite Art und Weise, weil ich finde, dass auf diese Weise mit der Aussage der conditionals machen klar. Das heißt, mit dieser Methode können Sie die Bedingung nachvollziehbar machen, indem Sie sie "verablizen" (unabhängig davon, ob Sie sie tatsächlich sprechen oder nicht).

Das heißt, mit Ihrer zweiten Option wird klar, dass Ihre Bedingung ungefähr wie folgt lautet: "Wenn die Passwortlänge größer als Null ist, UND ist die stationIDTextField (getrimmt) NICHT leer, UND die usernameTextField (getrimmt) ist nicht leer ist, dann ...“

1

ziehe ich folgende:

if (passwordField.getPassword().length > 0 
    && ! stationIDTextField.getText().trim().isEmpty() 
    && ! userNameTextField.getText().trim().isEmpty()) 
{ 
    okButton.setEnabled(true); 
} 

Mit dieser Art der Programmierung zu erreichen ich zwei Dinge:

  • ich einfach, dass jeder zusätzlichen sehen Linie der if ist Teil der Bedingung wegen der & & (oder ||) am Anfang.
  • Ich kann leicht sehen, wo die if-Anweisung wegen der {in der nächsten Zeile endet.
1

Option1 ist die Primzahl für das Refactoring 'Replace temp with Query'. Der Grund dafür ist, dass jemand Code zwischen die Variable stopfen kann und das Verhalten des Codes überprüft und ändert. Oder die Überprüfung könnte mit veralteten Werten erfolgen. Es wurde eine Aktualisierung der Textfelder zwischen Initialisierung und Überprüfung vorgenommen.

Also an diese mein Versuch

if (GetPasswordLength() > 0 
    && FieldHelper.IsNotEmpty(stationIDTextField) 
    && FieldHelper.IsNotEmpty(userNameTextField) 
{ 
    okButton.setEnabled(true); 
} 

FieldHelper ist eine Klasse mit öffentlichen statischen Methoden (auch eine Utility-Klasse/Static Klasse in C# genannt)

6

Beachten Sie, dass Option erlaubt 1 nicht wäre, Kurzschlussverhalten. Das heißt, Sie berechnen den Wert aller Bedingungen, bevor Sie das Ergebnis des ersten bewerten.

3

Ich wählte für Chris Brandsma die Antwort.

Aber wollte nur das Hauptproblem erwähnen, das ich mit Option 1 habe, ist, dass Sie den Vorteil von & & verlieren. Mit Option eins, obwohl ich denke, dass es lesbarer ist, verarbeiten Sie Vergleiche, wenn sie nicht erforderlich sind.

+1

Siehe http://en.wikipedia.org/wiki/Short-circuit_evaluation –