2010-08-16 11 views
6

Aquí hay un ejemplo que escribí que usa if-else ramas y expresiones de guardia. ¿Cuándo es uno más apropiado sobre el otro? La razón principal por la que quiero saber esto es porque los idiomas suelen tener una forma idiomática de hacer las cosas.¿Cuándo son apropiadas las expresiones de guardia?

test1 a b = 
    if mod b 3 ≡ 0 then a + b 
    else if mod b 5 ≡ 0 then a + b 
    else a 

test2 a b 
    | mod b 3 ≡ 0 = a + b 
    | mod b 5 ≡ 0 = a + b 
    | otherwise = a 

Respuesta

11

El ejemplo que presenta es una muy buena demostración de cómo los protectores son mejores.

Con las protecciones, tiene una lista muy simple y legible de condiciones y resultados, muy parecida a cómo la función sería escrita por un matemático.

Con if, por el contrario, tiene una estructura algo complicada (esencialmente O (n 2 ) la dificultad de lectura) de expresiones anidadas con palabras clave tirado a intervalos irregulares.

Para casos simples, es básicamente un lanzamiento entre if y las protecciones - if pueden ser incluso más legibles en algunos casos muy simples porque es más fácil escribir en una sola línea. Sin embargo, para una lógica más complicada, los guardias son una forma mucho mejor de expresar la misma idea.

+0

+1 para, además de estar en lo cierto, "O (n²) dificultad de lectura" – delnan

+0

@delnan - Tal vez estaban pensando * "O (n²) ruido de señal en relación" * con 'n' es el número de condiciones. – ChaosPandion

6

Siempre pensé que era una cuestión de preferencia. Personalmente, prefiero el segundo, creo que los if-elses dan una sensación más imperativa que los guardias, y encuentro que los guardias son más fáciles de leer.

+2

Realmente me gusta la forma en que los guardias leen. – ChaosPandion

Cuestiones relacionadas