¿Qué opinas de esta nueva sintaxis if-then [cerrado]

11

Estaba pensando en algo que sería genial tener en mis controles if-elif-else.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

Entonces, básicamente thense ejecutará a cuando cualquiera de las condiciones se ejecute EXCEPTO la condición else. ¿Crees que esto es útil? Es similar al try-except-else de python.

Creo que algunos de ustedes están haciendo una implementación muy preliminar. El thenbloque sería como el elsebloque en un try-exceptbloque en Python. La verdadera razón por la que sugiero esto es para situaciones como esta.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

El thenbloque está limitado al primero si es como elsees. Entonces anidar funciona bien. Y si necesita ejecutar un método antes de las declaraciones if, eso realmente no tiene nada que ver con este caso de uso.

Falmarri
fuente
¿Qué tan anidado puede ser?
aggietech
66
+1 por pensar fuera de la caja, pero no votaría para implementarlo. Vea mi respuesta por qué a continuación.
Wonko the Sane
1
¿Entonces 'entonces' actúa como finallyen Java?
Alex Feinman
1
Me parece thenun poco confuso. Por thenlo general, se supone que ocurre después de un if. Quiero decir, estás diciendo, if condition, then stuff()pero luego procede a decirthen stuff that applies to both
Matt Olenik
2
+1 para un ejercicio de pensamiento interesante, pero estoy de acuerdo con las respuestas que lo presentan en Mala idea. Simplemente no es intuitivo, y pude ver esto REALMENTE tropezando con algunos codificadores.
BlairHippo

Respuestas:

17

Creo que se ve horrible. Si desea que el código se ejecute después de una variedad de condiciones, entonces (a) vuelva a verificar esas condiciones o (b) establezca una variable en el estado de éxito indicado.

Josh K
fuente
2
Estoy de acuerdo, es muy difícil entender lo que significa sin una explicación como la que usted dio.
tcrosley
¿Por qué se requiere una explicación de cómo algo funciona demasiado como para esperar?
Falmarri
55
Porque hace que el código sea más difícil de leer.
Antsan
No estoy realmente seguro de que sea justo. Cada construcción en el código tiene que explicarse una vez.
Magus
14

En general, ya puede hacer esto con un interruptor / caja y un interruptor / caja proporciona un control más ajustado sobre lo que está proponiendo.

Tampoco se lee correctamente lógicamente. Si A más si B, entonces C. no implica para alguien que C se ejecutará si A o B se evalúan como verdaderos.

Brian R. Bondy
fuente
2
Python no tiene declaraciones de cambio / caso
Falmarri
2
No creo que la pregunta se haya dirigido directamente a Python solo respuestas, pero si esa fue la intención, por favor etiquete también como Python.
Brian R. Bondy
Bueno, no está redactado directamente hacia Python. El ejemplo fue en python. Pero si su respuesta a por qué esto no es necesario es "hay declaraciones de cambio", bueno, Python no las tiene.
Falmarri
1
@Falmarri: Bastante justo, así que supongo que mi respuesta a eso sería que Python sería mejor para admitir las declaraciones clásicas de cambio.
Brian R. Bondy
el código en la pregunta está en Python no significa que la pregunta sea sobre Python, porque eso también puede ser un pseudocódigo. Si solo se trata de Python, entonces debe etiquetarse como tal
phuclv
8

Interesante, pero me parece (sin duda, algo en mi camino) una invitación a problemas de legibilidad, lógica y sintaxis.

Editar: su if-elif es muy simple: ¿qué pasaría si hubiera 10 elifs? 20? ¿Todas las condiciones tendrían que ser verdad? ¿Cuáles son las posibilidades de eso?
Tu if-elif es muy simple: ¿qué pasaría si hubiera 10 elifs? 20? ¿No haría eso bastante ilegible?

Además, se puede lograr fácilmente mediante una metodología establecida probada y verdadera:

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

¿Qué sucede si "stuff_that_applies_to_both" necesita suceder antes de los pasos individuales? Su código no maneja este caso:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Finalmente, esta sintaxis permite una mayor flexibilidad con más condiciones: if (thisCondition o thatCondition u otherCondition) {stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

He estado usando if / else, pero podría haber usado fácilmente una declaración de cambio con una bandera:

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

Tenga en cuenta que en realidad no necesitaba el indicador conditionApplies: podría haber agregado la función "stuff_that_applies_to_both ()" a ambas condiciones no predeterminadas. Simplemente hice esto para que se parezca más a la sintaxis definida anteriormente, aunque el "entonces" en lugar del "más".

Por lo tanto, me parece una sintaxis muy especializada, donde una sintaxis más general llena la factura y más.

+1 por pensar en una posible característica (¡sigue haciendo eso!), Pero no votaría para implementarla.


1
+1 para "metodología probada y verdaderamente establecida": si hay una solución razonable para un problema, por lo general es mejor usarla :)
bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?Eso no es posible. solo 1 elif puede ser cierto porque deja de evaluar más.
Falmarri

Mi error: lo leí como "y" cuando quiso decir "o". Sin embargo, mantengo mi respuesta: la actualizaré según lo que usted señaló.
Wonko the Sane

¿Realmente crees que la sintaxis que publicaste aquí es más clara de lo que sugerí? No solo está verificando sus condiciones dos veces, sino que no anidar siempre es mejor que anidar
Falmarri el

1
Como lo hará el suyo, a menos que su "entonces" se aplique realmente a todas las condiciones, lo cual, a medida que agrega más y más, se vuelve cada vez menos probable. Y personalmente, viniendo de un fondo C / C ++ / C #, encuentro el anidamiento bastante menos confuso que la sintaxis dividida (es decir, hacer algo aquí en el "si" o tal vez un "elsif", y luego saltar hacia abajo y hacer algo más en el "entonces". Personalmente, encuentro que la sintaxis es más legible para tener todas las condiciones juntas. Puede que no sea correcto, pero es un concepto más establecido en mi mundo cotidiano.
Wonko the Sane

2

Hoy no me importaría usar algo como esto. Pero, para estar seguro, lo usaría con la frecuencia que uso repetir hasta.

El código al menos se vería mejor sin la anidación superflua. Aunque prefiero Else Ifhacerlo elif. Reemplazaría el Thencon Doy el final Elsecon Otherwise.


Bueno, habla con los creadores de Python, no yo =]
Falmarri

Oh, pensé que estabas diseñando un nuevo lenguaje. Solo estaba sugiriendo que los cambios de nombre sean más precisos, deje elif si lo desea, pero eso último parece ser diferente de lo normal.
Peter Turner

Bueno, no es necesariamente para un nuevo lenguaje, pero tampoco es necesariamente para Python. Solo una nueva idea para una regla de sintaxis en general. Esto podría aplicarse a cualquier idioma con relativamente pocos efectos secundarios.
Falmarri

0

Parece una buena idea. Sin embargo, el único problema que imagino es que eres más propenso a los errores. Como escribir un if / else if y llamar a blah () en ese momento. Escribir otro más si eso no quiere bla, eliminar bla de entonces y agregarlo a sus ifs / elseifs. Luego, cuando usted u otro programador agregue otra declaración, puede esperar que se llame a bla, pero no.

O puede tener varios ifs, escribir un bla y olvidar todos los ifs, pero uno requiere esto que rompería algo. También es probable que si necesita que lo sigan, lo colocará debajo del bloque if. Posiblemente estableciendo un bool en else (NoUpdate = true) y simplemente escriba un if (! NoUpdate) {} directamente debajo del cual es más claro y puede ser configurado por un if

Solo digo que parece más propenso a los errores, no es que no me guste la idea. No me importaría verlo en un idioma, pero no puedo imaginar ninguna situación en la que lo usaría si mi idioma lo admite.


fuente
Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an ifEsto es EXACTAMENTE lo que se supone que esto debe evitar. Ese es el objetivo de una declaración elif. Elif tampoco es necesario, se puede verificar con declaraciones if, pero se complica.
Falmarri el
0

Encuentro su sintaxis confusa, pero veo algo de valor en el concepto. Conceptualmente, cuando he considerado el problema, lo que he encontrado queriendo es un "desatino", que básicamente ejecutaría cosas en los casos en que el último elseno se disparara. Mirándolo desde ese ángulo, sugeriría que uno podría lograr un resultado similar a través de:

  hacer
  {
    si (condición1)
      ... cosas solo para la condición1
    si no (condición2)
      ... cosas solo para condition2
    más
    {
      ... cosas para ninguna condición
      descanso;
    }
    ... cosas para ambas condiciones
  } mientras (0); // Punto de continuación para el descanso

Otra opción puede ser en algunos casos:

  if ((condición1 && (acción1,1)) ||
       (condición2 && (acción2,1)) ||
       (action_for_neither, 0))
    action_for_either;

Parece un poco desagradable, pero en algunos casos puede que no haya una buena forma de expresar la secuencia de eventos deseada que no sea duplicar el código o usarlo goto(lo que puede no ser tan malo, excepto la caricatura que alguien podría insertar aquí).

Super gato
fuente