SlideShare una empresa de Scribd logo
1 de 13
Haciendo estructuras
de control fáciles de leer
Juan David Hernández
https://www.fing.edu.uy/inco/cursos/fpr
/wiki/images/4/47/Flujoiteracion.png
Haz que todos tus condicionales,
ciclos y cualquier otra estructura de
control tan “natural” como sea
posible, escribiendo de una forma
que no haga parar o releer al lector
El orden de los argumentos en
condicionales
– Si bien es cierto que el orden no altera el producto, sí altera la lectura
if (length >= 10) if (10 <= length)
while (bytes_received < bytes_expected)
while (bytes_expected > bytes_received)
– Regla: primero el valor que se va a comparar y luego contra el que se comparará.
Ejemplo:
Si 18 años es mayor o igual a tu edad
Si tienes al menos 18 años
El orden de los bloques if/else
Reglas:
– Elegir primero el caso positivo.
– Empezar por el caso más simple para que no moleste luego.
Ejemplo: if (file == null) // Bloque de Error
– Lidiar primero con el caso más llamativo (lo contrario a la
imagen)
Clase, primero pongamos toda nuestra atención a
Bobby mientras habla de su sapo mascota
if (!url.HasParameter(“id")) {
// bloque 1
} else {
// bloque 2
}
if (url.HasParameter(“id")) {
// bloque 2
} else {
// bloque 1
}
El operador ternario (el
condicional ?)
– Nótese la diferencia…
time_str += (hour >= 12) ? "pm" : "am"; // Entendible
return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
– Regla: La idea no es reducir código sino reducir el tiempo de lectura (No usar el
operador).
if (exponent >= 0) { // Mucho más entendible
return mantissa * (1 << exponent);
} else {
return mantissa / (1 << -exponent);
}
Evitar ciclos do-while
Caída peligrosa – ¿Por qué no
pusieron esa señal arriba?
– No se sabe la condición del ciclo hasta que se termina de leer el interior.
– Regla: Siempre hay una forma de hacer lo mismo que un do-while de
otra manera, pero teniendo cuidado de hacer lo siguiente:
// Bloque de código
while (condition) {
// Bloque de código, otra vez
}
do {
// Bloque de código
} while (condition);
do { // ¿Qué pasa aquí?
continue;
} while (false);
// Busca a través de la lista, empezando en 'node', por el'name' dado
// No considera más de 'max_length' nodos
public boolean ListHasNode(Node node, String name, int max_length) {
do {
if (node.name().equals(name))
return true;
node = node.next();
} while (node != null && --max_length > 0);
return false;
}
Evitar ciclos do-while: Ejemplo
public boolean ListHasNode(Node node, String name, int max_length) {
while (node != null && max_length-- > 0) {
if (node.name().equals(name))
return true;
node = node.next();
}
return false;
}
El infame goto
– Hace el flujo del código difícil de seguir
– Hay mejores formas de hacer lo mismo
– Pueden generar cruces de secciones. Ejemplo:
:label1;
if (condition) flag = true;
:label2
createSomething();
– Sin embargo, en C sigue siendo muy utilizado para indicar acciones de salida y
errores, lo cual no suele ser un problema mientras sea bien usado.
Minimizar anidación
– Cada anidación es un push en el stack mental del lector, hacer un pop
implica leer nuevamente la condición actual al encontrar un cierre.
if (user_result == SUCCESS) {
if (permission_result != SUCCESS) {
reply.WriteErrors("error reading permissions");
reply.Done();
return;
}
reply.WriteErrors("");
} else {
reply.WriteErrors(user_result);
}
reply.Done();
– En este caso es aún peor porque la condición interna difiere de la externa
– Mientras escribes código tienes un contexto de lo que estás escribiendo y no te das
cuenta que tan difícil es leerlo, por tanto, es recomendable releer con una
perspectiva fresca.
– Reducir anidación mediante retornos tempranos (sí, son recomendable):
if (user_result != SUCCESS) {
reply.WriteErrors(user_result);
reply.Done();
return;
}
if (permission_result != SUCCESS) {
reply.WriteErrors(permission_result);
reply.Done();
return;
}
reply.WriteErrors("");
reply.Done();
Minimizar anidación: Reglas
– Reducir anidación en ciclos mediante continue:
for (int i = 0; i < results.length; i++) {
if (results[i] == NULL) continue;
non_null_count++;
if (results[i]->name == "") continue;
console.log("Considering candidate..." + endl);
}
Minimizar anidación: Reglas
Puedes seguir el flujo de
ejecución?
– Si el código es legible, es más fácil entender, seguir el flujo de ejecución y hacer debug.
– Evitar usar código que se ejecute tras bambalinas indiscriminadamente
Tipo de llamado Cómo se oscurece el código
Hilos y procesos No es claro qué código se está ejecutando
Manejo de señales/interrupciones Cierto código podría ejecutarse en cualquier momento
Excepciones Termina haciendo “Bubble up” a través de múltiples llamadas a funciones
Punteros de funciones o funciones
anónimas
No se sabe qué código se ejecutará en tiempo de compilación
Métodos virtuales object.virtualMethod() puede invocar código de una subclase
desconocida
Referencias:
– The Art of Readable Code, D. Boswell & T. Foucher, Capítulo 7,
http://dl.finebook.ir/book/5f/14474.pdf
– Control Flow, Wikipedia, https://en.wikipedia.org/wiki/Control_flow

Más contenido relacionado

La actualidad más candente

La actualidad más candente (12)

Diseno Web II Guia Practica 5
Diseno Web II  Guia Practica 5Diseno Web II  Guia Practica 5
Diseno Web II Guia Practica 5
 
Presentación1
Presentación1Presentación1
Presentación1
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 
BucleCM
BucleCMBucleCM
BucleCM
 
Programa c++
Programa c++Programa c++
Programa c++
 
Tutorial basico de vbscript by novlucker parte5
Tutorial basico de vbscript by novlucker parte5Tutorial basico de vbscript by novlucker parte5
Tutorial basico de vbscript by novlucker parte5
 
24 Php. Concatenacion De Cadenas
24 Php. Concatenacion De Cadenas24 Php. Concatenacion De Cadenas
24 Php. Concatenacion De Cadenas
 
Sentencia Do...While
Sentencia  Do...WhileSentencia  Do...While
Sentencia Do...While
 
La instrucción tsl
La instrucción tslLa instrucción tsl
La instrucción tsl
 
Things i wish someone told me about node js
Things i wish someone told me about node jsThings i wish someone told me about node js
Things i wish someone told me about node js
 
3 php
3 php3 php
3 php
 
3 php
3 php3 php
3 php
 

Destacado (7)

Capitulo 3 - nombres que no pueden ser malinterpretados
Capitulo 3 -  nombres que no pueden ser malinterpretadosCapitulo 3 -  nombres que no pueden ser malinterpretados
Capitulo 3 - nombres que no pueden ser malinterpretados
 
Presentacion aesthetics
Presentacion aestheticsPresentacion aesthetics
Presentacion aesthetics
 
the art of readable code
the art of readable codethe art of readable code
the art of readable code
 
Standlan presentación 1
Standlan presentación 1Standlan presentación 1
Standlan presentación 1
 
Entrega standlan
Entrega standlanEntrega standlan
Entrega standlan
 
Capítulo 8 breaking down giant expressions
Capítulo 8  breaking down giant expressionsCapítulo 8  breaking down giant expressions
Capítulo 8 breaking down giant expressions
 
taorc
taorctaorc
taorc
 

Similar a Estructuras de control legibles

Power point progrmacion 2[1]
Power point progrmacion 2[1]Power point progrmacion 2[1]
Power point progrmacion 2[1]bonito-56
 
Estructuras de Control C++
Estructuras de Control C++Estructuras de Control C++
Estructuras de Control C++Jorge Leonardo
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticasjaespinmora
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc X
 
Scjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow ControlScjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow ControlJose Selman
 
Ejemplo C++
Ejemplo C++Ejemplo C++
Ejemplo C++David
 
D6 a sentencias de control de flujo
D6 a sentencias de control de flujoD6 a sentencias de control de flujo
D6 a sentencias de control de flujoGabriel Mondragón
 
clase03_metodosdecapturadedatos_estructurascontrol - copia.pdf
clase03_metodosdecapturadedatos_estructurascontrol - copia.pdfclase03_metodosdecapturadedatos_estructurascontrol - copia.pdf
clase03_metodosdecapturadedatos_estructurascontrol - copia.pdfjonathanalulema2014
 
gestion de datos de informacion
gestion de datos de informaciongestion de datos de informacion
gestion de datos de informacionPedro Kent
 

Similar a Estructuras de control legibles (20)

Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Power point progrmacion 2[1]
Power point progrmacion 2[1]Power point progrmacion 2[1]
Power point progrmacion 2[1]
 
Estructuras de Control C++
Estructuras de Control C++Estructuras de Control C++
Estructuras de Control C++
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas
 
Aprendiendo de la sintaxiss
Aprendiendo de la sintaxissAprendiendo de la sintaxiss
Aprendiendo de la sintaxiss
 
Mod2ud2 1
Mod2ud2 1Mod2ud2 1
Mod2ud2 1
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcaciones
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
Javascript
JavascriptJavascript
Javascript
 
Scjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow ControlScjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow Control
 
Unidad 5: Excepciones Ejercicio 2
Unidad 5: Excepciones Ejercicio 2Unidad 5: Excepciones Ejercicio 2
Unidad 5: Excepciones Ejercicio 2
 
7. estructura condicional if
7.  estructura condicional if7.  estructura condicional if
7. estructura condicional if
 
Lumisaca hector bdii_t7
Lumisaca hector bdii_t7Lumisaca hector bdii_t7
Lumisaca hector bdii_t7
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 
Ejemplo C++
Ejemplo C++Ejemplo C++
Ejemplo C++
 
Cap3 algoritmos
Cap3 algoritmosCap3 algoritmos
Cap3 algoritmos
 
D6 a sentencias de control de flujo
D6 a sentencias de control de flujoD6 a sentencias de control de flujo
D6 a sentencias de control de flujo
 
clase03_metodosdecapturadedatos_estructurascontrol - copia.pdf
clase03_metodosdecapturadedatos_estructurascontrol - copia.pdfclase03_metodosdecapturadedatos_estructurascontrol - copia.pdf
clase03_metodosdecapturadedatos_estructurascontrol - copia.pdf
 
gestion de datos de informacion
gestion de datos de informaciongestion de datos de informacion
gestion de datos de informacion
 

Estructuras de control legibles

  • 1. Haciendo estructuras de control fáciles de leer Juan David Hernández https://www.fing.edu.uy/inco/cursos/fpr /wiki/images/4/47/Flujoiteracion.png
  • 2. Haz que todos tus condicionales, ciclos y cualquier otra estructura de control tan “natural” como sea posible, escribiendo de una forma que no haga parar o releer al lector
  • 3. El orden de los argumentos en condicionales – Si bien es cierto que el orden no altera el producto, sí altera la lectura if (length >= 10) if (10 <= length) while (bytes_received < bytes_expected) while (bytes_expected > bytes_received) – Regla: primero el valor que se va a comparar y luego contra el que se comparará. Ejemplo: Si 18 años es mayor o igual a tu edad Si tienes al menos 18 años
  • 4. El orden de los bloques if/else Reglas: – Elegir primero el caso positivo. – Empezar por el caso más simple para que no moleste luego. Ejemplo: if (file == null) // Bloque de Error – Lidiar primero con el caso más llamativo (lo contrario a la imagen) Clase, primero pongamos toda nuestra atención a Bobby mientras habla de su sapo mascota if (!url.HasParameter(“id")) { // bloque 1 } else { // bloque 2 } if (url.HasParameter(“id")) { // bloque 2 } else { // bloque 1 }
  • 5. El operador ternario (el condicional ?) – Nótese la diferencia… time_str += (hour >= 12) ? "pm" : "am"; // Entendible return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent); – Regla: La idea no es reducir código sino reducir el tiempo de lectura (No usar el operador). if (exponent >= 0) { // Mucho más entendible return mantissa * (1 << exponent); } else { return mantissa / (1 << -exponent); }
  • 6. Evitar ciclos do-while Caída peligrosa – ¿Por qué no pusieron esa señal arriba? – No se sabe la condición del ciclo hasta que se termina de leer el interior. – Regla: Siempre hay una forma de hacer lo mismo que un do-while de otra manera, pero teniendo cuidado de hacer lo siguiente: // Bloque de código while (condition) { // Bloque de código, otra vez } do { // Bloque de código } while (condition); do { // ¿Qué pasa aquí? continue; } while (false);
  • 7. // Busca a través de la lista, empezando en 'node', por el'name' dado // No considera más de 'max_length' nodos public boolean ListHasNode(Node node, String name, int max_length) { do { if (node.name().equals(name)) return true; node = node.next(); } while (node != null && --max_length > 0); return false; } Evitar ciclos do-while: Ejemplo public boolean ListHasNode(Node node, String name, int max_length) { while (node != null && max_length-- > 0) { if (node.name().equals(name)) return true; node = node.next(); } return false; }
  • 8. El infame goto – Hace el flujo del código difícil de seguir – Hay mejores formas de hacer lo mismo – Pueden generar cruces de secciones. Ejemplo: :label1; if (condition) flag = true; :label2 createSomething(); – Sin embargo, en C sigue siendo muy utilizado para indicar acciones de salida y errores, lo cual no suele ser un problema mientras sea bien usado.
  • 9. Minimizar anidación – Cada anidación es un push en el stack mental del lector, hacer un pop implica leer nuevamente la condición actual al encontrar un cierre. if (user_result == SUCCESS) { if (permission_result != SUCCESS) { reply.WriteErrors("error reading permissions"); reply.Done(); return; } reply.WriteErrors(""); } else { reply.WriteErrors(user_result); } reply.Done(); – En este caso es aún peor porque la condición interna difiere de la externa
  • 10. – Mientras escribes código tienes un contexto de lo que estás escribiendo y no te das cuenta que tan difícil es leerlo, por tanto, es recomendable releer con una perspectiva fresca. – Reducir anidación mediante retornos tempranos (sí, son recomendable): if (user_result != SUCCESS) { reply.WriteErrors(user_result); reply.Done(); return; } if (permission_result != SUCCESS) { reply.WriteErrors(permission_result); reply.Done(); return; } reply.WriteErrors(""); reply.Done(); Minimizar anidación: Reglas
  • 11. – Reducir anidación en ciclos mediante continue: for (int i = 0; i < results.length; i++) { if (results[i] == NULL) continue; non_null_count++; if (results[i]->name == "") continue; console.log("Considering candidate..." + endl); } Minimizar anidación: Reglas
  • 12. Puedes seguir el flujo de ejecución? – Si el código es legible, es más fácil entender, seguir el flujo de ejecución y hacer debug. – Evitar usar código que se ejecute tras bambalinas indiscriminadamente Tipo de llamado Cómo se oscurece el código Hilos y procesos No es claro qué código se está ejecutando Manejo de señales/interrupciones Cierto código podría ejecutarse en cualquier momento Excepciones Termina haciendo “Bubble up” a través de múltiples llamadas a funciones Punteros de funciones o funciones anónimas No se sabe qué código se ejecutará en tiempo de compilación Métodos virtuales object.virtualMethod() puede invocar código de una subclase desconocida
  • 13. Referencias: – The Art of Readable Code, D. Boswell & T. Foucher, Capítulo 7, http://dl.finebook.ir/book/5f/14474.pdf – Control Flow, Wikipedia, https://en.wikipedia.org/wiki/Control_flow