15 de agosto de 2006

No hacer RETURN dentro de WITH

Artículo original: Don't RETURN Inside WITH
http://doughennig.blogspot.com/2006/04/dont-return-inside-with.html
Autor: Doug Hennig
Traducido por: Pablo Roca Rozas


En la conferencia GLGDW 2006, y durante la excelente sesión de Marcia Akins sobre mejores prácticas sobre diseño de clases, mencioné que una de las causas principales de los errores C5 es utilizar RETURN dentro de estructuras WITH.

Dada la cantidad de gente que vino hacia mí después de la sesión, esta claro que esto no es muy conocido, así que aquí esta la explicación.

No estoy seguro que sucede exactamente cuando se utiliza una estructura WITH, pero claramente VFP almacena una referencia al objeto especificado por la sentencia WITH en algún lugar. Obviamente, la referencia debe ser eliminada en algún punto o sino el objeto no se puede liberar, pero sospecho que hay un fallo/agujero de memoria (memory leak) en esas condiciones, y que cuando suceden un numero suficiente de estos fallos, pues obtienes un error C5. Lo molesto sobre los fallos de memoria es que el error C5 puede suceder en zonas lejanas de código y bastante tiempo después, así es casi imposible hacer un seguimiento para los mortales como yo que no hacemos depuración de código en C.

Empecé a ver esto hace unos 18 meses. Teníamos informes regulares sobre errores C5 de gente que iban al Diseñador de Informes con nuestro producto Stonefield Query. El problema es que no era reproducible, nunca pude conseguirlo cuando lo intenté (lo conseguí alguna vez cuando no quería, como por ejemplo en demos!). Fui a través del código relacionado con el Diseñador de Informes investigando con mucho detalle, pero no pude encontrar el motivo. Entonces recordé algún extraño comportamiento años atrás:

Si utilizaba el RETURN dentro de una sentencia WITH y bajo ciertas condiciones entonces el objeto no se podía liberar. Ese problema fue arreglado en una versión posterior de VFP, así que me olvidé del asunto, pero se me ocurrió que yo lo había utilizado mucho en mi código, a pesar de que no es una buena practica. Así que gaste un día o dos haciendo refactoring (recodificando) cada RETURN que tuviera dentro de un WITH, funcionara o no, pero nunca volvimos a tener ningún error C5 desde que liberamos esa versión del Stonefield Query. Y pensando que esto puede quedar escondido detrás de los titulares, tiene sentido que esto sea la culpa del problema.

Así que atención a todo el mundo: Si estas teniendo errores C5 y te estas tirando de los pelos para ver donde está el problema, mira a todas tus estructuras WITH y mueve cualquier instrucción RETURN para debajo del ENDWITH. No solo es una buena práctica de programación, sino que podrá eliminar este problema que te puede volver loco.

No hay comentarios. :

Publicar un comentario