Híper introducción a Objetos Herman Schinca Clase 27 y ¡última! 1 de Julio de 2011 Paradigma de Objetos Al igual que Funcional, se trata de una filosofía, de un paradigma, no de un lenguaje particular. Determina cómo comprenderemos el mundo y, por ende, cómo afrontaremos las soluciones a nuestros problemas. De ahora en más nos referiremos a POO (Programación/Paradigma Orientado a Objetos) ¿Qué es la realidad en POO? Un conjunto de objetos interactuando o colaborando entre si a través del pasaje de mensajes. ¡Todo es un objeto! ¿Y los “mensajes”? También son objetos... Recuerda que TODO ES UN OBJETO. ¿Qué es un objeto? Muchos posibles enfoques para definirlo: 1) Una entidad runtime que tiene: -Identidad -Estado -Comportamiento o interfaz 2) Un espacio físico de memoria. 3) Una instancia de una clase (en C++). Representación vs Interfaz Dos objetos A y B sólo se pueden comunicar entre sí mediante sus interfaces. No conocen su representación interna, es decir, cómo están construidos. Luego, la interfaz es quien determina cuál es el tipo de mi objeto. Abstracción Objeto del mundo real ≠ Objeto en POO. Debemos abstraer cuál es la escencia del objeto a caracterizar en función del contexto en que dicho objeto se halle. Un mismo objeto del mundo real puede tener distintas representaciones en distintos contextos. Abstracción: Ejemplo ¿Qué es un avión? Y en el contexto del viajero errático que toma un vuelo a Bangladesh ¿qué es un avión? ¿Y en el contexto de un piloto? Ocultamiento de la información Los objetos sólo deben conocer las interfaces de otros objetos sin importar su representación interna. Los detalles de implementación deben quedar acotados dentro del objeto. Encapsulamiento Tratar de separar el qué del cómo. Independizar qué es lo que se pretende hacer de cuál va a ser la estrategia para lograrlo. Ejemplo: método sort() de listas en Python. ¿Cuál estrategia de sorting utiliza? ¿Selection, Merge, Quick? Sólo sabemos que ordena (de alguna manera), y eso da flexibilidad a la hora de cambiar la implementación de sort(). Ventajas de los 3 conceptos • La implementación se puede cambiar y mejorar sin afectar su uso. • Ayuda a modularizar. • Facilita la comprensión. • Favorece el reuso. • Los módulos son más fáciles de entender. • Y de programar. • El sistema es más resistente a los cambios. Objetos en C++ Un objeto es una instancia de una clase particular, con datos bien definidos. Una clase es un modelo que define cuáles van a ser las componentes que caracterizarán a los objetos creados. Clases vs Objetos Una clase es la abstracción de un conjunto de objetos que comparten ciertas características. Es una entidad del mundo del diseño, del mundo de las ideas (diría Platón). Un objeto es una entidad runtime. Tiene valores concretos. Es un elemento del conjunto de objetos que representa su clase. Ejemplo en C++: Rectángulo Queremos representar el objeto matemático “Rectángulo”. ¿Qué características definen un rectángulo? ¿Qué operaciones debería saber responder un rectángulo? Representación vs Interfaz en C++ La sección public determinará cuál es la interfaz de los objetos, cómo se comunicarán con el mundo. En private estarán aquellas cosas que representan al objeto, más detalles de implementación que no deseamos mostrar. Constructores Son los métodos que crean los objetos de la clase. Típicamente se implementan 3: -Por defecto -Por parámetros -Por copia Destructores Así como creábamos arreglos dinámicos pidiendo y liberando la memoria, los objetos deben crearse y destruirse. Pero sólo se destruyen si trabajamos con tipos no básicos, es decir, pidiendo memoria dinámicamente para crear al objeto (que es lo que ocurre en la mayoría de los casos). Getters y Setters Como dijimos que no podemos acceder a la representación interna de los objetos, tenemos que de alguna manera poder observarlos y modificarlos. Observadores = getters. Modificadores = setters. Otras operaciones Son funcionalidades o mensajes que el objeto sabe realizar pero que no son escenciales, sino las tenemos el objeto sigue estando bien definido. Objetos: Mucho más que código Veamos ejemplos reales de software ≠ programa. El mayor esfuerzo no está en la codificación. ¿Cómo encarar proyectos que poseerán cientos de miles de líneas de código y decenas de programadores? Temas avanzados •Templates (C++) •Sobrecarga de operadores (C++) •Métodos friend (C++) •Herencia (POO) •Variables y métodos de clase (POO) •Clases abstractas (POO) •Diseño de Objetos (POO) •Patrones de diseño (POO) •Muchísimos más... Bibliografía para C++ •Bjarne Stroustrup, The C++ Programming Language, AddisonWesley, 1997. •Bruce Eckel, Thinking in C++, BinaryThing.com ePublishing Network, 2000. (En Internet) •Brian Kernighan y Rob Pike, La Práctica de la Programación, Prentice-Hall, 2000. •Stanley Lippman y Josée Lajoie, C++ Primer, Addison Wesley. Bibliografía para POO •David West, Object Thinking, Microsoft Press, 2004. •Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides, Design Patterns – Elements of Reusable Object-Oriented Software, Addison Wesley, 1995. •Bertrand Meyer, Object-Oriented Software Construction, Prentice Hall, 1997. •Alan Kay, The Early History of Smalltalk, 1993 (Paper).