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 Barra de Seleccin

Cuadrado

Circulo

Linea

Descomposicin funcional vs orientacin a objetos

Descomposicin funcional Mdulos construidos alrededor de las operaciones. Datos globales o distribuidos entre mdulos. Entrada/Proceso/Salida. Organigramas de flujo de datos.

Orientacin a objetos 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 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 ()

Prototipo (signature)

Interfaz

Atributos

float coordX, coordY float ancho, alto return alto*ancho;

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 Sumar (NumeroComplejo c) NumeroComplejo Restar (NumeroComplejo c) NumeroComplejo Multiplicar (NumeroComplejo c) NumeroComplejo Dividir (NumeroComplejo c) float DameModulo () float DameArgumento () float DameParteReal () float DameParteImaginaria () float modulo, argumento NumeroComplejo 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 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 ()

Esp

n Ge

er

iz al

ci

n
Animal Sentir () Vegetal

eci aliz aci n

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 ()

Presentar ASCII

PostScript Presentar () Procesar PostScript

HTML 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 Insertar (Figura) Dibujar () Area () Mover () Ocultar ()

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

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

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

Triangulo 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 () PostScript Presentar () HTML Presentar ()

Presentar ASCII

Procesar PostScript

Procesar HTML

Relacin de herencia (14)


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

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

MiDocumento Leer () MiAplicacion CrearDoc () PuedoAbrirDoc () ApuntoDeAbrirDoc ()

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 DesplazarsePorTierra ()

VehiculoAcuatico DesplazarsePorAgua ()

VehiculoAnfibio

Relacin de herencia (y 16)


Herencia mltiple (continuacin)
Problema de ambigedad: unVehiculoAnfibio.Desplazarse();
VehiculoTerrestre Desplazarse () VehiculoAcuatico 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 Insertar (Figura) Dibujar () Area () Mover () Ocultar () forall f in Figuras f.Dibujar (); Rectangulo Dibujar () Area () Mover () Ocultar () Circulo Dibujar () Area () Mover () Ocultar () Triangulo Dibujar () Area () Mover () Ocultar ()

Figura
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 () Ventana Area () DarForma (Figura) Figura forma

Figura
Area ()

Ventana

forma.Area()

Rectangulo Area () float ancho float alto

Circulo Area () float radio

return ancho*alto;

return PI * radio 2;

Reutilizacin de cdigo: herencia de clase vs composicin (2)


Ventaja Herencia Fcil de utilizar. Fcil de modificar la implementacin heredada. Establece relaciones dinmicas. Se mejora la encapsulacin. Desventaja Establece relaciones estticas. Se rompe la encapsulacin. Mayor nmero de objetos. El comportamiento del sistema depende de las relaciones entre objetos, en vez de estar concentrado en una clase.

Composicin

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