2009-04-28 17 views
6

¿Cuál sería la forma más legible/mejor para escribir una verificación condicional múltiple tal como se muestra a continuación?Forma más legible para escribir verificación condicional simple

dos posibilidades que se me ocurrió (esto es Java, pero el lenguaje realmente no importa aquí):

Opción 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); 
    } 

Opción 2:

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

Lo que no me gusta de la opción 2 es que la línea se envuelve y luego la sangría se convierte en un dolor . Lo que no me gusta de la opción 1 es que crea variables para nada y requiere mirar dos lugares.

¿Qué opinas? Cualquier otras opciones?

+1

Los ides modernos tienen herramientas de autoidentificación, entonces ¿por qué botter? – fbinder

Respuesta

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


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

etc.

4

Me gustaría modificar la opción 1 para que esté utilizando nombres de variables que realmente tienen un significado. Es decir, cambie el nombre de "c2" para que sea algo así como "stationIDIsEmpty" (y mueva el NOT al condicional). De esta forma, el condicional es legible sin tener que mirar hacia adelante y hacia atrás para cada variable.

Así que mi código, probablemente se vería como:

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, me gusta la segunda manera, porque me parece que el uso de esa manera puede hacer que la predicación de los condicionales claro. Es decir, con ese método hecho correctamente, puede hacer que el condicional sea comprensible al "vetarlo" (ya sea que lo hable o no, es irrelevante).

Es decir, con su segunda opción, queda claro que su condicional se traduce aproximadamente así: "Si la longitud de la contraseña es mayor que cero, Y el campo stationIDText (recortado) NO está vacío, Y el nombre de usuarioTextField (recortado) es no está vacío, entonces ..."

1

yo prefiero el siguiente:

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

Con este estilo de codificación puedo lograr dos cosas:

  • puedo ver fácilmente que cada uno adicional línea del if es parte de la condición debido a & & (o ||) al principio.
  • Puedo ver fácilmente dónde termina la instrucción if debido a {en la siguiente línea.
1

La opción 1 es la mejor para aplicar la refactorización 'Replace temp with Query'. El motivo es que alguien puede ingresar el código entre la variable que se inicializa y la marca y cambiar el comportamiento del código. O la verificación puede hacerse con valores obsoletos ... se ha realizado una actualización en los campos de texto entre la inicialización y la verificación.

Así que mi intento de esto sería

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

FieldHelper es una clase con métodos estáticos públicos (también llamadas a/clase estática clase de utilidad en C#)

6

Note que la opción 1 no permite comportamiento de cortocircuito. Es decir, se calcula el valor de todos los condicionales antes de evaluar el resultado del primero.

3

He votado a favor la respuesta de Chris Brandsma.

Pero solo quería mencionar el problema principal que tengo con la Opción 1 es que está perdiendo el beneficio de & &. Con la opción uno, aunque creo que es más legible, está procesando comparaciones cuando puede que no sean necesarias.

+1

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

Cuestiones relacionadas