Download BUENAS_PRACTICAS_en_el_desarrollo_de_software

Document related concepts
no text concepts found
Transcript
Buenas prácticas en el
desarrollo de Software
Jorge Manrubia Díez
[email protected]
www.hci.uniovi.es
Diciembre 2004
Estamos aquí…






Introducción
Buenas prácticas de codificación
Código sólido
Tests unitarios
Buenas actitudes de desarrollo
Conclusiones
¿Qué son las buenas prácticas?

Costumbres, hábitos, prácticas que
utilizamos cuando desarrollamos SW



Al alcance de todos
No ligadas a tecnologías concretas
¿Cuál es su finalidad?

Mejorar el desarrollo de software
Estamos aquí…






Introducción
Buenas prácticas de codificación
Código sólido
Tests unitarios
Buenas actitudes de desarrollo
Conclusiones
Código ofuscado

Si nunca pensaríamos leer un titular como el
siguiente…
Código ofuscado (II)

Porque codificamos del siguiente modo:
Fuente: New Language Features for Ease of Development in the Java 2 Platform, Standard Edition 1.5
http://java.sun.com/features/2003/05/bloch_qa.html
Código ofuscado (III)

¿Por ahorrar tiempo?


El tiempo tecleando código es insignificante frente
al tiempo depurando
Buscamos un código fácil de leer


Los nombres deben de ser descriptivos
Se debe emplear tiempo



Escogiendo buenos nombres
Tecleándolos 
Renombrando los existentes
“The candy machine interface”
61
65
Interfaces de los métodos

Apliquemos esta metáfora a las interfaces
que ofrecen las funciones/métodos

Ejemplo: Función realloc() de ANSI C
-Cambia el tamaño del objeto apuntado por ptr al tamaño
especificado por tamanyo
-Si ptr es un puntero nulo, la función realloc se comporta a
igual que la función malloc para el tamaño especificado.
-Si el espacio no puede ser desadjudicado, el objeto
apuntado por ptr no varía.
-Si tamanyo es cero y ptr no es nulo, el objeto al que
apunta es liberado.
Interfaces de los métodos (II)


Los métodos deben presentar un interfaz
extremadamente nítido
Debe poder entenderse, sin consultar su
especificación


Lo que el método hace
Su Entrada/Salida
Interfaces de los métodos (III)

Evitar parámetros que determinen el funcionamiento
del método

Mejor hacer varios métodos. Ejemplo (clase String de
Java)



Evitar códigos de error


Usar excepciones
Evitar que null:


Sea un parámetro “con significado”
Sea un retorno “con significado” (salvo excepciones)
Código factorizado
Estamos aquí…






Introducción
Buenas prácticas de codificación
Código sólido
Tests unitarios
Buenas actitudes de desarrollo
Conclusiones
Código sólido

Es el código preparado para detectar errores


Cuando programamos codificaremos:



No errores de usuario, sino errores que introducimos al
programar
Lo que el programa tiene que hacer
Código “extra” para detectar errores
Un ejemplo:
Asertos


Pero lo anterior no es práctico: asertos
Un aserto es un mecanismo

Que permite hacer asunciones sobre el
funcionamiento de nuestro código



Indican el error cuando no se validen
Que puede activarse (desarrollo) y desactivarse
(lanzamiento)
El código de comprobación puede y debe ser
tan complejo como sea necesario
Tipos de verificaciones

Precondiciones


Invariantes


Condiciones que debe cumplir el cliente para poder invocar
un método
 Sun no recomienda el uso de asertos: excepciones de
usuario específicas. Pero esto no es práctico.
Condiciones que deben validarse para considerar el estado
del objeto como legal
Postcondiciones


Condiciones que deben cumplirse después de la
invocación a un método
Verifican que el método se ha comportado correctamente
Asertos en Java

Usar sentencia assert (a partir de 1.4)

Se habilita/deshabilita al ejecutar la aplicación


Parámetro –ea de la VM
Usar librería propia

Permite sobrecargar los asertos para adaptarlos a
las comprobaciones más habituales


Referencias no nulas
Cadenas no vacías
Estamos aquí…






Introducción
Buenas prácticas de codificación
Código sólido
Tests unitarios
Buenas actitudes de desarrollo
Conclusiones
Tests unitarios

Un test unitario es un test que valida un módulo de
un programa


Valida que funcione como es de esperar
El testing debe ser sistemático

Pruebas “bajo demanda”



Implican asumir la corrección de lo que no probemos
(ceguera)
No se pueden repetir (trabajo tirado a la basura)
No tiene nada que ver con los asertos del código
sólido

Pero se complementan
Tests unitarios (II)

Los tests unitarios


Deben ser auto comprobables
Deben ser almacenados



Para crecer a la vez que nuestros componentes
Para poder ser ejecutados en el futuro
Veremos un sencillo ejemplo en Java con
Junit

Pero es mucho más importante la práctica en sí
que la tecnología
Un ejemplo sencillo (I)
Un ejemplo sencillo (II)
Estamos aquí…






Introducción
Buenas prácticas de codificación
Código sólido
Tests unitarios
Buenas actitudes de desarrollo
Conclusiones
¿Cómo afrontar el cambio?

Anticipándonos a él


Desarrollo en cascada
Abrazándolo


Desarrollo iterativo
Manteniendo el código en su estado más sencillo
posible


“Sencillo” distinto de “cutre”
Se debe de volver continuamente sobre el código para
mejorar su diseño: refactoring
Refactoring

Refactoring es cambiar la estructura interna
del código



Se presenta un catálogo de refactorings


Mejorar su diseño
Eliminar la duplicación
Replace error code with exception, Rename field,
Extract interface...
Pero más importante es adoptar la actitud

Mejorar el código siempre que se detecte la
necesidad
Composición mejor que herencia

La herencia puede resultar tentadora como
mecanismo de reutilización de código



Pero la herencia define una relación “es-un” entre
padre e hija
La clase hija queda ligada a la clase padre: difícil
combinar funcionalidades
La composición es una aproximación más
natural, por regla general

Objetos que colaboran para lograr un fin
Estamos aquí…






Introducción
Buenas prácticas de codificación
Código sólido
Tests unitarios
Buenas actitudes de desarrollo
Conclusiones
Conclusiones

Todo el tiempo empleado en escribir






Código fácil de leer
Código robusto
Tests unitarios
Mejoras sobre el código existente
Lo ganaremos con creces en calidad y velocidad
de desarrollo
Las buenas prácticas están al alcance de cualquiera

“I’m not an excellent programmer, I’m only a good
programmer with excellent habits”
Referencias




Writing solid code. Steve Maguire. Microsoft Press,
1993.
Refactoring: improving the design of existing code.
Martin Fowler. Addison Wesley, 1999.
Extreme Programming explained: embrace change.
Kent Beck. Addison Wesley Professional, 2000.
JUnit


www.junit.org
Catálogo de buenas prácticas en Java

http://www.javapractices.com/index.cjp
Buenas prácticas en el
desarrollo de Software
Fin de la presentación
Jorge Manrubia Díez
[email protected]
www.hci.uniovi.es