lunes, 22 de abril de 2013

Codigo probable

Muchas veces se ha terminado una tarea y se pide que se pruebe el codigo. Que el codigo hay que probarlo es una cosa que se debe de tener en cuenta desde el principio de desarrollo. Un codigo es ”probable” cuando se puede hacer un test unitario para probarlo.
El gran problema de este axioma son las dependencias de otros sistemas. Por ejemplo, supongamos una funcion como la siguientes:
Private ManagerBD daoClientes;
Private ManagerWS webServicesClientes;
Public List buscarClientesValidos (Date inicio, Date fin) {
                List todosClientesEntreFechas  = daoClientes.buscarClientes (inicio, fin);
List resultado = new ArrayList();
for  (Cliente cliente: todosClientesEntreFechas  ){
                if (webServicesClientes.esValido (cliente))
resultado.add (cliente);
}
return resultado;
}

public void setWebServicesClientes (ManagerWS webServicesClientes){
                this. webServicesClientes = webServicesClientes;
}
public void setDaoClientes (ManagerBD daoClientes){
                this. daoClientes = daoClientes;
}

El metodo buscarClientesValidos es completamente probable ya que las dependencias a otros sistemas (BD y web services) son facilmente remplazables. En el test solo tendrias que usar los set para cambiar las instancias de ManagerBD y ManagerWS por unas que sean mocks y devuelvan lo que tu quieras.
Pero si por ejemplo tienes en el metodo algo asi
Public List buscarClientesValidos (Date inicio, Date fin) {
                List todosClientesEntreFechas  = daoClientes.buscarClientes (inicio, fin);
List resultado = new ArrayList();
for  (Cliente cliente: todosClientesEntreFechas  ){
                if (WSInstancia.esValido (cliente))
resultado.add (cliente);
}
return resultado;
}

Es decir, un metodo estatico de una clase que no tienes instanciada a nivel de clase entonces este metodo no es probable. Lo puedes hacer problable sacando la llamada a un metodo
Public List buscarClientesValidos (Date inicio, Date fin) {
                List todosClientesEntreFechas  = daoClientes.buscarClientes (inicio, fin);
List resultado = new ArrayList();
for  (Cliente cliente: todosClientesEntreFechas  ){
                if (esValido (Cliente cliente))
resultado.add (cliente);
}
return resultado;
}
Public boolean esValido (Cliente cliente){
return WSInstancia.esValido (cliente);
}
Ahora el metodo es probable de nuevo ya que solo tienes que que crear una instancia de la clase y sobreescribir el metodo esValido por un metodo que devuelva lo que tu quieras.
La clave de la validez de las pruebas es que NO HAY QUE TOCAR CODIGO del metodo que estas probando. Si has modificado una linea del codigo, aunque sea lo mas simple del mundo, tienes que volver a problarlo todo.

Otra cosas importante para probar es tener el entorno para probar preparado desde un principio. Es decir, para hacer la prueba de la clase que contenga el metodo buscarClientesValidos tienes que instanciarla y si para ello tienes que pasarle variables de iniciacion compleja entonces tienes que tenerlas preparadas desde el principio de la prueba. No puedes crear un entorno distinto para cada prueba porque perderias mucho tiempo.

viernes, 19 de abril de 2013

Apunta las cosas

Una practica que solo un 5% de los informaticos llevan a cabo y que deberian hacer el 100% es tener algun sistema para apuntar lo que tienes que hacer, lo que estas haciendo, información que te aportan, etc.. es decir, TODO.
Ya sea una dirección IP donde esta la aplicación que tienes que usar, las tareas que te ha asignado el jefe, las claves de algun servidor, etc.. APUNTALO TODO.
Una de las cosas que peor imagen da y que va a retrasar tu crecimiento profesional es olvidar cosas (tareas, reuniones, etc..) o parte de esas cosas. Si las olvidas por completo da la impresión de que no te importa y si haces peor las cosas por olvidar partes de esas cosas entoces da la impresión de ser incompetente.
Tienes que elegir una manera de notación de tal manera que tampoco te lleve mucho tiempo anotar cosas y acceder posteriormente a ellas.
Si el sistema es digital (una pagina web por ejemplo) tendras mas dinamismo a la hora de modificar/ampliar la informacion y a la hora de mostrarle ha alguien la información. Yo te recomiendo  la aplicación mediawiki. (Consejo para la mediawiki: si quieres que solo un usuario registrado pueda modificar los apartados entonces incluye en el fichero de localsettings.php la linea $wgGroupPermissions['*']['edit'] = false;).
Apuntarlo todo tambien es muy util cuando un desarrollo se termina y aparecen tareas que no se tienen en cuenta al principio:
-          Poner comentarios en codigo.
-          Hacer un informe resumen a algun jefe de lo que se ha hecho.
-          Comentar un alguna aplicación de control de tareas lo que se ha hecho.
-          Etc..
Si tienes apuntado lo que has ido haciendo y como lo has hecho entonces te evitaras el problema de recorda como has hecho unas cosas e incluso de tener que escribir nada ya que puedes resolver las tareas anteriores copiando lo que has ido escribiendo. Como mucho tendras que escribir texto para darle algo de forma pero poco mas.