2010-06-02 11 views
9

Si una variable puede tomar n valores, debemos verificar la validez de los valores o asumir que si todas las comprobaciones n-i fallan, sería el enésimo valor.Cuál es la forma más apropiada de programar

Por ejemplo si tenemos una variable que almacena el género como M o F. Utilice este:

If gender = "M" 
    do male_processing 
else 
    do female_processing 
endif 

O esto:

If gender = "M" 
    do male_processing 
else 
    if gender = "F" 
    do female_processing 
    else 
    print "Something has gone wrong Gender has a value " Gender 
    endif 

endif 
+2

Al publicar aquí, sangrar el código correctamente y luego formatearlo con el botón 1010 sobre el área de entrada de texto. –

+0

Lo siento, me di cuenta si después de presionar el envío. ¡Muchas gracias! – Raju

+1

Mientras tanto, en el mundo real, el género no es un valor booleano. Hay muchas personas de genderqueer por ahí. – TRiG

Respuesta

1

Para este tipo de construcción, me gusta usar la instrucción switch. No porque sea más corto (no lo es), pero es más fácil de leer (en mi humilde opinión):

switch(gender) { 
    case "M": 
    doMaleSpecificStuff(); 
    break; 
    case "F": 
    doFemaleSpecificStuff(); 
    break; 
    default: 
    throw AnyError; 
} 
4

Poco - que depende de qué tipo es la variable. Si es un booleano o una enumeración de algún tipo y no hay otro valor que pueda tener (incluido null), una simple cláusula else será suficiente.

incluso puede añadir un simple comentario de este modo:

if male: 
    do_male_stuff() 
else: #obviously female 
    do_female_stuff() 

Tener algo como esto sólo parece mal:

bool = SOME_BOOLEAN_VALUE 
if bool: 
    do1() 
elif not bool: 
    do2() 
else: 
    huh() #?!?! 

En pocas palabras: tienen una cláusula de if/else/else if para cada escenario posible, pero no más que eso, y mantenerlo legible.

0

Si es posible un tercer valor, que no sea M o F, debe usar el segundo formulario. Si la variable que se prueba es de un tipo que solo puede asumir los valores M y F, debe usar la primera.

+0

No necesariamente. Si es posible un valor (cualquiera) distinto de M o F, es posible que desee que "do_female_stuff()" sea la acción predeterminada, en cuyo caso, es probable que solo desee dos opciones ("M" u * otro *). Sin embargo, definitivamente querrías comentar que es un incumplimiento intencionado. – hemp

+0

Estoy tan contento de que no haya incluido una ilustración de esto. –

+0

@hemp Es obvio, a partir del segundo ejemplo del OP, que se supone que es congruente con el primero, que este no es el caso. –

2

... o, en el mundo OO, podría crear una clase base, digamos Gender y extenderla con las clases Male y Female. En lugar de asignar el valor 'M' o 'F' a una variable, puede asignar una instancia de clase masculina o femenina. Luego simplemente llame a un método especificado en la clase base, por ejemplo doGenderSpecificStuff(). No hay necesidad de si-elses allí.

+1

OP pregunta específicamente sobre las cláusulas if-else. Por supuesto, esto se puede hacer de una manera OO, pero esta no es la pregunta. –

+0

Entonces, ¿de qué sirve tener if-else? – VoodooChild

+1

@Yuval: Si el OP encuentra inapropiada esta respuesta, la eliminaré. Pero por favor, deje que el OP decida. – fish

10

Para ese ejemplo, yo no usaría en todo caso, estaría bien usar el interruptor para su segundo ejemplo

switch (gender) 
    case "M": 
     do male_processing 
     break 
    case "F": 
     do female_processing 
     break 
    default: 
     print "Something has gone wrong Gender has a value " Gender 
endswitch 

o para su primer ejemplo, me gustaría simplemente tratar excepciones como un error al usar ASSERT

assert (gender = "M" or gender = "F") 
+0

No todos los idiomas pueden "cambiar" en todos los tipos de variables ... Sin embargo, la mayoría de los lenguajes tienen construcciones if-else. –

+3

+1 - no para el interruptor, sino solo para tratar el tercer caso. Usted - ** DEBERÍA ** tratar el tercer caso - no importa si es un 'ELSE', 'DEFAULT',' ASSERT' o como lo haga. Compruébalo. Tu seguidor/yo futuro te lo agradecerá. – Konerak

1

Si los valores de Gendre sólo pueden ser 'M' o 'F', entonces se podría utilizar una aserción de dejar esto claro:

Assert(gender = "M" OR gender = "F") 
If gender = "M" 
    do male_processing 
else 
    do female_processing 
endif 
0

al enumerar las formas de manejar las diversas formas posibles de un tipo de datos, se debe utilizar la coincidencia de patrones si su idioma es compatible con ella o, si no lo está, cambia declaraciones (coincidencia de patrones de los pobres) La razón principal de esto es que, si el tipo de datos se amplía con más formas potenciales, se le advertirá en el momento de la compilación sobre una coincidencia incompleta de patrones (o instrucción de conmutación). Así puede descansar tranquilo sabiendo que, si se amplían los tipos de datos, lo sabrá más pronto que tarde.

Desafortunadamente, el uso de un caso predeterminado deshace dichos beneficios, por lo que en la mayoría de las situaciones debería preferir enumerar explícitamente todas las posibilidades conocidas.

0

Si hay una entrada de usuario para 'F' o 'M', entonces debe amenazar 3 escenarios, es decir. F, M y otros. Si no hay entradas de usuario, puede usar dos y tener un valor de bool, es decir. isMale para la declaración if por lo que sería mucho más legible.

1

Si usa el tipo enumerado, solo tendrá los valores que espera y no tendrá que lidiar con valores inesperados en el IF, solo en la asignación.

0

Intente verificar las entradas y normalizar lo antes posible, luego puede usar la primera opción de manera segura.

Si su interfaz de usuario permite que la entrada a esta variable sea cualquier cosa (por ejemplo, un cuadro de texto), en su ejemplo, puede obtener "M", "Hombre", "Hombre", "Niño" o "Männlich" "como posibles aportaciones honestas para hombres, antes incluso de considerar que alguien podría ofrecer una respuesta estúpida". Al verificar (y normalizar) estos valores antes de que necesite usarlos, puede ofrecer comentarios más receptivos al usuario.

Si su interfaz de usuario lo restringe a un botón de opción, se normalizará incluso antes.

Si el valor se obtiene de algún tipo de almacén de datos, entonces, dependiendo de la aplicación, y su conocimiento de la integridad de ese almacén de datos, puede haber o no valor para verificar la validez del registro antes de actuando sobre los valores contenidos dentro.

Si es probable que la mayoría de los registros se ajusten, y las acciones que invocan varios valores son baratas y reversibles, usaría la segunda opción y lanzaría una excepción si un valor es inapropiado.

Cuestiones relacionadas