Carrer Dolores Ibarruri, 32 46920 Mislata (Valencia) Tel.: 96 383 18 87 Fax: 96 383 67 09 centre@[Link] [Link].
com
/** Constructs an analyzer for a given word. @param aWord the word to be analyzed (not null) */ public WordAnalyzer(String aWord) { assert aWord != null; word = aWord; } Fjate que assert es una palabra reservada (similar a return o throw), y no un mtodo, por lo que no es necesario el uso de () en la condicin. Las aserciones estn deshabilitadas por defecto, para mayor eficiencia. Comprobar una asercin conlleva una pequea cantidad de tiempo, y en una aplicacin bien depurada, no es necesario comprobar condiciones que no van a ocurrir nunca. Para testeo y depuracin, activaremos las aserciones. En Eclipse, selecciona el men Run / Run Configurations. Dentro de la pestaa Arguments, en el cuadro de texto VM arguments, aade ea.
Ejercicio 8 Ejecuta la versin modificada de WordAnalyzerTester (es decir, la versin en la que hayas aadido la sentencia assert) con las aserciones habilitadas en Eclipse. Cul es ahora la diferencia? LOGGING Las excepciones y las aserciones son tiles para detectar errores drsticos que hacen terminar abruptamente a un programa. Pero a menudo, un programa incorrecto no muere, sino que arroja un resultado incorrecto. Con el fin de comprobar lo que un programa realiza, frecuentemente se introduce cdigo como el siguiente: [Link]("He llegado hasta aqu!"); En esta seccin, practicaremos las sentencias de logging (rastreo). Hacer un rastreo es fcil. En lugar de utilizar el mtodo [Link], simplemente usaremos [Link]. Por ejemplo: [Link]("A punto de terminar. i=" + i); El mtodo anterior es mejor que [Link] por dos razones:
[Link]()
No hay que tener vergenza en usar el logging. Puedes dejar las sentencias de logging en tu cdigo, demostrando una buena prctica de la ingeniera del software. Es muy fcil activar y desactivar las sentencias de logging.
chale un vistazo al fichero WordAnalyzerTester2. Este programa comprueba el mtodo firstMultipleCharacter de la clase WordAnalyzer. Este mtodo tiene un error. Ejercicio 9 Qu entrada al mtodo firstMultipleCharacter no proporciona el resultado esperado? Utiliza el paquete [Link] para introducir las sentencias de logging.
Ejercicio 10 Cul es el cdigo de tu mtodo find?
Ejercicio 11 Qu salida se obtiene cuando se ejecuta la clase WordAnalyzerTester2?
Ejercicio 12 Observa los mensajes de logging. Explica por qu el mtodo firstMultipleCharacter no funciona.
Ejercicio 13 Modifica el mtodo firstMultipleCharactar o el mtodo find para corregir el problema. Qu correccin has realizado?
Ejercicio 14 Ejecuta el programa de nuevo. Qu salida se obtiene ahora?
Ejercicio 15 Aade la sentencia [Link]([Link]) al mtodo main de la clase WordAnalyzerTester2, para deshabilitar los mensajes de logging. Ejecuta de nuevo el programa. Qu salida se obtiene?
Ejercicio 16 Imagina que encuentras otro error y deseas habilitar de nuevo los mensajes de logging. Cmo lo haras? En programas pequeos, el uso de [Link] funciona bien. Conforme los programas aumentan de tamao, se puede controlar el logging de forma ms sofisticada. Se pueden usar diferentes niveles de logging. En lugar del mtodo info, se invocan a los mtodos severe para mensajes importantes o fine para mensajes menos importantes. A continuacin, se invocara al mtodo setLevel para ajustar el nivel de los mensajes de logging que queremos visualizar durante la ejecucin. Tambin es posible definir nuestros propios objetos dentro del Logger, adicionalmente al [Link].
DEPURACIN La mayor parte de los entornos de desarrollo, incluyendo Eclipse y BlueJ, tienen un depurador (debugger), una herramienta que permite ejecutar un programa a cmara lenta. As pues, es posible observar qu sentencias se estn ejecutando y los contenidos de las variables del programa. Los depuradores pueden ser complejos, pero afortunadamente es suficiente con conocer slo tres operaciones: (1) Incluir un punto de ruptura. (2) Ejecutar una instruccin. (3) Inspeccionar una variable. En este ejercicio, usaremos el debugger de Eclipse. Para esta parte, necesitaremos la clase WordAnalyzerTester3 que comprueba el mtodo countRepeatedCharacters, que es incorrecto. Este mtodo cuenta las subcadenas que tienen un carcter repetido en una palabra. Por ejemplo, para la palabra mississippiii, devolvera 4. Ejercicio 17 Crea un nuevo proyecto en Eclipse, e incluye el archivo [Link]. Ejecuta el proyecto. Qu salida se obtiene? Establecimiento de puntos de ruptura Desgraciadamente, el depurador no puede volver atrs, por lo que no se puede ir al punto de fallo y volver atrs. En su lugar, se puede ejecutar el programa a velocidad normal hasta que su ejecucin se acerque al punto de fallo. Entonces es posible la ejecucin instruccin a instruccin, viendo lo que ocurre. Se sabe que las dos primeras llamadas al mtodo test en WordAnalyzerTester3 dan el resultado correcto. No ser pues interesante depurarlas. En su lugar, iremos directamente a la tercera llamada. Pondremos un punto de ruptura en la lnea correspondiente, por lo que el depurador se detendr tan pronto como alcance dicha lnea. Mueve el cursor hasta la tercera lnea del mtodo test. Selecciona entonces el men Run / Toggle Line Breakpoint. Se visualizar entonces un punto azul a la izquierda de la lnea, indicando el punto de ruptura. En la ventana Package Explorer, haz clic con el botn derecho del ratn y selecciona la opcin Debug As / Java Application.
El depurador ahora ejecutar el programa. Cuando se alcance el punto de ruptura, aparecer el siguiente mensaje:
Simplemente haz clic en el botn Yes, para cambiar el entorno a la perspectiva de depuracin.
La lnea verde indica que el depurador se ha detenido.
Ejercicio 18 Lanza el depurador tal y como se ha descrito. Qu salida se obtiene en la ventana de la consola? Por qu se obtienen dos lneas de salida y no tres? Ejecucin paso a paso Ahora deseamos ejecutar paso a paso el mtodo test. Eclipse permite este modo de ejecucin de tres formas diferentes: (a) Seleccionando del men Run / Step Into. (b) Presionando la tecla F5. (c) Haciendo clic en el icono step into en la ventana de depuracin.
Ejercicio 19 Ejecuta el comando Step Into. Qu ocurre?
Ejercicio 20 Ejecuta el comando Step Over. Qu ocurre?
Ejercicio 21 Deseamos investigar por qu obtenemos un valor incorrecto en el contador para el tercer caso. En esta ocasin, qu debemos ejecutar Step Into o Step Over? Por qu?
Ejercicio 22 Ejecuta Step Into hasta que nos encontremos dentro del mtodo length de la clase String. Ejecuta entonces Step Return. Qu ocurre? Inspeccin de Variables Observa dentro de la ventana de variables en la esquina superior derecha:
Se puede ver el contenido de [Link]()), c e i.
tres
variables,
this
(el
parmetro
implcito
de
la
llamada
El tringulo al lado de this indica que puedes expandir la variable. Ejercicio 23 Haz clic en el icono a la izquierda de this. Qu ocurre?
Ejercicio 24 Por qu no aparece la opcin anterior en las variables c e i? Ahora, contina ejecutando el comando Step Over. Observa qu ocurre con los valores de las variables c e i. Se puede comprobar que i se incrementa cada vez que se ejecuta el bucle. Ejercicio 25 El valor de c se incrementa tres veces. Cules son los valores de i para cada incremento?
Ejercicio 26 Observa el valor de [Link]. Qu hay de especial en las tres ocasiones en las que c se incrementa? Corregiremos el error en la siguiente seccin. Por ahora, selecciona el men Run / Resume. El programa se ejecutar otra vez normalmente, hasta que llegue al siguiente punto de ruptura o concluya su ejecucin. Ejercicio 27 Qu ocurre cuando se ejecuta el comando Resume? Correccin del error El mtodo countRepeatedCharacters busca secuencias de caracteres de la forma xyy, es decir, un carcter seguido por el mismo carcter y precedido por otro diferente. Esto es el inicio de un grupo. Fjate que hay dos condiciones. La condicin: if ([Link](i) == [Link](i + 1)) comprueba yy, es decir, un carcter seguido de otro como l. Pero si tenemos la secuencia yyyy, slo hay que contabilizarlo una nica vez. Por ello queremos asegurarnos que el carcter anterior es diferente, if ([Link](i - 1) != [Link](i)) Esta lgica funciona casi perfectamente, encuentra tres inicios de grupo: aabbcdaaaabb Ejercicio 28 Por qu el mtodo no encuentra el inicio del primer grupo (aa)?
Ejercicio 29 Por qu no es posible corregir el error simplemente estableciendo inicialmente el valor 0 para la variable i en el bucle for?
Ejercicio 30 Corrige el error. Cul es ahora el cdigo del mtodo WordAnalyzerTester3 de nuevo. Qu resultado se obtiene ahora? countRepeatedCharacters? Ejecuta
CONCLUSIN Est el programa ahora libre de errores? Esta no es una pregunta que el depurado pueda contestar. Como el clebre informtico Edsger Dijkstra afirmaba: El testeo de un programa puede utilizarse para demostrar la existencia de errores, pero nunca para demostrar la ausencia de stos