Download Técnicas de POO Contenidos Abstracción Abstracción

Document related concepts
no text concepts found
Transcript
Contenidos
!
!
Técnicas de POO
!
!
Programación Orientada a Objetos
Facultad de Informática
!
Abstracción
Definición de clases e interfaces
Mensajes y métodos
Herencia de clases
Composición de objetos
Juan Pavón Mestras
Dep. Sistemas Informáticos y Programación
Universidad Complutense Madrid
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Abstracción
!
!
!
!
Abstracción
Definición
!
!
Suprimir o esconder algunos detalles de un proceso o
artefacto con el propósito de resaltar más claramente otros
aspectos, detalles o estructura
Ocultar información, o encapsulado, en programación,
consiste en omitir detalles de implementación
!
!
!
!
Interfaz vs. Implementación
• Definición de la signatura de las operaciones (interfaz)
• Implementación de las operaciones (clase)
• Puede haber varias implementaciones de una misma interfaz
!
División en partes: tiene-un (agregación)
• Permite bajar a otro nivel de complejidad
• La composición es un tipo especial de agregación
Un mapa del mundo muestra continentes, grandes cordilleras
y ríos
Un mapa de un continente muestra todos los países y las
ciudades principales
Un mapa de un país muestra las principales ciudades y
carreteras
Un mapa de una ciudad muestra las calles
Cada nivel tiene información apropiada al nivel de
abstracción
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Formas de abstracción en OO
!
Permite gestionar la complejidad
Ejemplo de niveles de abstracción: mapas
!
2
!
División en especialización: es-un (herencia)
• Permite categorizar información
!
Paquetes (package en Java, namespace en C++): controla la
visibilidad de una colección de objetos respecto al resto
• public, private, protected
3
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
4
Definición de clases
!
Las clases proporcionan:
!
!
!
!
Definición de clases
!
Encapsulado, ocultamiento de información, reduciendo la
cantidad de detalles que deben recordar/comunicar los
programadores
Una visión de servicio: la posibilidad de caracterizar un
objeto por el servicio que proporciona, sin saber cómo realiza
su tarea
Instanciación: la posiblidad de crear múltiples instancias de
una abstracción
C++
class CartaBaraja {
public:
enum Palos {Oros, Copas, Espadas, Bastos};
Palos palo () { return valorPalo; }
int numero () { return valorNumero; }
Dos visiones del software:
!
Externa: lo que hace un objeto
!
Interna: cómo lo hace
• Visión de servicio: interfaz
};
private:
Palos valorPalo;
int valorNumero;
• Visión de implementación
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
5
Definición de clases
!
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Definición de clases
C#
!
Java
class CartaBaraja {
public Palos palo () { return valorPalo; }
public int numero () { return valorNumero; }
enum Palos {Oros, Copas, Espadas, Bastos};
// En C# un enum no puede definirse dentro de una clase
class CartaBaraja {
public Palos palo () { return valorPalo; }
public int numero () { return valorNumero; }
};
6
private Palos valorPalo;
private int valorNumero;
private Palos valorPalo;
private int valorNumero;
};
public
public
public
public
static
static
static
static
final
final
final
final
int
int
int
int
Oros = 1;
Copas = 2;
Espadas = 3;
Bastos = 4;
• En Java, hasta la versión 1.4 no se pueden definir enum
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
7
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
8
Clases anidadas
!
Interfaces en Java
En C++, C# y Java se pueden definir clases anidadas
dentro de otras
!
!
class ListaEnlazada {
//...
private class Enlace { // clase anidada
public int valor;
public Enlace siguiente;
}
}
!
!
!
9
Mensajes
!
!
!
!
Un mensaje se envía siempre a un objeto, el receptor
La acción que se realiza la determina el receptor, diferentes
receptores pueden tomar distintas acciones
!
!
!
!
!
!
En tiempo de ejecución: vinculación dinámica
Constructores
Métodos de Acceso (get) y Modificación (set)
• Para ver/modificar el valor de los atributos
• Permiten definir un atributo como readonly si sólo hay el método getX()
• Permiten cambiar la representación interna del atributo, o añadir
funcionalidad (por ejemplo, contar el número de accesos)
El método asociado al mensaje se puede determinar
!
Un cuerpo: código que se ejecutará cuando se invoque el método
Métodos
!
juego.muestraCarta (unaCarta, 12, 8);
En tiempo de compilación: vinculación estática
Un nombre
Una signatura: tipo de argumentos y valor de retorno
• Métodos con el mismo nombre se pueden distinguir por tener signaturas
distintas
El receptor del mensaje
El selector del mensaje
Una lista opcional de argumentos
!
10
Todos los métodos se definen por:
!
Todos los mensajes tienen tres partes:
!
!
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Definición de métodos
Un mensaje no es una función
!
Se puede definir una variable del tipo de interfaz que
referencie a objetos de cualquiera de esas clases
interface
interfaceAutomovil
Automovil{{
public
publicvoid
voidarrancar();
arrancar();
public
publicvoid
voidacelerar(double
acelerar(double
a);
a);
class
classCoche
Cocheimplements
implementsAutomovil
Automovil{{
//
//...
...
public
publicvoid
voidarrancar()
arrancar(){{
};};
/*
/*implementación
implementación*/
*/ }}
public
void
acelerar(double
public void acelerar(doublea)
a){{
/*
/*implementación
implementación*/
*/ }}
//
//...
...
};};
Tienen acceso a los miembros de la clase que las contiene
Se pueden esconder de otras clases
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Una interfaz (interface en Java) sólo puede definir la
signatura de métodos y constantes
Varias clases pueden implementar la misma interfaz
!
• Se asocia al tipo de la variable
!
Operaciones
Finalizadores (destructor en C++)
• Se asocia al valor
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
11
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
12
Definición de métodos
!
Definición de métodos
Consejo: Orden de definición de los métodos
!
!
!
!
!
!
!
Primero los más importantes
Los constructores son importantes, ponerlos al principio
Poner antes los métodos públicos que los privados
Agrupar cuando haya muchos métodos
Listarlos en orden alfabético
!
fichero
ficherocartas.h
cartas.h
class
classCartaBaraja
CartaBaraja{{
public:
public:
//
//...
...
Palos
Palospalo
palo()();;
//
...
// ...
};};
13
Curiosidades
!
Por ejemplo, en C++
• Legibilidad: Poner en la definición de clase solo aquellos métodos
muy cortos
• Semántica: Algunos compiladores expanden en-línea el código
de los métodos definidos en la clase
Recuerda que el código no lo lee únicamente el programador
que lo escribe y piensa en los lectores de tu código
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Separación de declaración e implementación
fichero
ficherocartas.cpp
cartas.cpp
CartaBaraja::
CartaBaraja::Palos
Palos CartaBaraja::palo
CartaBaraja::palo()(){{
return
returnvalorPalo
valorPalo
};};
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
14
Ejemplo
Oberon (N. Wirth) es un lenguaje donde no se definen
clases, sino registros, así que los métodos (mensajes) se
definen sobre punteros
!
Las 8 reinas
!
Colocar 8 reinas en un tablero de ajedrez sin que se puedan
comer unas a otras
TYPE
CartaBaraja = POINTER TO DescripcionCartaBaraja;
DescripcionCartaBaraja = RECORD
palo : INTEGER;
numero : INTEGER;
visible: BOOLEAN;
END
PROCEDURE (carta: CartaBaraja) setVisible (b : BOOLEAN);
BEGIN
carta.visible = b;
END
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
15
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
16
Herencia de clases
!
Herencia de clases
Jerarquía de clases
!
!
class Circulo: public Forma, public Redondez
Los atributos y métodos del padre son parte del hijo
• Obsérvese que los aspectos private del padre son parte del hijo
(por ejemplo, se les asigna memoria en el hijo también) pero el
hijo no puede acceder a ellos (sólo a los declarados como public
o protected)
!
!
!
!
!
La herencia es extensión y contracción
!
!
C++ soporta herencia múltiple
En C#
class Circulo: Forma
El comportamiento del hijo puede extender al del padre
El hijo puede redefinir comportamiento heredado
!
En Java
class Circulo extends Forma
Motivación de la herencia
!
En C++
Reutilización de código: el hijo hereda el código del padre
Reutilización de concepto: el hijo puede redefinir todos los
métodos heredados, pero comparte su definición
!
!
C# y Java sólo permiten herencia de una clase pero se pueden
implementar múltiples interfaces
También definen una sola raíz de la jerarquía de clases: la clase
Object (C++ no)
• La clase Object proporciona métodos básicos para todos los objetos: equals(),
toString(), finalize(), clone(), hashcode() [C# los ha copiado de Java]
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
17
Herencia de clases
!
!
!
En C++ y Java: super
En C#: base
!
Taxi(), Coche(), Automovil()
!
Especificación: si la clase padre es abstracta está dando una
especificación de cómo tienen que ser las hijas
!
Construcción: Se utiliza una clase para construir otra, que no respeta la
relación “es un”
!
!
!
Automovil
Limitación: la clase hija restringe el uso de algún método de la clase
padre (sobreescribiéndolo, por ejemplo, para que genere un mensaje de
error)
Camion
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Patrulla
!
19
Derivar una clase Conjunto de una clase Lista
No respeta el principio de sustituibilidad
!
!
Taxi
Ejemplo: eventos en Java: ActionListener, MouseListener
Generalización o extensión: la clase hija no sobreescribe ningún
método de la clase padre, sólo añade otros nuevos
!
Particular
Ejemplo: los componentes del Java AWT
!
!
Coche
[T. Budd, cap. 8 de la 3ª edición]
Especialización: los hijos sobreescriben un método del padre para
especializar la clase de alguna manera
En el ejemplo: Automovil(), Coche(), Taxi()
Para el destructor en sentido inverso:
18
!
!
Al crear un objeto se llama a los constructores de las
clases a las que pertenece, del primero al más particular:
!
!
Formas de la Herencia
Para referirse a un método de la clase padre
!
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
Ejemplo: En java.util Properties extends Hashtable
Con el ejemplo de la Lista, para crear una Pila se suprime el método de
insertar donde no sea el extremo de la pila
Varianza: Cuando varias clases están relacionadas, crear una que tenga
los aspectos comunes de ambas
Combinación: Una clase hija hereda de varias (herencia mútliple)
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
20
Composición de objetos
!
!
Herencia vs. Composición
Agregar o componer varios objetos para obtener una
mayor funcionalidad
Un objeto se puede construir a partir de otros objetos
!
Herencia: permite definir una clase a partir de otra
!
!
!
!
Composición: nueva funcionalidad mediante composición
de objetos
!
!
!
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
21
Herencia vs. Composición
!
!
!
!
!
!
!
Reutilización de caja negra: no hay visibilidad de los aspectos
internos de los objetos (objetos como cajas negras)
Requiere interfaces bien definidas
Dinámica: se define en tiempo de ejecución
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
22
Herencia vs. Composición
La herencia no permite cambios en tiempo de ejecución
La herencia rompe la encapsulación
!
Reutilización de caja blanca: los aspectos internos de la
superclase son visibles a las subclases
Soportada por el lenguaje de programación
Estática: se define en tiempo de compilación
!
La composición es dinámica, en tiempo de ejecución
!
La herencia impone al menos una parte de la representación
física a las subclases
Cambios en la superclase pueden afectar a las subclases
Las implementaciones de superclase y subclases están
ligadas
Si hacen falta cambios para reutilizar una clase en nuevos
dominios de aplicación habrá que cambiarla
Limita la flexibilidad y al final la reutilización
!
Los objetos adquieren referencias de otros objetos
Los objetos tienen que respetar las interfaces de los otros
objetos
• Exige un diseño cuidadoso de las interfaces
!
!
Hay menos dependencias de implementación
Habrá más objetos en el sistema y por tanto el
comportamiento del sistema dependerá de las interacciones
entre objetos en vez de estar definido en una clase
Por ello es más práctico utilizar interfaces y clases
abstractas
!
Ya que proporcionan menos o ninguna implementación
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
23
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
24
Herencia vs. Composición
!
Herencia vs. Composición
Por tanto,
!
es preferible la composición de objetos
a la herencia de clases
!
!
!
!
!
El conjunto de componentes (objetos) no suele ser lo
suficientemente rico en la práctica
Mediante herencia se pueden crear nuevos componentes que
componer con los existentes
25
Herencia vs. Composición
!
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
!
Básico:
!
area()
VentanaGUI
rectangulo
!
Rectangulo
ancho
alto
area()
return rectangulo.area()
!
return ancho *
alto
!
!
area()
!
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
27
T. Budd, An introduction to Object-Oriented Programming (Third
Edition). Pearson Education, 2001
Otros:
!
area()
VentanaGUI
26
Bibliografía
Ejemplo de delegación de objetos como alternativa a la herencia
Rectangulo
ancho
alto
Ejemplo: la clase Ventana, en vez de heredar de Rectangulo
(aunque las ventanas son rectangulares) tiene una referencia
a un objeto asociado de esa clase y delega algunas
operaciones en ella
• Si hiciera falta cambiar la forma de la ventana en tiempo de
ejecución, por ejemplo a Circulo, bastaría con cambiar la
referencia del objeto correspondiente
La herencia y la composición trabajan juntas
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
En la delegación un objeto que recibe una petición delega la
ejecución del método a otro objeto (el delegado)
• En el fondo esto es lo que hace una subclase respecto a la
superclase (al objeto this)
Sin embargo,
!
Delegación de objetos como alternativa a la herencia
E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Paterns:
Elements of Reusable Object-Oriented Software. Addison-Wesley,
1994
B. Stroustrup, The C++ Programming Language (Third Edition).
Addison-Wesley, 1997
Agustín Froufe. Java 2. Manual de usuario y tutorial. Ed. Ra-Ma
J. Sánchez, G. Huecas, B. Fernández y P. Moreno, Iniciación y
referencia: Java 2. Osborne McGraw-Hill, 2001.
B. Meyer, Object-Oriented Software Construction (Second Edition).
Prentice Hall, 1997
Juan Pavón Mestras
Facultad de Informática UCM, 2004-05
28