2009-04-28 46 views
6

Quale sarebbe il modo più leggibile/migliore per scrivere un controllo condizionale multiplo come mostrato di seguito?Il modo più leggibile per scrivere un semplice controllo condizionale

Due possibilità che mi veniva in mente (questo è Java, ma la lingua in realtà 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 dell'opzione 2 è che la linea si avvolge e quindi l'indentazione diventa un dolore . Quello che non mi piace dell'opzione 1 è che crea variabili per niente e richiede di guardare in due punti.

Quindi cosa ne pensi? Qualsiasi altro opzioni?

+1

I moderni id hanno strumenti di identificazione automatica, quindi perché botter? – fbinder

risposta

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


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

ecc

4

Vorrei modificare l'opzione 1 in modo da utilizzare nomi di variabili che effettivamente hanno un significato. Cioè, cambia il nome di "c2" in qualcosa come "stationIDIsEmpty" (e sposta il NOT nel condizionale). In questo modo il condizionale è leggibile senza dover guardare avanti e indietro per ogni variabile.

Quindi il mio codice sarebbe probabilmente simile:

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

Personalmente, mi piace il secondo modo, perché trovo che l'uso di questo modo può fare la predicazione dei condizionali chiaro. Cioè, con quel metodo fatto correttamente, puoi rendere comprensibile il condizionale "verificandolo" (indipendentemente dal fatto che tu lo parli in realtà è irrilevante).

Cioè, con la tua seconda opzione, diventa chiaro che il tuo condizionale si traduce approssimativamente come questo: "Se la lunghezza della password è maggiore di zero, AND stationIDTextField (tagliato) NON è vuoto, AND il nomeutenteTextField (tagliato) è non vuoto, allora ..."

1

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:

  • posso facilmente vedere che ogni ulteriore linea del if è parte della condizione a causa dello & & (o ||) all'inizio.
  • Posso facilmente vedere dove finisce l'istruzione if a causa della {alla riga successiva.
1

L'opzione 1 è ottimale per applicare il refactoring "Replace temp with Query". La ragione per cui qualcuno può inserire del codice tra la variabile è inizializzata e il controllo e modifica il comportamento del codice. O il controllo potrebbe essere fatto con valori scaduti .. un aggiornamento è stato fatto ai campi di testo tra l'inizializzazione e il 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#)

6

Si noti che l'opzione 1 non consente comportamento di cortocircuito. Cioè, si calcola il valore di tutti i condizionali prima di valutare il risultato del primo.

3

Ho votato per la risposta di Chris Brandsma.

Ma volevo solo menzionare il problema principale che ho con l'opzione 1, stai perdendo il vantaggio di & &. Con l'opzione uno, anche se penso sia più leggibile, stai elaborando confronti quando potrebbero non essere richiesti.

+1

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

Problemi correlati