Domanda

Quale sarebbe il / modo migliore più leggibile per scrivere un controllo condizionale multipla, come illustrato di seguito?

Due possibilità che mi veniva in mente (questo è Java, ma la lingua non importa qui):

Opzione 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);
   }

Opzione 2:

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

Quello che non mi piace di opzione 2 è che la linea avvolge e poi rientro diventa un dolore. Quello che non mi piace circa l'opzione 1 è che crea le variabili per niente e richiede guardando due posti.

Allora, cosa ne pensi? Qualsiasi altro Opzioni?

È stato utile?

Soluzione

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


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

ecc.

Altri suggerimenti

Si noti che l'opzione 1 non consente per il comportamento circuito breve. Cioè, si calcola il valore di tutti i condizionali prima di valutare il risultato della prima.

Vorrei modificare l'opzione 1 in modo che si sta utilizzando i nomi delle variabili che in realtà hanno un significato. Cioè, modificare il nome di "c2" essere qualcosa come "stationIDIsEmpty" (e spostare il NOT nella condizionale). In questo modo il condizionale è leggibile senza dover sguardo avanti e indietro per ogni variabile.

Quindi, il mio codice sarebbe probabilmente simile a:

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

Ho votato per la risposta di Chris Brandsma.

Ma voleva solo parlare del problema principale che ho con l'opzione 1 è che si stanno perdendo il beneficio di &&. Con l'opzione uno, anche se penso che sia più leggibile, si stanno elaborando i confronti in cui non può essere richiesto.

Personalmente, mi piace il secondo modo, perché trovo che l'uso di questo modo può fare la predicazione dei condizionali chiara. Vale a dire, con quel metodo fatto correttamente, è possibile effettuare la comprensibile condizionale "verablizing" è (anche se non si parla in realtà è irrilevante).

Cioè, con la seconda opzione, diventa chiaro che la condizione si traduce approssimativamente come questo: "Se la lunghezza della password è maggiore di zero, e lo stationIDTextField (tagliati) non è vuoto, ed l'usernameTextField (tagliati) NON è vuoto, allora ... "

Io preferisco il seguente:

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

Con questo stile di codifica compire due cose:

  • I può facilmente vedere che ogni riga in più del se è parte della condizione a causa del && (o ||) al beggining.
  • posso facilmente vedere dove l'istruzione if termina a causa della {alla riga successiva.

Option1 è primo per applicare il refactoring ' Sostituire Temp con Query '. Il motivo è che qualcuno può roba in codice tra la variabile è inizializzata e il controllo e modificare il comportamento del codice. O il controllo potrebbe essere effettuato con i valori aggiornati .. un aggiornamento è stato fatto per le textfields tra inizializzazione e controllo.

Quindi il mio tentativo di questo sarebbe

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

FieldHelper è una classe con metodi statici pubblici (chiamati anche una classe di utilità / classe statica in C #)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top