Modulo 3 Programacion Orientada A Objetos
Modulo 3 Programacion Orientada A Objetos
Introducción
Competencias de la asignatura
Ideograma ............................................................................................................................. 3
Introducción ........................................................................................................................... 4
1 Manejo de colecciones, listas encadenadas e Iteradores en JAVA ........................... 4
2 Ejercicios y ejemplos de aplicaciones avanzadas con POO...................................... 10
3 Uso de JUnit para pruebas unitarias de código.......................................................... 34
Glosario ............................................................................................................................... 37
Bibliografia ................................................................................. Erreur ! Signet non défini.
3.1 Actividades Propuestas .................................................................................39
4
Ideograma
Colecciones
Ejercicios y ejemplos
de aplicaciones
Modulo 3 avanzadas con POO
Colecciones y manejo avanzado aplicaciones
OO con Java
Uso de Junit para
pruebas unitarias de
código
5
Introducción:
Este modulo final del curso de Programación Orientada a Objetos tiene como propósito
principal detallar algunas de las clases JAVA, subrayando su relación con los
conceptos vistos en los dos módulos pasados: Acoplamiento, Herencia,
encapsulamiento etc. Para ello inicialmente se revisará con detalle algunas de las
clases que facilitan el manejo de conjuntos de datos tale como : colecciones,
iteradores, listas, Vectores.
Por último, se trabajará la iteración 3 y 4 del ejercicio visto en el primer modulo (Tablero
mágico) , para profundizar la escritura de interfaces utilizando SWT y JWT, tema que
fue abordado inicialmente en el modulo 2.
Una lista es una colección en la cual los objetos se organizan de forma secuencial. Es
decir, una lista tiene un primer ítem, un segundo ítem, un tercer ítem y así
sucesivamente. Para cualquier ítem de la lista existe un suceso excepto para el ultimo.
Por su parte un Set es una colección de elementos sin ningún orden preestablecido
pero cuya principal característica es que no permite la existencia de objetos duplicados
o repetidos.
Figura 2. Listado fuente de la clase Lista Ejemplo que implementa un ArrayList haciendo uso de
la interfaz List
Se aprecia que se han importado 3 clases del Framework Java : Iterator, List y
ArrayList. Las dos primeras son las interfaces que definen la colección de datos y la
forma como se va a recorrer (Iterator) , mientras que ArrayList es la clase directa que
implementa los métodos de la lista. Los métodos principales disponibles del ArrayList
son:
La siguiente sección del presente modulo estará dedicada a ilustrar la aplicación de los
métodos de Orientación a Objetos utilizando el ejemplo del primer modulo, pero
incluyendo algunas complejidades adicionales que permitirán utilizar otras clases de
algunos paquetes de java.
El primer paso es rediseñar el pad de dibujo para generalizar la noción de formas que
pueden ser hechas. Actualmente, la única forma que puede ser dibujada es un trazo
que está compuesto por uno o varios puntos. Para ir mas allá y generalizar el concepto
de forma, se introduce el uso de la clase Forma para representar cada una de las
formas que puede ser dibujada, siendo el trazo (Trazo) una de ellas.
11
Figura 8. Listado fuente de la clase Trazo redefinida para soportar el dibujo de formas en la
aplicación del tablero magico
Por otra parte la clase Forma, que es extendida por Trazo, puede ser visualizada en la
figura 9.
Figura 9. Listado fuente de clase Forma luego del refactoring o rediseño hecho para la
aplicación del Tablero Mágico
Al hacer el rediseño de las clases para soportar el uso de diferentes formas al dibujar
al interior del Tablero mágico, se ha utilizado el concepto de patrones y
específicamente el Patrón de Estrategia. La clase Forma es la clase abstracta de
estrategia mientras que la clase Trazo es la clase concreta. El uso de patrones en la
14
Ahora bien , con el propósito de pintar diferentes formas, tales como : óvalos, líneas y
rectángulos, el comportamiento de el listener del canvas debe ser un tanto diferente en
cuanto a cómo se comporta al dibujar las mismas. El diseño más flexible y elegante es
aquel que permite encapsular el comportamiento para dibujar una figura especifica
utilizando una clase que se llamara Herramienta. Esta representa algo así como un
maletín de donde se pued e escoger el tipo de herramienta a utiliz ar correspondiendo a
la forma que se quiere pintar El diagrama de clases se muestra en la figura 10
Este diseño permite tener muchas más extensiones para soportar formas y
herramientas adicionales.
15
Figura 11. Listado fuente de la interfaz Herramienta para el Tablero mágico rediseñado
Figura 13. Modificaciones para la clase TableroCanvasListener para soportar el uso de diversas
formas al dibujar en el tablero mágico rediseñado
Tal como se aprecia en la figura 13, se introdujo el uso de las siguientes artefactos:
interfaz herramienta, clase abstracta HerramientaAbstract y finalmente su
implementación a través de TableroHerramienta, como reemplazo de la forma de
graficar utilizando directamente las clases de awt. Es en esta última clase donde se
delega toda la responsabilidad para responder a los eventos del
TableroCanvasListener. Existe también una gran diferencia en la manera como se crea
el canvas , puesto que en este rediseño se ha introducido un método llamado make
Canvas() en la clase Tablero, el cual permite crear instancias de las subclases de
Tablero Canvas , las cuales representan versiones mejoradas de el canvas. Esto
completa la tercera iteración de la aplicación del tablero mágico , con la cual se han
ilustrado las diferentes formas de aplicación de los conceptos de orientación a objetos
revisados en el primer y segundo modulo al desarrollo de aplicaciones
En seguida se revisara la siguiente iteración del ejercicio del tablero mágico , en la cual
el objetivo es mejorar la funcionalidad del pad de dibujo. EN la iteración anterior se
dieron paso que permiten adicionar estas nuevas funcionalidades de forma fácil e
incremental. El pad de dibujo tendrá una barra de herramientas a la izquierda en el
canvas, con la cual se podrá seleccionar la forma libre, las líneas, los ovales y los
rectángulos . Esta versión también adicionara un nuevo menú – Herramientas – en la
barra de menú. La utilidad para dibujar podrá ser seleccionada utilizando el ítem de
menú correspondiente.
En esta iteración, se soportara el dibujo utilizando las siguientes formas: línea, ovalo y
rectángulo. Estos tres tipos de formas comparten características comunes. En primera
instancia pueden ser completamente definidas utilizando dos puntos : los dos puntos
extremos para las líneas y las dos esquinas diagonalmente opuestas para los
rectángulos y los ovalos. Se llamaran estos puntos los extremos. Una clase abstracta
llamada FormaDosPuntos se introduce para capturar esta funcionalidad común. El
diseño correspondiente a las formas en esta iteración se muestra en la figura 14.
18
Figura. 14. Diseño de clases para el pad de dibujo de la aplicación del Tablero Mágico
Métodos Descripción
Figura 15. Listado Fuente clase abstracta FormaDosPuntos para la aplicación del Tablero
mágico
20
21
Las tres clases concretas para cada forma se definen como subclases de la clase
FormaDosPuntos . A continuación se muestra el código fuente para cada una de ellas.
22
Figura 16. Listado fuente clase FormaLinea para dibujar una línea en el tablero mágico
Figura 17. Listado fuente clase FormaOvalo para dibujar un ovalo en el tablero mágico
23
Figura 18. Listado fuente clase FormaRectangulo para dibujar un rectángulo en el tablero
mágico
Teniendo en cuenta el nuevo rediseño, se deberá también tener una nueva forma para
manejar las herramientas. Es por ello que, el pad de dibujo proveerá un conjunto de
diferentes herramientas para pintar. Cada herramienta extiende la clase abstracta
HerramientaAbstracta construida en la anterior iteración. La clase HerramietaKit
representa por tanto el conjunto de herramientas soportada por el pad de dibujo y lleva
cuenta de la Herramienta actualmente seleccionada. Las respuestas del mouse a las
acciones press o release y el drag del mouse en el canavás de dibujo depende de la
herramienta seleccionada. En la clase HerramientaKit, cada herramienta debe ser
identificada o por su nombre o por su posición en la HerramientaKit. Los métodos de la
clase HerramientaKit se resumen a continuación:
25
Métodos Descripción
Para poder describir el comportamiento del dibujo de cada forma y desacoplar la clase
herramientas del pad de dibujo, se introduce la clase DosExtremosHerramienta, la cual
tendrá el siguiente rol dentro de nuestra aplicación:
En razón de las smilaridades de la líneas, los rectángulo y los óvalos se puede diseñar
una sola herramienta, la clase DosExtremosHerramienta, la cual gestionara el dibujo de
las tres formas. Cada forma se identifica con una constante entera: LINE, OVAL y
RECT. Los campos de la clase DosExtremos Herramienta se resumen a continuación:
28
Campo Descripción
Figura 21. Pantallazo de la Ejecución del Tablero Mágico después del refactoring (iteraciones 3 y 4)
Cada prueba de un programa, es decir, test suite, se escribe como una subclase de la
clase TestCase. Se requiere con el nombre del test suite es requerido. Cada test case
35
se escribe como un método separado. Los nombres de los métodos de tests debe
comenzar con el prefijo test. El método suite() se requiere en el programa de test y
agrega todos los casos de test de la clase en un testsuite.
Existen dos enfoques básicos para creara casos de prueba y medir la completez de un
conjunto de casos de prueba: los enfoques de caja negra (black box) y de caja blanca
(White box) . El primero se enfoca en la creación de casos de prueba basados en la
especificación de un solo componente, sin tener en consideración como se implementa
el mismo. Por su parte el segundo enfoque, se focaliza en generar los casos de prueba
basado en la estructura del código que implementa el componente. Uno de los
métodos más importantes del enfoque de caja negra es la llamada prueba de
particiones equivalentes de entrada. En este enfoque, el espacio de entrada de un
programa se divide en un numero de particiones de equivalencia. Este espacio puede
incluir tanto elementos de entrada validos como no validos. Los elementos que están
en una misma partición de equivalencia son los datos que serán procesados por el
programa de una manera similar. Por tanto, se puede deducir el comportamiento de un
programa solamente probando una muestra representativa de la partición de
equivalencia. Usando este enfoque, se considera adecuado un conjunto de casos de
prueba si se prueba al menos un representante para cada partición de equivalencia.
36
37
Glosario
Patrón de diseño:
Clase abstracta: Una clase que contiene por lo menos un método abstracto. Las
clases abstractas no pueden ser instanciadas . Debe ser extendida por una clase que
implementa los métodos abstractos
Interfaz: Una forma especial de clase que declara las funcionalidades pero no provee
su implementación. Una interfaz solamente declara constantes y métodos abstractos.
Lista: Una colección ordenada de elementos en los cuales sus elementos son
indexados comenzando desde 0. Las listas también se conocen como secuencias
Bibliografía
Libros
Larman , Craig. UML 2 et les design patterns. Editorial Perarson. 3ra. Edicion. 2005
39
Actividad 1. Elaborar una aplicación utilizando eclipse, java y alguno de los framework
para gráficos: AWT, JWT o SWT , que permita implementar un juego de picas y fijas
de 4 posiciones enteras (ver: http://www.youtube.com/watch?v=MuRmaeymg3A)
Actividad 2. Elaborar una aplicación que permita implementar el juego de tres en línea.
Ver: http://www.juegoswapos.es/juegos-de-tres-en-raya.htm