2009/9/18 Gabriel Genellina <gagsl-py2@???>
> Epa, no es para tanto, y más si sólo nos restringimos a la variante de
> break y continue que existe en Python (sólo se puede salir o continuar el
> bucle más anidado). Acá [1] se presenta una formalización de la semántica
> del while con break/continue/return y excepciones para Java, pero se aplica
> igual a Python (tanto como se pueda aplicar una teoria originalmente pensada
> para lenguajes mucho mas restrictivos y simples...)
>
Ciertamente casos particulares tienen formalizaciones, y esta que vos citás
es una para el caso en cuestión.
Pero...
>
> Para demostrar la corrección parcial, hay que tener en cuenta los 'break' y
> asignarles una condición a cada uno (básicamente el 'if' previo que lo
> dispara, en la gran mayoria de los programas) que pasa a ser la
> postcondicion del bucle. Sí, ya no se puede considerar el cuerpo del bucle
> como una "caja negra", hay que mirar qué tiene adentro... pero no es tan
> dramático :)
>
Es muy dramático.
Un bucle complejo ya es difícil de analizar (ej: analizá el bucle principal
del camino mínimo de dijkstra). Ahora agregale un par de breaks y continue.
Vas a ver que demostrar que el invariante se mantiene entre ciclos se te
hace muchísimo más arduo, porque cada break y cada continue te crea un caso
particular para analizar por separado.
Formalmente, uno se toma el trabajo - no es taaan dramático.
Informalmente, destruye la intuición - drama y lágrimas.
Lo que antes era intuitivo:
while not edad.isdigit():
#20 líneas de código para hacer I/O
Se convierte en poco intuitivo
while True:
#10 líneas de I/O
if not edad:
continue
# 5 líneas de conversión de datos
if edad.isdigit():
break
# 5 líneas de fruta
(sí, compliqué un poco el while ;) )
Esto ya no es intuitivo. Uno tiene que inspeccionar (y con cuidado) el
cuerpo del bucle para saber qué se cumple a su salida. En la versión
anterior, no me importaba realmente el cuerpo, yo *sabía* que si sale del
bucle entonces "edad.isdigit()" por la primera línea.
El gran problema, entonces, es la pérdida de la intuición como herramienta.
Por eso los profesores de programación prohiben su uso, y cualquier libro
simplemente lo desalienta. Porque, si tenés una manera *sencilla* que evite
breaks y continues, en general es preferible.
Básicamente, uno tiene que mirar ambas opciones y pensar ¿vale la pena este
break?
Así de simple.