¿Hay alguna situación en la que sería apropiado utilizar a menos que ... otra cosa?

7

Esta construcción se se considera incorrecta

unless
  #..
else
  #..
end

Esto es por la razón general de confusiones doble negativas. Se traduce en:

if not 
  #..
if not not
  #..
end

Todos estamos de acuerdo en que esto es confuso.

¿Existe alguna situación (incluida la semántica) de que la construcción unless..else sería más apropiada?

    
pregunta New Alexandria 12.07.2013 - 01:05

3 respuestas

12

No he trabajado con ruby, pero Perl tiene una construcción similar que tiene el mismo tipo de equipaje a su alrededor.

No hay diferencia estructural entre estas 3 construcciones:

if condition
    OneThing()
else
    AnotherThing()

unless condition
    AnotherThing()
else:
    OneThing()

if not condition
    AnotherThing()
else:
    OneThing()

Sin embargo, semánticamente, creo que la razón por la que la gente lo recomienda es que unless condition es en realidad solo azúcar sintáctica para if not condition . La diferencia es que no todos los idiomas tienen unless , por lo que este último se puede leer más fácilmente a un nuevo programador. Cuando se introduce unless , generalmente se encuentra en el contexto de la definición anterior.

El uso de unless then else simplemente confunde aún más las cosas, porque mientras que unless es un atajo útil, unless else agrega confusión al hacer que una construcción desconocida se use de forma innecesaria.

Cualquier unless then else puede reescribirse trivialmente como if then else , por lo que sugeriría que no hay ningún caso en el que unless then else mejore la legibilidad o computabilidad del código.

    
respondido por el user69037 12.07.2013 - 01:24
4

No.

Cualquier construcción de ese tipo puede reescribirse en su segunda forma, con mayor claridad.

De todos modos, en la mayoría de los idiomas, if not not se colapsa en un simple if de todos modos, por lo que las consecuencias de unless else se vuelven especialmente inútiles.

    
respondido por el Robert Harvey 12.07.2013 - 01:20
0

No desea "a menos que" porque fácilmente genera confusión porque una condición if con un negativo incorporado sería simplemente un mal diseño. También porque es fácil simplemente usar un "si".

Obtendrías construcciones como:

unless !(x=3) {

unless(item.isnotred){

que tienes que leer dos veces, donde es fácil:

if (x=3)

if (item.isred){

es muy claro.

A menos que el operador conduzca a dobles negativos que deberían evitarse.

    
respondido por el Pieter B 18.09.2013 - 08:54

Lea otras preguntas en las etiquetas