Introducción al lenguaje Java Práctica Editor de Línea (Diciembre 2006) 1 Introducción al lenguaje Java Práctica Editor de Línea Dpto. LSIIS. Unidad de Programación Normas y Objetivos Objetivo: el objetivo de esta práctica es la familiarización del alumno con la programación orientada a objetos en Java. Para ello, se deberá implementar un editor de línea simple. Evaluación: La práctica se realizará de forma individual. La nota que se obtenga en esta práctica será la nota final de la asignatura. Se mantendrá el mismo enunciado de práctica para las demás convocatorias de este curso académico. Entrega: La entrega de las implementaciones se realizará a través de la página web: http://lml.ls.fi.upm.es/entrega Fecha límite: el plazo límite es el día 16 de Febrero de 2007 a las 10:00. Código Auxiliar: La realización de esta práctica requiere la utilización de los ficheros auxiliares que se pueden encontrar en: http://lml.ls.fi.upm.es/ijava/materiales/practica/codigo Publicación de Notas: La publicación de las notas de la práctica se anunciará a través del foro de la asignatura. Detección Automática de Copias: Cada práctica entregada se comparará con el resto de prácticas entregadas en todos los grupos de la asignatura. Esto se realizará utilizando un sofisticado programa de detección de copias. Consecuencias de haber copiado: Todos los alumnos involucrados en una copia, bien por copiar o por ser copiados, quedan inhabilitados para presentarse a todas las convocatorias de examen del presente curso, además de la posible apertura de expediente académico. 1. Editor de linea En esta práctica, el alumno deberá implementar en Java el comportamiento de un editor de línea simple. El editor ejecutará comandos sobre una secuencia de caracteres (string) dada inicialmente. El editor tendrá un estado interno que contendrá: El texto que se está editando. La posición del cursor en el momento actual. Una cola para implementar las operaciones copiar y pegar. Una pila para implementar la operación deshacer. Los comandos a la entrada vienen representados por un caracter y en algunos casos llevan un argumento separado por un espacio (escribir y sobrescribir), y son:
2 Práctica Editor de Línea (Diciembre 2006) Introducción al lenguaje Java Comando Operación Texto antes Texto después Comentario > avanzar...vw......vw... < retroceder...vw......vw... b borrar...vw......w... Pone al final del string un blanco e x escribir...vw......xvw.. Borra el último caracter del string (blanco) s x sobrescribir...vw......xw... c copiar...vw......vw... El caracter v se ha copiado al portapapeles p pegar...vw......cvw.. El primer caracter del portapapeles era c d deshacer Deshace modificaciones al texto a aceptar Acepta los cambios hasta ahora El subrayado en el texto indica la posición del cursor. Todo carácter leído que no se corresponda con un comando se ignorará. Obsérvese que los comandos no modifican el tamaño del string, ya que cuando se añade un caracter, se elimina el último, que debe ser un blanco ( ), y cuando se borra un caracter, se añade al final un blanco. Las situaciones de error se pueden dar porque algunas de las operaciones tienen una precondición, que en caso de no cumplirse producirá un error. En ambos casos el procedimiento a programar deberá devolver el estado de error adecuado. Los errores posibles son: Código de salida Explicación En operaciones Error_Final_Texto Estamos al final avanzar Error_Principio_Texto Estamos al principio retroceder Error_Lleno No hay espacio (no hay un blanco al final) escribir, pegar Error_Imposible_Pegar El portapapeles está vacío pegar Error_Imposible_Deshacer No hay nada que deshacer deshacer Correcto No ha habido error Cualquiera El error Error_Final_Texto no se produce al escribir, copiar ni pegar porque cuando estamos al final del texto el cursor en ese caso no se mueve. La operación borrar tampoco produce errores, porque borra el caracter en la posición del cursor sin mover éste (no es backspace sino delete ). El portapapeles del editor puede albergar un número indefinido de caracteres, todos los que se copien con la operación copiar antes de ejecutar el correspondiente pegar. Los caracteres se pegarán en el mismo orden en el que fueron copiados. De ahí que haya que utilizar una cola para implementar el portapapeles. La operación deshacer deshará únicamente operaciones que modifiquen el texto, por lo tanto no servirá para deshacer operaciones que solamente cambien la posición del cursor (operaciones avanzar o retroceder), o el portapapeles (copiar). En consecuencia, sólo las operaciones borrar, escribir, sobrescribir y pegar pueden ser deshechas. Dado que se pueden deshacer un número ilimitado de cambios, para implementar la operación se usará una pila en donde guardaremos la operación realizada. El cursor, después de cada deshacer, se quedará en la posición en donde la operación inversa se haya ejecutado. La operación aceptar acepta todos los cambios introducidos en el texto, de forma que ya no se podrán deshacer (olvidamos todos los cambios que hemos hecho hasta ahora). 2. Ejemplos de ejecución de comandos A continuación se muestran ejemplos de ejecución de comandos. Si el texto inicial de un ejemplo es igual al texto final del precedente, se supone que es una continuación de los comandos anteriores (lo cual tiene utilidad si se ejecutan operaciones deshacer). En los casos en los que se produce un error, ese error ha sido provocado por el último comando de la secuencia de comandos, que evidentemente no es aplicado a la línea de texto.
Introducción al lenguaje Java Práctica Editor de Línea (Diciembre 2006) 3 Comandos Texto inicial Texto final Error? 1234567890 1234567890 >>> e j e o " " " jo" Correcto << s a > b " jo" " ao " Correcto e t e i " ao " " ato" Error_Lleno <<<ccc> e l pppp "hola " "hola lola " Error_Imposible_Pegar cc>pcpp "bueno " "buebnuno" Correcto cc>pcpp "bueno " "buebnuo" Error_Lleno << b e x c << s i < p>> "datos " "dastis " Correcto << b e x c << s i < p "datos " "dastis " Correcto >> d "dastis " "datis " Correcto d "datis " "datxs " Correcto d "datxs " "dats " Correcto e h "dats " "daths " Correcto dd "daths " "datos " Correcto d "datos " "datos " Error_Imposible_Deshacer e + a d "54 " "5+4 " Error_Imposible_Deshacer 3. Diseño En el diagrama de clases que se incluye en este apartado se muestran las clases que deben formar parte de la implementación de la práctica. Junto con el enunciado de la práctica, se proporciona el código de la clase ProcesarPrueba y el enumerado NotificacionProceso. La clase ProcesarPrueba contiene el main, y se encarga de proporcionar una batería de casos de prueba al método prueba de la clase PruebaEditor. Los ficheros de los casos de prueba se llaman datos?.dat. Los casos de prueba proporcionados no son exhaustivos, por lo tanto el alumno deberá diseñar más casos de prueba con el fin de asegurarse de la corrección de su práctica. El método prueba recibe los comandos proporcionados en cada caso de prueba (parámetro comandos), y se los debe aplicar por orden de aparición al texto proporcionado como entrada en el caso de prueba. El método prueba finalizará su ejecución, o cuando haya evaluado todos los comandos, o cuando al evaluar uno de los comandos, se genere un error. Si la evaluación de todos los comandos resulta ser correcta, el procedimiento prueba devuelve el valor Correcto y en el parámetro texto el estado final de la línea de texto. En cambio, si se produce algún error al evaluar uno de los comandos, el método prueba devuelve el tipo de error generado, y en el parámetro texto el estado final de la línea de texto cuando se generó el error.
4 Práctica Editor de Línea (Diciembre 2006) Introducción al lenguaje Java
Introducción al lenguaje Java Práctica Editor de Línea (Diciembre 2006) 5 Cada vez que el método prueba lea un comando, debe crear el objeto del tipo de operación que corresponda a ese comando, y luego debe llamar al método procesar (clase Editor), que a su vez llamará al método ejecutar (interfaz Operación). Como se puede deducir del diagrama de clases, cada clase que implementa la interfaz Operacion, debe implementar un método ejecutar, que lógicamente debe ser diferente en cada clase. En aras de la claridad del diagrama de clases, se han omitido los métodos constructores y los métodos get y set. Sin embargo, esto no significa que no sean necesarios en la implementación de la práctica. La pila piladeshacer y la cola portapapeles se pueden implementar utilizando la clase genérica Stack 1 y la clase genérica LinkList 2 respectivamente, que están disponibles en la API de Java 1.5. 4. Ficheros a entregar El alumno deberá entregar un fichero practica.jar que contenga los ficheros proporcionados y además, un fichero PruebaEditor.java y un paquete Editor que, a su vez, contenga los siguientes ficheros: Editor.java, Operacion.java, Avanzar.java, Retroceder.java, Deshacer.java, Copiar.java, OperacionReversible.java Escribir.java, Sobreescribir.java, Borrar.java y Pegar.java. El código fuente debe estar debidamente comentado con formato javadoc. Asimismo, se deberán incluir en el fichero practica.jar los ficheros html generados con la utilidad javadoc. 1 véase un ejemplo de utilización en http://www.java2s.com/code/javaapi/java.util/newstacke.htm 2 véase un ejemplo de utilización en http://www.java2s.com/code/javaapi/java.util/newlinkedliste.htm