# Errores comunes al programar
## De donde nace esta idea?
No es poco común ver a jóvenes programadores, entrar en el mundo de la programación, con mucho entusiasmo, en tecnologías de vanguardia, siguiendo cursos en internet, escuelas o talleres, los cuales abundan en la red y muchos de gran calidad.
El mundo de la informática, y, especialmente la programación de sistemas, se ha vuelto accesible para mucha gente que no nesceriamente es especalista, lo que por un lado es bueno, dado que la demanda por informáticos ha crecido ampliamente, pero esto ha sido posible encapsulando muchas partes de la computación que al no ser consideradas "practicas",es decir, pareciera que no aportarán a la productividad, pero que son fundamentales en esta disciplina.
Pretendemos tocar una serie de temas enfocados en profundizar y reflexionar aspectos de la computación que se esconden detrás de la tecnoloǵia que usamos diariamente, con el fin de ampliar nuestra visión y ser capaces de llegar más lejos, aprovechando toda nuestra creatividad y capacidad, que nos permitan resolver problemas e innovar.
Todos los temas que iremos viendo semana a semana, estarán enfocados en una temática particupar, que abordaremos en conjunto con el fin de profundizarla y dar una visión mas reflexiva.
Esperamos que les sea de utilidad para todos aquellos que como nosotros, buscan superarse día a día.
Tema de hoy
"Errores Comunes al programar"
## Introducción al tema
Cuando empezamos a programar, es común cometer ciertos errores que hace que nuestro código presente fallas al ser ejecutado.
Hay ciertas reglas,prácticas y premisas que podemos seguir para mejorar la calidad de nuestro código.
Analizaremos algunos de ellos y como estos influyen:
### Declaración de variables
Es común en lenguajes de tipeado dinámico no declarar las variables antes de usarlas.
Veamos un ejemplo
```
$var = false;
foreach($arreglo as $elemento){
if($elemento == 1)
$var = true;
}
if($var){
}
```
### Control de Errores
#### No uso de try/catch,
si estamos desarrollando en un lenguaje orientado a objetos es muy probable que nuestros métodos lancen excepciones, debemos acosumbrarnos a esta forma de enfocar el control de errores, es muy común en lenguajes como javascript, php u otro lenguaje dinámico, no usar esta estructura, por lo que no atrapamos las excepciones, dejando que se propaguen hasta la raíz de la pila de ejecución, y esto finalmente provoca una caida del sistema que pudo haber sido evitada muy facilmente simplemente usando la estructira try/catch.
=> La idea es tener controlados nuestros errores
=> Problema, esperar que la aplicación se caiga para saber que esta malo algo
#### Orden de precedencia de las validaciones
Otro problema que vemos es en la validación de las variables, están se hacen en un orden lógico incorrecto.
El programa que ejecuta el código siempre hará las validaciones "de izquierda a derecha", y en forma procedural, si es un AND (Y), ante la primera falla, el resto no es validado.
A diferencia, el OR valida el valor de todas las sentencias antes de tomar la decisión respecto del if.
```
if($a == 1 && $a != NULL)
{
//do
}
```
### Legibilidad del Código
#### Anidación de if/else
controles de flujo complicados.
```
if(error1){
//error1
}
else{
if(error2){
//error2
}
else{
if(error3){
//error3
}
else{
if(error4){
//error4
}
else{
//exito
}
}
}
}
```
#### Callbacks hell
este mismo problema (anterior) también se ve mucho cuando trabajamos con lenguajes que controlan callbaks, dando lugar a código realmente infernal y dificil de mantener.
#### Complejidad ciclomática
De lo anterior se deriva unq métrica ..
> de wikipedia La Complejidad Ciclomática (en inglés, Cyclomatic Complexity) es una métrica del software en ingeniería del software que proporciona una medición cuantitativa de la complejidad lógica de un programa. Es una de las métricas de software de mayor aceptación, ya que ha sido concebida para ser independiente del lenguaje.
> Esta métrica, propuesta por Thomas McCabe en 1976, se basa en el diagrama de flujo determinado por las estructuras de control de un determinado código.
#### Anidación de bucles
¿Es porque afecta la legibilidad del código?
¿O es algo más "técnico"?
Tiene un aspecto de legibilidad, pero lo más importante quizás es la complejidad algorítmica que aumenta significativamente a medida que anidamos bubles, aumentando el tiempo de ejecución del mismo, así el consumo de recursos.
#### convención de nombres coherente/
function validCodigo(){
}
#### nombre de variables
$a = 1
$player = Call(url://)
$player->player;
#### Usar correctamente la lógica
```
function validRut($rut){
// step1
// step2
...
// stepn
if(rut_invalido) return true;
return false;
}
if(!validRut(rut)){
//rut valido
}
#### Evitar usar el doble negativo/Uso correcto de nombres.
function isNotValidRut() {
}
if(!isNotValidRut){
// Aquí hay un problema de lectura
}