sábado, 2 de julio de 2011

Codificando para depurar

Codificando para depurar


En la codificación es muy normal al codificar una función o método de una clase, esperar que funcione como debe de funcionar. Creo que esto es debido a que cuando implementamos un método, sabemos desde donde va a ser llamado y sabemos perfectamente cual será el escenario de esa llamada. Por ejemplo, si estoy implementando.

void CTriangle::create(Point *pPoints);

Desde donde será llamada, siempre el puntero pPoints será distinto de null, y los tres puntos serán distintos. Ya que algoritmo de creación de triangulos, si funciona al 100% correctamente, pasará siempre un array de puntos correctos.


¿Pero que pasa, si ese algoritmo tiene algún bug? crearemos algún triangulo incorrectamente y entonces, en pantalla o no se verán o veremos cosas raras en la pantalla.


Aquí, en este punto, es donde es el motivo de este post. El codificar para depurar. Podemos tener, una función de chequeo dentro del método Create para que inmediatamente que se cree un triangulo, comprobar que es correcto, y si no lo es, hacer saltar un assert. De esta forma, se va, SIN perdida de tiempo, al fallo y no gastar un tiempo precioso en depurar. 
Cierto, esto ralentiza la ejecución, pero después, cuando no salta ningún assert, estás comprobaciones, se pueden comentar en código.


Un ejemplo de ello. Cuando estaba implementando la "Triangulación Restringida de Delaunay", tenía este método que llamaba cada vez que creaba un objeto de la clase CTriangle.



// cheque que el triangulo está construido correctamente
// true si tiene algun error.
bool CTriangle::checkError(void)
{
bool bError = false;


if (isRepeatVertex())
bError = true;
if (isRepeatVertexPoint())
bError= true;
if (checkAdyacents())
{
bError = true;
}


if ( !bError )
{
//TRACE("---------------- ERROR TRIANGULO ------------\n");
//debugView();
}



return bError;
}


checkError comprobaba que el triangulo estaba bien construido, tanto en sus indices al array de puntos, como que los puntos eran distintos entre sí, y en sus triangulo adyacentes. De esta forma, al saltar este chequeo, era un signo de que algo mal estaba en el algoritmo de Triangulación.

Otra forma que ayuda para depurar, es identificar de forma única a cada objeto que se crea. De esta forma, puedes trazar la evolución de un objeto y centrarte en el solamente. Por ejemplo, en CTriangle tenía:

int m_id;

Así, si saltaba el método checkError, con el id del triangulo, podía centrarme en como se creaba este triangulo y su relación con sus adyacentes.


Con todo esto, creo que no debemos de pensar al codificar, que todo saldrá bien, sino debemos pensar, que algo irá mal y tendremos que depurar. Entonces, tendremos que codificar para que dicha depuración sea más fácil, eficaz y productiva.






Aquí, os dejo una demo de un programa que utiliza dicho algoritmo

No hay comentarios:

Publicar un comentario