Está en la página 1de 36

Introduccin a la Orientacin a

Objetos
Fernando Bellas Permuy
Departamento de Tecnologas de la Informacin y las Comunicaciones (TIC)
Universidad de A Corua
http://www.tic.udc.es/~fbellas
fbellas@udc.es

Ciclo de vida de una aplicacin


Anlisis
Diseo
Implementacin
Pruebas
Mantenimiento

Distintas formas de construccin de sistemas


software
Programacin estructurada.
C, Pascal, Modula.

Programacin funcional.
Lisp, Cammel.

Programacin lgica.
Prolog.

Programacin orientada a objetos.


Smalltalk, Eiffel, C++, Java.
Programacin con agentes.

El paradigma de los objetos (1)


Un sistema software es un conjunto de objetos que cooperan.
Ej.: en un editor de grficos: cuadrado, crculo, lnea, imagen, barra de
herramientas, etc.).

Los objetos poseen una funcionalidad (operaciones que son capaces


de hacer o mensajes a los que son capaces de reaccionar).
Ej.: Dibujar, CambiarTamanho , Mover, Eliminar, etc.

El paradigma de los objetos (y 2)


El diseo orientado a objetos es un paradigma opuesto a una visin
algortmica (descomposicin funcional) del sistema implementar.

Proceso ()
{
SubProceso1();

SubProcesoN();
}

Dibujar

Cuadrado

Barra de Seleccin
Circulo

Linea

Descomposicin funcional vs orientacin a


objetos

Descomposicin funcional

Orientacin a objetos

Mdulos construidos alrededor de


las operaciones.
Datos globales o distribuidos entre
mdulos.
Entrada/Proceso/Salida.
Organigramas de flujo de datos.

Mdulos construidos alrededor de las


clases.
Clases dbilmente acopladas, y sin datos
globales
Encapsulacin/mensajes.
Diagramas jerrquicos de clases.

Ventajas de la orientacin a objetos


Un diseo orientado a objetos maximiza la:
Modularidad y encapsulacin
El sistema se descompone en objetos con unas responsabilidades
claramente especificadas.
Extensibilidad
Posibilidad de ampliar la funcionalidad de la aplicacin de manera
sencilla.
Reusabilidad
Posibilidad de reutilizar parte del cdigo para el desarrollo de una
aplicacin similar.

Concepto de clase (1)


Una clase describe un conjunto de ejemplares con propiedades y
comportamientos similares.
Una clase se describe por:
Nombre.
Interfaz: Operaciones (mtodos, mensajes) que manipulan el estado.
Conjunto de atributos (datos) que definen el estado.

Desde el punto de vista de la programacin una clase es un tipo (ejs.:


Rectangulo, Lista, Cola, NumeroComplejo, etc.).

Concepto de clase (y 2)
Nombre

Rectangulo

Interfaz

void Dibujar ()
void Ocultar ()
void Mover (float nuevaCoordX, float nuevaCoordY)
void CambiarDeTamanho (float nuevoAncho, float nuevoAlto)
float Area ()
float DameCoordX ()
float DameCoordY ()
float DameAncho ()
float DameAlto ()

Atributos

float coordX, coordY


float ancho, alto
return alto*ancho;

Prototipo
(signature)

Concepto de objeto
Objeto (instancia): cada uno de los ejemplares de una clase.
Desde el punto de vista de la programacin, un objeto es una variable.
X

Tipos de operaciones
Constructor: crea una instancia de la clase.
Destructor: destruye una instancia.
Selector: selecciona una parte del estado o devuelve una propiedad
resultante de la combinacin de algunos atributos.
Ejs.: DameCoordX, DameCoordY, DameAncho , DameAlto, Area , etc.

Modificador: modifica una parte del estado segn algn criterio.


Ejs.: Mover , CambiarDeTamanho, etc.

Copiador: copia un objeto en otro.


Iterador: permite recorrer una estructura de datos (ej.: para recorrer
una lista).
Visualizador: muestra todo el estado del objeto de una forma
elaborada.
Ej.: Dibujar.

Envo de mensajes
Un objeto de una clase responde a cualquiera de los mensajes
definidos en la clase.
float coordX = unRectangulo.DameCoordX();
unRectangulo.Mover(0, 20);
unRectangulo.Dibujar();

Encapsulacin

Los clientes de una clase slo conocen la interfaz de la misma, es decir,


conocen los prototipos de las operaciones pero no cmo estn
implementadas.
Por tanto, si la implementacin de una clase vara, y la interfaz contina
siendo la misma, no es necesario cambiar el cdigo de los clientes.
NumeroComplejo

NumeroComplejo

NumeroComplejo Sumar (NumeroComplejo c)


NumeroComplejo Restar (NumeroComplejo c)
NumeroComplejo Multiplicar (NumeroComplejo c)
NumeroComplejo Dividir (NumeroComplejo c)

NumeroComplejo Sumar (NumeroComplejo c)


NumeroComplejo Restar (NumeroComplejo c)
NumeroComplejo Multiplicar (NumeroComplejo c)
NumeroComplejo Dividir (NumeroComplejo c)

float DameModulo ()
float DameArgumento ()
float DameParteReal ()
float DameParteImaginaria ()

float DameModulo ()
float DameArgumento ()
float DameParteReal ()
float DameParteImaginaria ()

float modulo, argumento

float parteReal, parteImaginaria

Visibilidad
Los atributos y operaciones pueden tener los siguientes tipos de acceso
(visibilidad):
Pblico
Se pueden acceder desde cualquier clase.
Privado
Slo se pueden acceder desde operaciones de la clase.
Protegido
Slo se pueden acceder desde operaciones de la clase o de clases
derivadas.

Norma general:
El estado debe ser privado.
Las operaciones que definen la funcionalidad deben ser pblicas.
Las operaciones que ayudan a implementar parte de la funcionalidad
deben ser privadas (si no se utilizan desde clases derivadas) o protegidas
(si se utilizan desde clases derivadas).

Relacin de herencia (1)


Permite definir una clase hija (subclase) a partir de una clase padre
(base, superclase).
La clase hija hereda el interfaz (con la implementacin de las
operaciones) y los atributos.
Relacin es un.

Relacin de herencia (2)


Ser
Nacer ()
Morir ()

Animal

aci

Sentir ()

aliz

Vegetal

eci

Esp
n

e
en

iz
al

i
ac

Mamifero

Ave
Volar ()

Relacin de herencia (3)


Concepto de tipo: un tipo denota una interfaz particular.
Ej.: Ser , Animal , Vegetal, etc.

Un tipo es un subtipo de otro si su interfaz contiene la interfaz de su


supertipo.
Ej.: Animal es un subtipo de Ser y un supertipo de Ave y Mamifero.

Diferencia entre los conceptos de clase e interfaz.


El concepto de clase hace referencia a los atributos y a las operaciones,
junto con su implementacin.
El concepto de interfaz hace referencia slo a los prototipos de las
operaciones visibles.

En un lenguaje orientado a objetos siempre se pueden hacer


asignaciones del estilo supertipo = subtipo entre instancias.
unAnimal = unAve, pero NO unAve = unAnimal.

Relacin de herencia (4)


La clase hija puede extender o redefinir (override) el comportamiento
de la clase padre.
Extensin: Se aaden operaciones y/o atributos (ej.: Volar en el caso de
Ave).
Redefinicin: Se cambia la implementacin de alguna operacin heredada
(o se le da una implementacin si no la tena).

Relacin de herencia (5)

Texto
Cargar ()
Grabar ()
Presentar ()

PostScript
Presentar ()

Presentar ASCII

HTML
Procesar PostScript

Presentar ()

Procesar HTML

Relacin de herencia (6)


Clase abstracta
Deja sin definir una o ms operaciones (slo declara sus prototipos), que
se definirn en subclases. Estas operaciones se denominan operaciones
abstractas.
No se pueden crear instancias de una clase abstracta.
Su objetivo es especificar una interfaz comn para todas sus subclases.

Clase concreta
Una clase que no es abstracta, es decir, que no define operaciones
abstractas y define las operaciones abstractas que hereda.

Relacin de herencia (7)


Un ejemplo de clase abstracta (Figura) ...
Grafico

Figura

Insertar (Figura)
Dibujar ()
Area ()
Mover ()
Ocultar ()

Dibujar ()
Area ()
Mover ()
Ocultar ()

Rectangulo

Circulo

Triangulo

Dibujar ()
Area ()
Mover ()
Ocultar ()

Dibujar ()
Area ()
Mover ()
Ocultar ()

Dibujar ()
Area ()
Mover ()
Ocultar ()

Relacin de herencia (8)


Un ejemplo de clase abstracta (continuacin)
Cuadrado* unCuadrado = << Crear instancia de Cuadrado. >>
Circulo* unCirculo = << Crear instancia de Circulo. >>
Triangulo* unTriangulo = << Crear una instancia de Triangulo. >>
Grafico* grafico = << Crear una instancia de Grafico. >>
grafico->Insertar(unCuadrado);
grafico->Insertar(unCirculo);
grafico->Insertar(unTriangulo);
grafico->Dibujar();

Relacin de herencia (9)


Un ejemplo de clase abstracta (continuacin)
void Grafico::Dibujar ()
{
IteradorFiguras i;
i = ObtenerIteradorFiguras();
while (! i.Fin()) {
Figura* figura = i.Elemento();
figura->Dibujar();
i.Siguiente();
}
}

El cdigo de Dibujar no depende de los tipos de figura que haya.


Se evita cdigo case/switch, es decir ...

Relacin de herencia (10)


Grafico_Dibujar (Grafico* grafico)
{
while (! Lista_Fin(grafico->figuras) ) {
struct FiguraYTipo figuraYTipo = Lista_Actual(grafico->figuras);
switch (figuraYTipo.tipo) {
case EsRectangulo:
Rectangulo_Dibujar((Rectangulo*)figuraYTipo.figura);
break;
case EsCirulo:
Circulo_Dibujar((Circulo*)figuraYTipo.figura);
break;
case EsTriangulo:
Triangulo_Dibujar((Triangulo*)figuraYTipo.figura);
break;
}
Lista_Siguiente(grafico->figuras);
}
}

Relacin de herencia (11)


Polimorfismo: Distintas instancias del mismo tipo interpretan un
mismo mensaje de distinta forma.
Ej.: En la implementacin de Grafico::Dibujar existe polimorfismo
(figura.Dibujar()).
El polimorfismo requiere enlace dinmico.

Enlace dinmico: La llamada a figura.Dibujar se resuelve en


tiempo de ejecucin.
Enlace esttico: La llamada a grafico.Dibujar se resuelve en
tiempo de compilacin.
Consejo: Programar haciendo uso de una interfaz, y no de una
implementacin concreta.

Relacin de herencia (12)


Herencia de implementacin: La clase hija hereda la implementacin
de mtodos de la clase padre.
Ej.: el ejemplo de la jerarqua de los seres vivos.

Herencia de interfaz: La clase hija hereda el interfaz (pero no la


implementacin de las operaciones).
Ej.: el ejemplo de la jerarqua de figuras.

Algunos lenguajes tienen palabras clave para distinguir entre herencia


de interfaz y clase (ej.: Java), mientras que otros no (ej.: C++).
Herencia de clase: combina la herencia de implementacin y de
interfaz.
Ej.: siguiente transparencia ...

Relacin de herencia (13)


ColeccionTextos
Insertar (Texto)
Pesentar ()

Texto
Cargar ()
Grabar ()
Presentar ()

forall t in Textos
t.Presentar()
ASCII
Presentar ()

Presentar ASCII

PostScript
Presentar ()

Procesar PostScript

HTML
Presentar ()

Procesar HTML

Relacin de herencia (14)


Mtodos plantilla
Documento
Grabar ()
Abrir ()
Cerrar ()
Leer ()

Aplicacion
AnhadirDoc ()
AbrirDoc ()
CrearDoc ()
PuedoAbrirDoc ()
ApuntoDeAbrirDoc ()

MiDocumento
Leer ()

MiAplicacion
CrearDoc ()
PuedoAbrirDoc ()
ApuntoDeAbrirDoc ()

if (! PuedoAbrirDoc(nombre)) {
return;
}
Documento* doc = CrearDoc();
if (doc) {
docs->AnhadirDoc(doc);
ApuntoDeAbrirDoc(doc);
doc->Abrir();
doc->Leer();
}

Relacin de herencia (15)


Herencia mltiple
una clase hija hereda de dos o ms padres.
No est disponible en todos los lenguajes (disponible en C++; en Java slo
para la herencia de interfaz).

VehiculoTerrestre

VehiculoAcuatico

DesplazarsePorTierra ()

DesplazarsePorAgua ()

VehiculoAnfibio

Relacin de herencia (y 16)


Herencia mltiple (continuacin)
Problema de ambigedad: unVehiculoAnfibio.Desplazarse();
VehiculoTerrestre

VehiculoAcuatico

Desplazarse ()

Desplazarse ()

VehiculoAnfibio

- Los lenguajes ofrecen mecanismos para deshacer la ambigedad (en C++


=> unVehiculoAnfibio.VehiculoTerrestre::Desplazarse()).

Relacin de composicin/agregacin (1)


Un Grafico se compone de varios objetos Figura.
Grafico

Figura

Insertar (Figura)
Dibujar ()
Area ()
Mover ()
Ocultar ()

Dibujar ()
Area ()
Mover ()
Ocultar ()

forall f in Figuras
f.Dibujar ();
Rectangulo

Circulo

Triangulo

Dibujar ()
Area ()
Mover ()
Ocultar ()

Dibujar ()
Area ()
Mover ()
Ocultar ()

Dibujar ()
Area ()
Mover ()
Ocultar ()

Relacin de composicin/agregacin (y 2)
El cdigo de los mtodos del agregado (Grafico) delega parte de su
implementacin en mtodos de sus partes (Figura).
El agregado puede tener la responsabilidad de liberar la memoria de
sus partes (ejemplo anterior) o no (siguiente ejemplo).

Reutilizacin de cdigo: herencia de clase vs


composicin (1)
Rectangulo
Area ()

Figura

Ventana
Area ()
DarForma (Figura)

Area ()

Figura forma

Ventana

forma.Area()

Rectangulo

Circulo

Area ()

Area ()

float ancho
float alto

float radio

return ancho*alto;

return PI * radio 2;

Reutilizacin de cdigo: herencia de clase vs


composicin (2)
Ventaja

Desventaja

Herencia

Fcil de utilizar.
Fcil de modificar la
implementacin heredada.

Establece relaciones
estticas.
Se rompe la
encapsulacin.

Composicin

Establece relaciones dinmicas.


Se mejora la encapsulacin.

Mayor nmero de
objetos.
El comportamiento del
sistema depende de las
relaciones entre objetos,
en vez de estar
concentrado en una
clase.

Reutilizacin de cdigo: herencia de clase vs


composicin (y 3)
Consejos :
Favorecer la composicin frente a la herencia de clase.
Evitar excesivas relaciones entre clases (las clases deben estar
dbilmente acopladas).
Evitar jerarquas de clases excesivamente complejas.
Un ltimo consejo: Think simple !

Recursos
Libros
E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns: Elements
of Reusable Object-Oriented Software, Addisson-Wesley, 1994.

Pgina web del curso


http://www.tic.udc.es/~fbellas

También podría gustarte