Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
Programación orientada a objetos
Tabla de Contenido
1. Introducción ............................................................................................................................. 3
2. Ideograma ................................................................................................................................. 5
Ejemplo ...................................................................................................................................... 15
Glosario ......................................................................................................................................... 39
Bibliografía .................................................................................................................................... 40
2
Programación orientada a objetos
Introducción
En realidad, la programación orientada por objetos significa una nueva forma de ver la realidad y
por ende un nuevo enfoque en cuanto a su abstracción y la solución de problemas que a ella
concierne. Los enfoques y metodologías relacionados con el enfoque estructurado concebían la
realidad como una dualidad en la cual se distinguían por un lado los procesos y por otro lado los
datos. En ese sentido el diseño de nuevos programas y sistemas de información se enfocaba
claramente a encontrar primero a partir del análisis de un entorno un diseño de los datos que
respondiera a los elementos que mejor representaran una realidad y una vez identificados los datos
el trabajo restante consistiría en encontrar cuales serían las posibles funciones (funcionalidades)
que se permitieran transformar los datos identificados con miras a describir las principales
operaciones de un negocio.
3
Programación orientada a objetos
Con todo lo anterior en mente, el estudioso del presente contenido, tendrá la oportunidad de
aproximarse a la programación orientada por objetos y descubrir en este primer módulo los
conceptos y principios básicos de programación orientada por objetos y al mismo tiempo
aproximarse a java como lenguaje OO con algunos ejemplos y ejercicio.
4
Programación orientada a objetos
1. Ideograma
Modularidad
Abstracción
Encapsulamiento
Herencia
Ejercicios
5
Programación orientada a objetos
2. Tópicos Esenciales
2.1.Modularidad
Los dos criterios básicos para la descomposición de los sistemas de software son:
Cohesión: La cual se refiere a la relación funcional entre las entidades dentro de un módulo.
Acoplamiento: El cual se refiere a la interdependencia entre diferentes módulos
6
Programación orientada a objetos
2.2. Abstracción
7
Programación orientada a objetos
interfaz contractual del servicio telefónico y sirve como abstracción del servicio telefónico desde
la perspectiva del usuario.
2.3.Encapsulamiento
8
Programación orientada a objetos
contractual es básicamente igual. Lo único necesario para que un usuario pueda comunicarse
telefónicamente es saber para un aparato telefónico especifico descolgar, marcar y colgar, no
importa qué tipo de mecanismo de telefonía está utilizando: análoga, digital, 3G, 4G etc. Sin
cambiar la interfaz contractual, los usuarios telefónicos pueden ahora gozar de una mejor calidad
de sonido y una mayor seguridad en sus comunicaciones.
2.4.Polimorfismo
Esta posibilidad es implementada y puesta en práctica usando una de las características más
importantes de los lenguajes de programación orientada a objetos: enlace dinámico de métodos.
Este puede hacerse en tiempo de ejecución o en tiempo de compilación.
9
Programación orientada a objetos
Antes de ahondar más en el tema de enlace dinámico es necesario discutir otros aspectos de algunos
términos de orientación a objetos tales como: variable, objeto, clase y tipo.
Una variable es un espacio de memoria que nos permite contener algún dato para representar un
hecho de la realidad. La variable tiene un identificador, un almacenamiento relacionado con la
misma y un tipo que nos dice a qué categoría pertenece la variable: booleana, entera, real, carácter.
En el curso de Lógica de programación se discutió acerca del significado de las mismas y se explicó
con algún grado de detalle su conceptualización.
Un objeto es una representación de algo tangible o intangible del cual queremos mantener
información. Un objeto está compuesto básicamente de una identificación, unas propiedades o
estado y un comportamiento.
El estado determina las condiciones en las que existe un objeto. Es la combinación de los valores
de las propiedades lo que determina en qué estado se encuentra un objeto y es en función de sus
transiciones que podemos determinar los diferentes momentos de la vida del objeto. Por ejemplo,
un vehículo (objeto) puede pasar de un estado detenido, en marcha, acelerando, desacelerando etc.
O también puede estar en reparación, estrellado, arreglado etc. Como lo veremos posteriormente
en términos de orientación a objetos es muy importante conocer cuáles son las posibles transiciones
de un objeto para así obtener el diagrama de transiciones del mismo. En la siguiente figura se ilustra
un diagrama de transiciones para un objeto.
10
Programación orientada a objetos
El comportamiento corresponde a las diferentes maneras de interactuar del objeto con su entorno.
Por ejemplo, en el caso del vehículo como responde a las acciones o mensajes dirigidos por otro
objeto, por ejemplo, el conductor. Este objeto puede enviar el mensaje arrancar al objeto vehículo
y la acción a seguir estará determinada por el comportamiento definido en la clase vehículo. Cada
acción definirá un método y el conjunto de los métodos de un objeto dará como resultado el
comportamiento general y especifico del objeto. Lo anterior se ilustra en la figura 2.
11
Programación orientada a objetos
2.5.Herencia
12
Programación orientada a objetos
Extensión entre dos clases. Decimos que la clase C2 extiende la clase C1y por tanto la clase
C2 se denomina subclase de la clase C1 y la clase C1 se denomina a su vez superclase de
C2.
Extensión entre dos interfaces. Cuando la interfaz I2 extiende la interfaz T1, la interfaz I2
se conoce como subinterfaz de I1 y a su vez la interfaz I1 se conoce como superinterfaz de
I2.
Implementación entre una clase y una interfaz. Cuando una clase C2 implementa la interfaz
I1, la clase C2 se conoce como la implementación de la interfaz I1 y la interfaz I1 se le da
el nombre de interfaz de la clase C2
Con respecto a la figura 3 es posible hacer las siguientes precisiones esa relación de extensión es
conocida también como especialización, y la relación inversa se conoce como generalización en
términos de la notación UML. La relación de implementación es conocida como realización en la
terminología UML.
Gráficamente como lo podemos apreciar en la figura la relación es representada por una flecha o
vínculo que parte de la subclase/subinterfaz y se dirige hacia la superclase/superinterfaz. La
13
Programación orientada a objetos
relación de extensión (sea esta especialización o generalización) es representada con una flecha
continua mientras que la relación de implementación es representada usando una flecha punteada.
Considerando el siguiente ejemplo que representa los diferentes grupos de estudiantes en una
universidad. La figura 4 muestra el diagrama de clases. Es fácil apreciar en esta grafica como la
herencia puede ser interpretada como una relación es-un (is-a). Por ejemplo, la clase posgrado es
una subclase de estudiante. El conjunto de estudiantes, es decir el conjunto de instancias de la clase
estudiante, es un superconjunto (superset) del conjunto de estudiantes graduados, es decir, el
conjunto de esto que todo estudiante de postgrado es un estudiante, y todo lo que se aplique a un
estudiante también se puede aplicar para el estudiante de postgrado. El conjunto de estudiantes es
una superclase de la clase de estudiantes graduados.
14
Programación orientada a objetos
Ejemplo
A continuación, revisaremos un ejemplo completo que nos permitirá entender con mayor precisión
los conceptos de orientación a objetos incluida la herencia, revisados en los anteriormente.
El objetivo de esta primera versión o iteración es entregar una versión de la aplicación que
contenga un número mínimo de funcionalidades. La aplicación consistirá de un frame (cuadro) que
contendrá un canvas (lienzo). Una primera impresión de la aplicación se aprecia en la figura 5.
15
Programación orientada a objetos
16
Programación orientada a objetos
En esta primera iteración, se desarrollan las clases que están sombreadas en la figura 6. Las
restantes son clases e interfaces pertenecientes a la librería de clases de java. Las clases a desarrollar
se ilustran en la figura 7.
Una vez sorteados los pasos 1 y 2, es decir el bosquejo y el diseño inicial de clases, procederemos
a la escritura de cada una de ellas: Tablero, TableroCanvas y TableroCanvasListener. Tomando
primero TableroCanvas, este será el primer componente de la interfaz gráfica (GUI) donde
tendremos todas las herramientas graficas a nuestra disposición. El Listado con el código fuente
completo lo pueden revisar en la figura No. 8. Esta clase es un bello ejemplo del concepto de
herencia. Ella misma extiende a la clase javax.swing.jPanel. Esta clase es una de las varias que
conforman el cuadro referencial y la librería Swing. Swing fue desarrollado como una respuesta a
las innumerables obstáculos y restricciones encontrado por los desarrolladores al utilizar el cuadro
grafico referencial de java (Abstract Window Toolkit).
Como una clase java que representa un conjunto de objetos con ciertas características y métodos
comunes, inicialmente la clase TableroCanvas contendrá los siguientes campos (atributos o
miembros en la terminología de POO):
17
Programación orientada a objetos
Por su parte la clase TableroCanvasListener (figura No. 9) manejara los eventos del mouse que
ocurren en el canvas. El comportamiento deseado del tablero contendrá inicialmente las
siguientes acciones:
El dibujo de un punto (pixel) se inicia cuando el botón derecho del mouse es presionado.
El dibujo continua mientras el mouse es presionado y movido al interior del canvas.
El dibujo del punto finaliza cuando se libera el botón derecho del mouse
18
Programación orientada a objetos
La clase TableroCanvasListener debe manejar las acciones de presionar y liberar el botón del
mouse y las acciones de arrastrar. Así que, debe implementar 2 interfaces de tipo listener:
MouseListener y MouseMotionListener. Los métodos relevantes para esta primera versión de
nuestro tablero mágico son:
El método mousePressed manejara el comienzo de cada punto o línea. Este método fija en verdadero
el valor de la variable mouseButtonDown y almacena la posición actual del mouse. Dicha posición
se obtiene invocando el método e.getPoint(). La posición es relativa a la esquina superior
izquierda del canvas.
Mientras el mouse es arrastrado, se crean una serie de eventos de tipo mouse drag (arrastrar el
mouse) en tiempo de ejecución. Cada evento indica la posición actual del mouse. El evento
mouseDragged maneja la continuación del punto o la línea. Dibuja una línea desde la posición actual
y actualiza la posición corriente o actual del mouse en el canvas del tablero.
El método MouseReleased maneja el final del dibujo de una línea, fijando el valor de la variable
mouseButtonDown del canvas a falso. Por otra parte, el constructor de la clase TableroCanvas
crea una instancia de la clase TableroCanvasListener y registra o inscribe los listeners
MouseListener y MouseMotionListener.
19
Programación orientada a objetos
Finalmente completando esta primera iteración encontramos en la figura 10 el listado del código
fuente de la clase Tablero, la cual será aquella desde la cual se invocaran y manejaran las otras
clases participantes en la aplicación. Como lo notaran, esta clase posee un método main que
convierte esta clase en una clase ejecutable, es decir será la primera clase invocada una vez inicie
la aplicación. Desde allí, se inicializa el canvas y se definen algunas de las propiedades de cada
uno de los contenedores de los objetos de la interfaz tales como: el color de fondo, la forma como
aparecerán los objetos, el título de la ventana del canvas y además se declaran y definen cada uno
de los listeners que utilizara la aplicación para controlar la interfaz.
20
Programación orientada a objetos
Figura 10. Listado del código fuente clase Tablero – Aplicación Tablero Mágico
Ahora se continua con una segunda iteración en el desarrollo de nuestro tablero mágico. Los
objetivos fijados para esta segunda iteración serán:
Guardar los dibujos internamente, de tal forma que puedan volverse a dibujar.
Guardar los dibujos en archivos y cargar los dibujos a partir de archivos.
Construir una barra de menús.
Usar menú de diálogos para facilitar a la interacción con la interfaz.
Crear una paleta de colores para seleccionar los mismos.
La figura 11 ilustra el siguiente objetivo en términos de interface mostrando la interfaz que vamos
a implementar en este segundo ciclo de desarrollo.
21
Programación orientada a objetos
Figura 11.Imagen de la Interfaz para la segunda iteración de la aplicación del Tablero mágico
Uno de los inconvenientes con la primera versión de nuestro tablero mágico tenía que ver con el
hecho que no podíamos minimizar nuestra aplicación porque perdíamos lo que habíamos dibujado
pues todo lo dibujábamos directamente en el canvas del objeto TableroCanvasListener y no lo
almacenábamos en ninguna otra parte internamente.
Al igual que en la primera iteración debemos, adicional al bosquejo de nuestra interfaz añadir los
siguientes pasos:
En esta segunda iteración, con el propósito de retener los dibujos y poder redibujar el canvas, los
dibujos serán almacenados internamente y repintados cuando sea necesario.
Para esto, se plantea utiliza la siguiente estructura:
22
Programación orientada a objetos
La clase Trazo representa un trazo simple en un dibujo. Puesto que necesitamos guardar los dibujos
en archivos, hemos hecho la clase trazo serializable, es decir permitirle que posea un mecanismo
para salvar y cargar los dibujos. Los campos de la clase Trazo son:
Campos Descripción
Points Lista de puntos que conforman el trazo
Color Color del trazo
Métodos Descripción
setColor() Fija el color del trazo
getColor() Selecciona el color del trazo
addPoint Adiciona un punto al trazo
getPoints() Retorna la lista de puntos
23
Programación orientada a objetos
Por otra parte, la clase TableroCanvas ha sido rediseñada con el propósito de guardar el dibujo
como una lista de trazos y repintarlas cuando sea necesario. Adicional a los campos ya existentes,
se han agregado los siguientes campos:
Campos Descripción
Trazos Lista de los trazos
curTrazo Trazo actual o corriente, mientras es dibujado
curColor Color actual del trazo
A su vez, los métodos de la clase TableroCanvas se resumen a continuación:
24
Programación orientada a objetos
Métodos Descripción
setCurColor() Fija el color corriente
getCurColor(0 Recupera el color corriente
startTrazo() Método invocado por el listener para comenzar un nuevo trazo. Un nuevo trazo es
creado
addPointToTrazo() Invocado por el listener para adicionar (append) un punto al trazo corriente. Se
adiciona un nuevo punto al trazo corriente
finTrazo() Invocado por el listener para terminar un nuevo trazo. El trazo corriente se
adiciona a la lista de trazos.
paint() Invocado por el listener en tiempo de ejecución cuando quiera que el canvas deba
volverse a pintar. El dibujo es repintado en el canvas recuperando los trazos
guardados previamente
newFile() Crea un nuevo dibujo y un nuevo archivo
saveFile() Salva el dibujo actual al archivo usando una serializacion del objeto
openFile() Carga el dibujo a partir de un archivo desserializando el objeto almacenado
25
Programación orientada a objetos
26
Programación orientada a objetos
27
Programación orientada a objetos
Figura 14. Listado fuente de la clase TableroCanvas – aplicación tablero mágico – 2da iteración
28
Programación orientada a objetos
Figura 15. Listado fuente de la clase TableroCanvasListener – aplicación tablero mágico – 2da iteración
29
Programación orientada a objetos
Por su parte la clase Tablero es la clase principal o punto de entrada de toda la aplicación. Esta
segunda versión contiene una barra de menú y un conjunto de clases anidadas, las cuales son los
listeners para los ítems incluidos en la barra de menú. Los siguientes son los métodos de la clase
tablero:
Métodos Descripción
createMenuBar() Crea la barra de menú
newFile() Comienza el dibujo e instancia un nuevo archivo
openFile() Carga el dibujo a partir del archivo especificado
saveFile() Salva el dibujo corriente en el archivo corriente
saveFileAs() Salva el dibujo corriente al archivo especificado
En las figuras 16 y 17 se ilustra el código fuente para la clase Tablero y las clases anidadas
utilizadas en esta segunda iteración:
30
Programación orientada a objetos
31
Programación orientada a objetos
32
Programación orientada a objetos
Figura 16. Listado fuente de la clase tablero – Aplicación Tablero mágico 2da. Iteración
33
Programación orientada a objetos
Figura 17. Listado fuente de las clases anidadas – aplicación Tablero mágico 2da. Iteración
Como se puede apreciar, en el constructor de la clase Tablero, se crea la barra de menú y se coloca
sobre el canvas. La barra de menú es creada con el método createMenuBar(). Es necesario tener en
cuenta que cada ítem se asocia con una acción de listener para manejar la activación del código
según sea la escogencia o selección del usuario.
La acción más sencilla es aquella del método AboutListsener, el cual maneja la acción del ítem
About en el menú Help. Cuando un usuario selecciona esta opción se muestra un dialogo donde se
despliega un panel tal como se muestra en la figura 18. La clase JOptionPane provee varios métodos
estáticos para desplegar los diálogos o cajas de diálogos más comunes con una invocación de un
simple método.
34
Programación orientada a objetos
Figura 18. Ilustración del resultado de accionar el ítem About de la opción de Menu Help
La clase NewFileListener maneja la acción de la opción de menú New en el menú File. Por su parte
la clase OpenFileListener maneja la opción Open del menú File. Esta, por su parte, utiliza la clase
JFileChooser para habilitar el despliegue de un dialogo donde el usuario puede seleccionar un
archivo, tal como se muestra en la figura 19. Después de la selección del archivo, la acción se
delega al método openFile() usando el nombre de archivo, utilizando la clase definida
SaveAsFileListener.
35
Programación orientada a objetos
Figura 19. Ilustración del resultado de accionar el ítem Open de la opción de Menú File
Por su parte, la clase ExitListener maneja la acción Exit del ítem del menú File. Esta despliega una
caja de dialogo simple usando la clase javax.swing.JOptionPane tal como se muestra en la figura
20, para confirmar si el usuario quiere o no guardar su dibujo.
36
Programación orientada a objetos
Figura 20. Ilustración del resultado de accionar el ítem Exit de la opción de Menu File
Los métodos utilizados para manejar los archivos mantienen el nombre de archivo corriente y
delegan la mayor parte del trabajo al método correspondiente en la clase TableroCanvas.
La clase ColorListener maneja la acción del ítem Color en la opción de Menú. Este despliega un
dialogo mostrando las diferentes opciones de color tal como se muestra en la figura 21
Figura 21. Ilustración del resultado de accionar el ítem Color del menú Option
37
Programación orientada a objetos
El comportamiento del dialogo está definido en la clase ColorDialog cuyo listado fuente se puede
consultar en el paquete incluido como recurso del módulo, pero el cual debido a su extensión
consideramos no pertinente incluirlo como parte de este contenido.
Con esta explicación más o menos detallada del desarrollo de la aplicación de Tablero Mágico el
estudioso tiene ya una base práctica que le permitirá a lo largo del curso abstraer y utilizar los
elementos de la programación orientada por objetos. En los siguientes dos módulos ilustraremos
otros conceptos fundamentales de la programación orientada a objetos reutilizando parte del código
ya hecho y ampliando el desarrollo de la aplicación base de nuestro tablero mágico.
38
Programación orientada a objetos
Glosario
Clase: Una clase es una colección de objetos que comparten características comunes y
comportamientos parecidos, de tal forma que podemos encontrar una abstracción que los defina y
nos permita automatizar su definición y comportamiento
Herencia: Constituye una de las relaciones más importantes en el modelamiento orientado por
objetos. Existen relaciones tales como la extensión e implementación que permiten describir
relaciones de herencia.
Método: Un método es un elemento constitutivo de un objeto por medio del cual describimos un
conjunto de acciones que conforman un comportamiento del objeto, es decir la forma de reaccionar
frente a estímulos o mensajes de otros objetos o de otros métodos al interior del objeto
Objeto: Un objeto es una representación de algo tangible o intangible del cual queremos mantener
información. Un objeto está compuesto básicamente de una identificación, unas propiedades o
estado y un comportamiento.
39
Programación orientada a objetos
Bibliografía
Eck, J. (2018). Introduction to Programming Using Java. Introduction to Programming Using Java.
Geneva NY: Department of Mathematics and Computer Science - Hobart and William Smith
Colleges.
Poo, D, Kiong, D y Snwaralatha, D. (2008) Object Oriented Programming. USA: Springer 2008.
40