Professional Documents
Culture Documents
es
Frank Torres ftorres@consultec.es
Prácticas
recomendadas
para codificar
software
Consultec, S.L.
Bilbao – Donostia San Sebastián – Madrid – Pamplona – Santander – Vitoria Gasteiz
Qué esperamos que se aprenda con esta
charla
2
¿Qué vamos a explicar para llegar a la
conclusión de cuáles son las prácticas más
recomendadas?
3
Los 10 errores que más hemos visto en
nuestra experiencia en la programación
4
0000 - No asegurarse de que los parámetros
recibidos son los que esperamos
Los parámetros recibidos por una función o método marcada como «pública», es decir
expuesta al mundo exterior, nunca son confiables.
5
0001 - No comprobar si un elemento tiene
valor antes de acceder a él
Una fuente de errores muy común que una vez avanzados en el desarrollo es muy costoso
de solucionar es acceder a los elementos sin antes comprobar si tienen un valor.
En este caso si foo no tiene un valor la ejecución de este código fallará. Hay que recordar
siempre comprobar el valor de un elemento antes de acceder a él.
6
0010 - No asegurarse de que un array o
colección tenga valor y que sus elementos
tengan valor antes de acceder a ellos
txtNumero1.Text = numeros[0].ToString();
txtNumero2.Text = numeros[1].ToString();
7
0100 - No comentar
Comentar el código también es programar. Es por eso que dentro de la sintaxis de cada
lenguaje de programación hay caracteres o comandos específicos que permiten poner
comentarios al código
[Ejemplo - Samples]
Su principal función es comentar aquél código que no pueda explicarse por sí mismo: tanto
los identificadores -por no poder explicar del todo en la declaración su objetivo- como el
código que es complicado o poco legible por necesidad.
8
0101 - No comprobar si el índice del
elemento existe antes de acceder a él en una
colección indizada
Antes de acceder a un elemento de una colección indizada debemos siempre comprobar si
la colección tiene al menos el número de elementos que necesitamos.
Solución: comprobar
for (int i = 0; i < CargarEmpresas().Rows.Count - 1; i++)
{
// si gridView.rows.count > i, podemos acceder al índice "i"
// a menos que la lista de empresas pueda variar entre bucles
// no se necesita comprobar la cantidad de empresas
...
}
9
0110 - División por 0 / Infinite
Antes de realizar cualquier división, debemos tener en cuenta que el divisor nunca puede
ser 0, en cuyo caso el programa siempre terminará con un error por división por 0. No sólo
deberíamos controlar la situación sino decidir cuál debe de ser el comportamiento del
programa en dicho caso, en el siguiente ejemplo el programa decide devolver 0 siempre
que suceda este caso
Nota: en algunos lenguajes de programación, como c#, existen tipos de datos que representan esta
situación como un valor más, en concreto el valor Infinito. En estos casos debemos tener en cuenta dicha
posibilidad y tratarla de forma correspondiente
... valor es un parámetro decimal ...
if (valor == 0)
return 0;
if (Double.IsInfinity(result))
return 0;
else
return result;
10
0111 - Convertir cadenas a números
directamente
int numero = 0;
11
1000 - No liberar los recursos
adecuadamente
Un error común es utilizar objetos que abren recursos externos y no asegurarse de cerrar
dichos recursos correctamente. En el ejemplo siguiente se puede observar que si el código
que utiliza la conexión falla la conexión nunca será cerrada:
void EjemploObtenerOGuardarDatos()
{
var cnn = new SqlConnection(cnnString);
cnn.Open();
//usar la conexión
cnn.Close();
}
Debemos asegurarnos de capturar los errores que genere el uso de los recursos externos y
si se produce un error o terminamos de trabajar con ellos, liberar los recursos (en .NET es
recomendable usar bloques finally, o bloques using)
using (cnn = new SqlConnection(cnnString);
{
//usar la conexión, en caso de que falle el recurso es liberado
}
12
1001 - El método recursivo infinito
En programación un patrón muy habitual es utilizar recursividad. Aunque muy útil en todos los
escenarios, a menudo se comete el mismo fallo: no poner un límite a las llamadas recursivas.
return numero;
}
Para evitar el tan conocido error de "stack overflow", debemos poner líneas de control que
permitan dar fin al anidamiento de llamadas recursivas
13
1010 - Utilizar incorrectamente técnicas
conocidas
Habitualmente nos podemos encontrar con que al implementar una técnica o patrón
conocidos, lo hacemos de forma incompleta o incorrecta.
Esto puede dar lugar a que, más tarde, quien actualice el código introduzca más errores
funcionales, ya que lo hará basándose en la técnica o patrón originales.
14
¿Cómo crear los hábitos de buena programación?
15
¿Cómo crear los hábitos de buena
programación?
Siempre que el programador piense que él es el único que va a utilizar el código que
genera, aunque realmente sea el único programador del proyecto, introducirá muchos de
los errores que hemos comentado.
Cada vez quedan menos proyectos de un sólo programador, o en los que participe un sólo
programador durante todo el ciclo del proyecto.
El código que haya generado un programador puede lastrar todo el proyecto. El resto de los
programadores que participen en el proyecto en etapas posteriores tendrán que lidiar con el
código generado por los programadores que han participado con anterioridad en el mismo
proyecto.
16
¿Cómo crear los hábitos de buena
programación?
Leer código
Leer un fragmento de código al día nos permite crecer como programadores.
Además de leer el programador debe revisar el código que lee, en busca de errores o
técnicas que le permitan mejorar.
El código que leemos o que generamos, podemos clasificarlo dentro de estas tres
categorías:
Leer código
Partiendo de estas categorías podemos generar el esquema mental de las preguntas que
como programadores debemos hacernos cuando lee o escribe código.
Si nos hacemos estas preguntas veremos dónde nuestro código se sale de los
estándares y las buenas prácticas sin motivo justificado.
18
¿Cómo crear los hábitos de buena
programación?
Pair Programming
Al emparejar a programadores, entre ambos se aportan experiencia y convergen sus
ideas en puntos comunes que permiten crear buen código.
19
¿Cómo crear los hábitos de buena
programación?
Organizar el código
Organizar nuestro código es importante para mantener durante el proceso de desarrollo
un proyecto saludable y con unos costes de mantenimiento controlados.
20
¿Cómo crear los hábitos de buena
programación?
La Mejor Opción
Lasagna Ravioli
+
21
¿Cómo crear los hábitos de buena
programación?
22
KISS:
El principio de la simplicidad
23
KISS
El principio de la simplicidad
También se conoce como "Keep it Short and Simple", para evitar lo tosco del acrónimo
original.
¿Cómo lo aplicamos?
24
KISS
Particionado y Simplificación
PARTICIONADO
SIMPLIFICACIÓN
Se basa en el principio de hacer el código más comprensible eliminando todo aquello que no
sea útil o modificándolo para hacerlo más sencillo.
Iterar sobre estos dos puntos las veces que sea necesario y que el tiempo nos lo permita,
hará que nuestro código quede limpio, sencillo y legible
25
YAGNI
El principio de no malgastar esfuerzo
10 minutos después de poner esta imagen y este título, todavía seguía buscando imágenes mejores
para representar YAGNI, cuando en realidad no las necesitaba.
26
YAGNI
YAGNI = EFICACIA
No vas a necesitarlo
Cuando afrontamos cualquier proyecto uno de los primeros pasos es realizar un análisis.
Realizar el análisis de los requisitos del proyecto sin tener en mente el objetivo final,
produce siempre como resultado un exceso de funcionalidad.
27
YAGNI
ANÁLISIS
28
YAGNI
Lógica de Negocio
Interfaz de Usuario
Servicio
29
YAGNI
Usuario Funcionalidad
Lógica de Negocio
30
KISS, YAGNI y DRY
31
Optimización del Rendimiento
32
Optimización del rendimiento
Horror Code
33
Optimización del rendimiento
Medir el rendimiento
El rendimiento de nuestras aplicaciones es tan importante como otros criterios de
aceptación de nuestra aplicación.
- Conocer los recursos de hardware del cliente y definir los requisitos minimos de
nuestra aplicación en base a ellos.
34
Optimización del rendimiento
Herramientas
El rendimiento de nuestras aplicaciones es tan importante como otros criterios de
aceptación de nuestra aplicación.
Rendimiento Aplicaciones
Rendimiento Web
- FireBug
- Fiddler2
35
Optimización del rendimiento
36
Reducción de Dependencias
37
Reducción de dependencias
38
Reducción de dependencias
Eventos
39
Reducción de dependencias
Dependency Injection
Este patrón especifica que, a diferencia de una aplicación convencional, en lugar de ser
el código del usuario el que invoca los elementos externos (p.e. objetos en una librería)
son los elementos externos los que invocan al código de usuario.
Unity, una librería de Patterns & Practices, que nos proporciona una API completa
configurable para la inyección de dependencias.
40
Reducción de dependencias
Dependency Injection
41
Reducción de dependencias
42
Control de la seguridad
43
Control de la seguridad
Siempre tenemos cuidado en la seguridad al navegar por la red, con los programas que
nos descargamos, con aquellas personas que pueden tener acceso a nuestros datos
confidenciales. Siempre estamos pensando en los datos de nuestro ordenador, pero
pocas veces en los datos que manejan nuestros programas, los que nosotros
codificamos.
44
Control de la seguridad
Análisis de Riesgos
Una fórmula permite priorizar los riesgos asociados al sistema que programamos:
Los mayores riesgos vendrán valorados en el estudio del proyecto. Pero hay riesgos
implícitos en cada línea de código que programamos y ésos tenemos que conocerlos y
valorarlos nosotros mismos
45
Control de la seguridad
46
Control de la seguridad
MEJORES PRÁCTICAS
47
Control de errores
48
Control de errores
Se debe analizar el nivel de seguridad y de integridad que necesitan los datos que
maneja nuestro código. Esto nos va a indicar cómo gestionar los errores encontrados.
49
Control de errores
Ignorar
Podemos ignorar errores que no influyan en las tareas principales del usuario de nuestra
aplicación y no provoquen pérdidas de datos ni comprometan la seguridad, pero desde
su detección son candidatos a corregirse.
Se suelen ignorar los errores sólo cuando hay otras tareas de más prioridad para
desarrollar.
- Cuando se están guardando los datos, no permite cancelar, y si la ruta de red no existe,
la aplicación devolver el control al usuario (errores de rendimiento)
50
Control de errores
Contener
Usar ante soluciones urgentes o si el tiempo apremia, por ejemplo cuando muy cerca de
entregas inmediatas se detectan fallos.
Ejemplo de contención
51
Control de errores
Mitigar
La mitigación no es más que una solución -muchas veces temporal- que evita el
problema, y da la sensación de que lo ha solucionado, pero que tiene un riesgo
asociado.
En el siguiente caso que citamos como ejemplo, nos podemos plantear mitigar y no
solucionar del todo.
Una web contiene maquetas funcionales de sitios HTML, y comercializa la visión de las mismas. Hay que
guardarlos en un servidor Web y el usuario final debe tener acceso a ellas una vez sea autorizado por el
sistema. Sin haber sido autorizados los usuarios también tienen acceso a ellas, ya que el acceso se realiza a
través de un directorio virtual que permite lanzarlas como URL. Los usuarios no lo saben. No hay mucho
tiempo de desarrollo.
Mitigación: Estructurar las carpetas por IDs de paquete. Teniendo en cuenta que los nombres de las
maquetas son complejas, los usuarios del sitio Web no podrán conocer, ni dentro de una maqueta, las partes
que no ha visitado. No permitir listar los directorios para evitar descargas spiders, evitar indexación de
buscadores mediante los archivos "robots".
Riesgo pendiente: Muy Bajo, pero quedan expuestos paquetes con copyright.
52
Control de errores
Mitigar
53
Control de errores
Mitigar
54
Control de errores
Solucionar
En estos casos de abajo hay que solucionar el problema sí o sí, o todo código que
generemos (o que usemos para parchear un problema) no será más que coste añadido
y tiempo perdido.
55
Control de errores
Ellos nos brindarán información valiosa sobre qué está ocurriendo en nuestro sistema y
dónde aplicar las mejoras más inmediatas.
56
Re-Utilización
57
Re-Utilización
Ya estamos reutilizando
Durante el desarrollo de nuestra carrera como programadores, a medida que
adquirimos experiencia, todos aglutinamos recursos, buenas prácticas y soluciones
comunes a problemas que nos hemos ido encontrando.
58
Re-Utilización
Etapas
Estas son las etapas de un proceso de reutilización
59
Re-Utilización
60
Re-Utilización
Etapa 2 - Documentar
61
Re-Utilización
62
Re-Utilización
Etapa 4 - Publicitar
La intranet
El wiki de la empresa,
étc
63
CONCLUSIONES
64
Conclusiones
65
Conclusiones
- nuestra aplicación siempre debe proteger los datos que maneja, pero
nunca más de la cuenta
66
Contacto
902 23 66 66
67