01 - Unidad 1 - Objetos
01 - Unidad 1 - Objetos
Capítulo I
Para comenzar con el tema de UML, lo haremos presentando los conceptos generales
de la orientación a objetos, para luego detenernos en las actividades del desarrollo de software
bajo este paradigma y utilizando la notación UML.
En primer lugar mencionaremos los objetivos de este capítulo y son los siguientes:
Conocer los conceptos fundamentales de la teoría de orientación a objetos.
Diferenciar los distintos conceptos utilizados en la programación orientada a objetos
(POO).
Entender el paradigma de POO y su aplicación en distintos tipos de problemas.
Analizar como la orientación a objetos contribuye en los diferentes niveles de
reutilización.
Aplicar los conceptos de orientación a objetos para el diseño y programación de
sistemas.
Objetos
Las personas tenemos una idea clara de lo que es un objeto: conceptos adquiridos que
nos permiten sentir y razonar acerca de las cosas del mundo. Un objeto podría ser real o
abstracto, por ejemplo una organización, una factura, una persona, una pantalla de usuario, un
avión, un vuelo de avión, una reservación aérea.
Definiciones:
“Un objeto se define como la unidad que en tiempo de ejecución realiza las
tareas de un programa. También a un nivel más básico se define como la
instancia de una clase. Estos objetos interactúan unos con otros, en
contraposición a la visión tradicional en la cual un programa es una
colección de subrutinas (funciones o procedimientos), o simplemente una
lista de instrucciones para el computador. Cada objeto es capaz de recibir
mensajes, procesar datos y enviar mensajes a otros objetos de manera
similar a un servicio.” Fundación Wikipedia, Inc. (2013).
Dentro del software orientado a objeto, un objeto es cualquier cosa, real o abstracta,
acerca de la cual almacenamos datos y los métodos que controlan dichos datos.
Imagen tomada de Martín, M. Y Odell, M. (1994) y adaptado por Ing. Juan Bournissen
Imagen tomada de Martín, M. Y Odell, M. (1994) y adaptado por Ing. Juan Bournissen
Un objeto puede estar compuesto por otros objetos y estos a su vez por otros más. Esta
estructura nos permite construir objetos muy complejos.
Clases
Una clase es una descripción generalizada de un conjunto de objetos similares. Es la
descripción de un conjunto de objetos que comparten los mismos atributos, operaciones,
relaciones y semántica. Todos los objetos son ejemplares de una clase. Un objeto es una
instancia de una clase. Un objeto se distingue de otros miembros de la clase por sus atributos.
Para aclarar el tema de las clases y los objetos que la componen lo vamos a hacer con
un ejemplo: tenemos una clase que la podemos denominar auto, esta clase va a contener un
conjunto de objetos similares, que cumplen con un conjunto de características comunes.
Todos tienen motor, ruedas, volante, color, cantidad de puertas, etc. es decir tienen
características en común, y pueden hacer las mismas cosas, como arrancar, moverse, girar,
adelantarse, retroceder, frenar, etc.
Si tenemos la clase auto podemos tener distintos tipos de objetos, donde cada uno de
los objetos sería una instancia de la clase auto.
Cada uno de estos vehículos son objetos de la clase vehículo. Todos tienen las mismas
características (aunque la comodidad, el confort y la potencia cambien).
Clase: vehículo
Métodos (funciones): arrancar, moverse, girar, adelantarse, retroceder, frenar, etc.
Atributos (datos): motor, ruedas, volante, color, cantidad de puertas, etc.
Objeto: Montacarga
Métodos (funciones): arrancar, moverse, girar, adelantarse, retroceder, frenar, etc.
Atributos (datos): motor, ruedas, volante, color, cantidad de puertas, etc.
Métodos o comportamientos
Iniciar alarma
Asignar tonos
Registrar llamadas
Iniciar Juego
Utilizar Calculadora
Enviar mensajes, etc.
A su vez las clases pueden tener clases que dependen de ella, por lo tanto podemos de
hablar de superclases, de clases y subclases. Por ejemplo podemos tener la superclase
teléfonos, la clase teléfono móvil y la subclase teléfono móvil digital.
Una clase de alto nivel puede especializarse en clases de bajo nivel. Es decir, una clase
puede tener subclases.
Por ejemplo, una clase Persona puede tener subclases Estudiante y Empleado. A su
vez, la clase Estudiante puede tener como subclase a Estudiante de pregrado y Estudiante de
postgrado, mientras que Empleado puede tener como subclase a Académico y Administrativo.
Existe de este modo una jerarquía de clases y subclases.
Herencia
La herencia es un mecanismo que permite la definición de una clase a partir de la
definición de otra ya existente.
Es la característica clave de los sistemas orientados a objeto para propiciar la
reusabilidad.
Una subclase puede heredar la estructura de datos y los métodos, o algunos métodos,
de su superclase. También puede tener métodos y tipos de datos propios.
Imagen tomada de Martín, M. Y Odell, M. (1994) y adaptado por Ing. Juan Bournissen
Una clase puede tener sus propios métodos y estructura de datos, así como también
heredarlos de su superclase. (Por ejemplo, herencia de la clase X a la clase Y) Es la facilidad
mediante la cual la clase Y hereda en ella cada uno de los atributos y operaciones de X, como
si esos atributos y operaciones hubiesen sido definidos por la misma Y. Por lo tanto, puede
usar los mismos métodos y variables públicas declaradas en X. Los componentes registrados
como "privados" (private) también se heredan, pero como no pertenecen a la clase, se
mantienen escondidos al programador y sólo pueden ser accedidos a través de otros métodos
públicos. Esto es así para mantener hegemónico el ideal de OOP.
Para modelar las relaciones de herencia: Dado un conjunto de clases, hay que buscar
atributos y operaciones comunes a dos o más clases y elevar a una clase más general. Indicar
que las clases más específicas heredan de la clase más general a través de una relación de
generalización desde cada clase especializada a su padre.
En orientación a objetos la herencia es el mecanismo fundamental para implementar la
reutilización y extensibilidad del software. A través de ella los diseñadores pueden construir
nuevas clases partiendo de una jerarquía de clases ya existente (comprobadas y verificadas)
evitando con ello el rediseño, la modificación y verificación de la parte ya implementada. La
herencia facilita la creación de objetos a partir de otros ya existentes, obteniendo
características (métodos y atributos) similares a los ya existentes.
Es la relación entre una clase general y otra clase más específica. Por ejemplo: Si
declaramos una clase párrafo derivada de una clase texto, todos los métodos y variables
asociadas con la clase texto, son automáticamente heredados por la subclase párrafo.
“La herencia es uno de los mecanismos de la programación orientada a
objetos, por medio del cual una clase se deriva de otra, llamada entonces
clase base o clase padre,(a veces se le denomina superclase pero no es muy
común), de manera que extiende su funcionalidad.
Una de sus funciones más importantes es la de proveer Polimorfismo y
binding.” Wikipedia, (2013b)
Agregaciones
Es una forma especial de asociación que especifica una relación todo-parte entre el agregado
(el todo) y un componente (la parte). (parte de).
Es importante notar que en un extremo de las líneas que unen las clases se encuentra
un rombo vacío (de color blanco). Esto indica que esta agregación es débil, es decir que si la
clases padre deja de existir, las clases hijas pueden seguir existiendo por si solas. Es decir si
desarmo la PC, cada una de sus partes componentes siguen siendo clases con sentido de
existencia.
La herencia puede ser simple (cada clase tiene sólo una superclase) o múltiple (cada
clase puede tener asociada varias superclases).
Composición
Es una forma de agregación con fuerte pertenencia y un tiempo de vida coincidente
entre las partes y el todo. (parte de). Los objetos que contienen a otros objetos se denominan
objetos compuestos. Los atributos de un objeto se pueden usar de dos maneras:
1. Para almacenar valores
2. Para contener referencia a otros objetos
Esta última propiedad permite enviar mensajes apropiados a todos los objetos
contenidos.
Notarán que las líneas que unen las clases tienen en un extremo un rombo relleno de
color negro. Esto indica que si la clase padre desaparece, no tiene sentido que las clases hijas
sigan existiendo.
Polimorfismo
La palabra polimorfismo proviene del griego y significa que posee varias formas
diferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos.
Así como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se
relaciona con los métodos.
El polimorfismo se aplica a métodos que adoptan varias formas de implementación
según el tipo de objeto, pero cumple siempre el mismo objetivo.
Los métodos son polimórficos se aplican a objetos de distintas clases para conseguir el
mismo significado semántico. Por ejemplo, lanzar puede ser implementado tanto para un
objeto Tenis como para el objeto Béisbol o Fútbol.
Por ejemplo, podemos crear dos clases distintas: Pez y Ave que heredan de la
superclase Animal. La clase Animal tiene el método abstracto mover que se implementa de
forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta).
Una de las ventajas del polimorfismo es que se puede hacer una solicitud de una
operación sin conocer el método que será llamado, es decir, existe un enlace tardío entre el
mensaje y el método.
Por ejemplo se aplica el método área, en una clase Figura, y esto se aplica en sus
subclases Cuadrado y Rectángulo, es decir se pidió que se calculara el área sin necesidad de
especificar a qué tipo de figura se aplicaría.
Visibilidad
Toda Clase encapsula unos elementos (atributos y operaciones) que disponen de
ciertos criterios de visibilidad y manipulación para otras Clases.
+ Pública: un elemento siempre es visible en cualquier parte del programa y puede ser
llamado y modificado por cualquier objeto del sistema. Todas las operaciones son públicas
por defecto.
- Privada: un elemento sólo puede ser usado por la clase que lo define.
# Protegida: un elemento sólo puede ser usado por la clase que lo define, o por las subclases
de dicha clase
Package (paquete): un elemento sólo puede ser usado por otras clases que compartan el
mismo paquete.
Abstracción
Es el conocimiento que se tiene de una cosa prescindiendo de las demás que están con
ella. La abstracción localiza y oculta los detalles de un modelo o diseño para generar y
manipular objetos. Conocemos un objeto viéndolo, sabemos qué es sin necesidad de ver su
interior, su implementación o su forma de construcción.
Los tipos de datos abstractos (TDA) permiten describir una estructura de datos en
función a las operaciones que pueden efectuar, dejando a un lado su implementación.
Los TDA mezclan estructuras de datos junto a una serie de operaciones de
manipulación. Incluyen una interfaz pública, que es lo que verá el usuario, y una
implementación (algoritmos de operaciones sobre las estructuras de datos y su representación
en un lenguaje de programación), que el usuario no tiene necesariamente que conocer para
manipular correctamente los tipos de datos abstractos.
Los objetos están representados por medio de los TDA y se caracterizan por el
encapsulamiento.
Una clase abstracta es una descripción incompleta de un objeto. Un conjunto de
operaciones y atributos que por sí solos no describen nada.
Las clases abstractas no pueden ser instanciadas, no es posible crear objetos o
variables (no se puede usar new).
Creadas por generalización, tienen características comunes, pero no completas. Son
utilizadas para definir operaciones comunes y aplicar polimorfismo.
Interfaces
Colección de operaciones que se utiliza para especificar un servicio de una clase. Se
trata de declarar métodos abstractos y constantes que posteriormente puedan ser
implementados de diferentes maneras según las necesidades de un programa. Una interface
sirve para establecer un 'protocolo' entre clases.
Resumen
Un programa orientado a objetos es un conjunto de clases que describe el
comportamiento de los objetos del sistema
Los objetos se comunican mediante mensajes
Cada objeto tiene su propio estado
Cada objeto es un ejemplar de una clase (agrupación de objetos)
Todos los objetos que son ejemplares de una misma clase pueden realizar las
mismas acciones
Las clases están organizadas en una jerarquía de herencia
objeto es cualquier cosa, real o abstracta, acerca de la cual almacenamos datos y
los métodos que controlan dichos datos.
Una clase es una descripción generalizada de un conjunto de objetos similares.
Una clase de alto nivel puede especializarse en clases de bajo nivel. Es decir, un
clase puede tener subclases.
Los métodos son comportamientos o acciones, especifican la forma en que se
controlan los datos de un objeto.
Los atributos son las características individuales que diferencian un objeto de otro
y determinan su apariencia, estado u otras cualidades.
El mensaje tiene codificada la petición de una acción y se acompaña de cualquier
información adicional (argumentos) necesaria para llevar a cabo la petición
El encapsulado es el resultado de ocultar los detalles de implementación (estado
interno) de un objeto respecto de su usuario.