Modo più leggibile di scrivere semplice controllo condizionale
-
18-09-2019 - |
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?
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 #)