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