Unidad IV. Programación Orientada a Objetos
Tema I. Introducción
Tema II. Clases y Objetos
Tema III. Herencia
Tema IV. Encapsulación
Tema V. Abstracción
Objetivos
Introducir al alumno a los conceptos básicos de la programación orientada a objetos.
Introducir al alumno en técnicas generales de la programación orientada a objetos.
Que el alumno aprenda ha resolver problemas con un diseño orientado a objetos.
Enseñar técnicas de programación OO
Tema I. Introducción
Qué es un paradigma de programación
Es un conjunto de conceptos que dirigen la manera en la que construimos un programa. Como se diseñe la solución depende de los mecanismos, conceptos y maneras que un paradigma nos diga.
Algunos paradigmas conocidos
Imperativo C, Pascal, Basic, PHP, Perl. Funcional Lisp, Scheme.
Lógico Prolog.
Orientado a Objetos puros: Smalltalk, Eiffel. Orientado a Objetos hibridos: C++, Java.
Observe la distinción entre los lenguajes OxO puros e hibridos: En C++ o java, por ejemplo, existen constructos utilizados en la programación imperativa: while, for. Estos son modelados como objetos en los LOxO puros.
Justificación
La orientación por objetos es un paradigma que nace de la necesidad de poder expresar la solución de un problema en un lenguaje apegado al problema.
Ofrece un mecanismo poderoso de abstracción de ideas, que pueden ser independizadas y relacionadas, mediante mecanismos sencillos.
Cómo llegar a la Programación Orientada a Objetos
Programación Procedural: decida que procedimientos desea, luego utilice los mejores algoritmos que encuentre.
Programación Modular: Decida que módulos desea, luego parta el programa de tal forma que la data sea ocultada por los módulos.
El paradigma de la programación modular es también conocido como el principio del ocultamiento de la data. Como hacer:
Busque una interfaz para manejar la data.
Asegurese que la data sea solamente accesible a través de dicha interfaz. Asegurese que dicha data sea inicializada siempre, antes de su primer uso.
Cómo llegar a la Programación Orientada a Objetos (Cont.)
Abstracción de la data: la modularidad es el pilar de todos los programas de gran escala.
Tipos definidos por el usuario:
C++ ataca este problema, permitiendo que un usuario pueda declarar los tipos casi tal como se hace con los propios tipos internos.
El paradigma es:
Decida que tipos quiere, luego especifique cuales son las operaciones sobre esos tipos.
Ejemplo
¿Recuerda qué es un número complejo? class complex {
float real; float img; public:
complex (float r, float i) {real=r; img=i;} complex (float r) {real=r; img=0;}
complex operator+(complex _a)
{ return complex(_a.real + real, _a.img + img); } };
Tipos Abstractos
Un tipo abstracto, no está definido del todo. Especifica una interfaz y posteriormente otras clases podrán definir, concretamente la funcionalidad.
En C++ un tipo de dato abstracto está compuesto de funciones virtuales puras. Esto le dice al programador, que son funciones que podrían ser especificadas luego, en clases derivadas.
Ejemplos
Suponga que se desea construir una interfaz para tratar figuras geométricas. class figGeom {
char * nombre[30]; public:
virtual float area( )=0; virtual float rotar( )=0; };
class triangulo : public figGeom { coordenada_punto p1, p2, p3; public: float area() { // calcula area } ... };
El constructo “: public” se lee como deriva de, implementa a, hereda de, es un subtipo de.
Qué es Orientación por Objeto?
Si hablamos de un software orientado por objetos, puede verse como una colección de objetos, donde cada uno está formado por estructura de datos más la especificación de cada una de esas estructuras.
Ejemplo de objetos:
Una lápiz, una bicicleta, un elefante.
El segundo parrafo de la página 1 del cuento “El Principito”, El titulo de la obra más importante de D. Knuth “El arte de la programación”.
Tema II. Clases y Objetos
Clases
Una clase es un conjunto de datos y operaciones sobre esos datos, pero con añadiduras para hacer la abstracción mucho más poderosa.
Caja negra que oculta en su implementación:
Atributos: variables que codifican el estado de una instancia de la clase
(objeto)
Métodos: subprogramas que describen el comportamiento de un objeto de
la clase
Objetos
Instancia de una clase:
Cada objeto de una clase tiene su propia copia de los atributos (estado propio).
Todos los objetos de una clase comparten los mismos métodos (comportamiento común).
Un objeto consta de:
• Tiempo de vida: La duración de un objeto en un programa siempre está
limitada en el tiempo. La mayoría de los objetos sólo existen durante una parte de la ejecución del programa. Los objetos son creados mediante un mecanismo denominado instanciación, y cuando dejan de existir se dice que
son destruidos.
• Estado: Todo objeto posee un estado, definido por sus atributos. Con él se
definen las propiedades del objeto, y el estado en que se encuentra en un momento determinado de su existencia.
• Comportamiento: Todo objeto ha de presentar una interfaz, definida por sus métodos, para que el resto de objetos que componen los programas puedan
interactuar con él.
El equivalente de un objeto en el paradigma estructurado sería una variable. Así
mismo la instanciación de objetos equivaldría a la declaración de variables, y el tiempo de vida de un objeto al ámbito de una variable.
Ejemplo
La clase bicicleta es una definición abstracta, sin forma. Una bicicleta debe tener: Una biela, un cuadro, dos pedales, una o más ruedas, un volante, frenos.
Un objeto rueda puede ser: Una bicicleta de montaña, Una bicicleta de ruta, Una bicicleta de velodromo, Una bicicleta de paseo para 2 personas.
Atributos de la Clase Bicicleta: Llantas, pedales, cadena, cambios, frenos, sillín, ...
Operaciones sobre la Clase Bicicleta: Hacer cambios de la velocidad.
Frenar.
Mover el volante a la izquierda. Mover el volante a la derecha. Ajustar freno.
Observar el presión de aire de las llantas. Ajustar altura del asiento.
Diagramas
De Objetos: Proporcionan grafismos formales para modelar objetos, clases y sus relaciones entre si.
De Clases: Resume todas las posibles instancias de objetos.
De Instancias: Especifica como se relacionan un conjunto de objetos. Ejemplo:
Operaciones y Métodos
Las operaciones y los métodos son las acciones que permitirán darle sentido a los datos de los objetos.
Pueden ser referidas como acciones genericas o generales, luego se podrá especificar su conducta.
Ejemplo:
Modelo para la notación de Clases
Asociaciones Muchos a Muchos
Asociaciones Ternarias
Observe que para que este tipo de asociación tenga sentido, ninguno de las tres clases puede estar fuera
.
Multiplicidad
Dice que cantidad de instancias de clase están relacionadas con otras clases de relación explicita.
Expresa una cantidad finita o infinita de elementos relacionados. Hay simbolos especiales para expresar la relación de multiplicidad.
Multiplicidad Cero o Uno
Un auto puede tener o no un triángulo de seguridad.
Para poder escribir la multiplicidad, primero se determinan: objetos, clases y asociaciones.
Atributos en los Enlaces
Un atributo es un descriptor inherente a los objetos de una clase. Asi mismo, un atributo de enlace es un descriptor inherente a los enlaces de asociación.
Vea el gran parecido entre los atributos de objetos y atributos de enlaces. Las asociaciones del tipo muchos a muchos proporcionan el escenario ideal para colocar atributos a los enlaces.
Los atributos son propiedad del enlace, y pierde sentido (información) si se asociara a alguno de los objetos.
Atributos dentro de Asoc. uno a muchos
Atributos para los enlaces en asociaciones ternarias
Tema III. Herencia
Definición
La herencia es la propiedad que permite a los objetos construirse a partir de otros objetos.
Es el mecanismo que permite que un clase A herede propiedades de una clase B. Decimos "A hereda de B". Objetos de la clase A tienen así acceso a los atributos y métodos de la clase B sin necesidad de redefinirlos. La
siguiente definición describe dos términos con los que podemos hacer referencia a las clases involucradas cuando se usa la herencia.
Superclase y Subclase
(Superclase/Subclase) Si la clase A hereda de la clase B, entonces B es la superclase de A. A es subclase de B. Los objetos de una subclase pueden
ser usados en las circunstancias donde son usados los objetos de la superclase correspondiente. Esto se debe al hecho que los objetos de la subclase comparten el mismo comportamiento que los objetos de la superclase.
En la literatura también se pueden encontrar otros términos para "superclase" y para "subclase". Las superclases también son llamadas clases padres. Las
subclases pueden ser llamadas también clases hijas o simplemente clases derivadas.
En C++
En C++ la clase original se denomina clase base; las clases que se definen a partir de la clase base, compartiendo sus características y añadiendo otras nuevas, se denominan clases derivadas.
Las clases derivadas pueden heredar código y datos de su clase base añadiendo su propio código y datos a la misma.
Gráfica de herencia
Por supuesto, también se puede heredar de una subclase, haciendo que esta clase sea la superclase de la nueva subclase. Esto conduce a una jerarquía de relaciones superclase/subclase. Si dibujas esta jerarquía, se obtiene una gráfica de herencia.
Una gráfica de herencia consiste en usar flechas para indicar la relación de herencia entre clases u objetos.
Tipos
En la orientación a objetos, se consideran dos tipos de herencia, simple y múltiple.
Simple: Una clase se deriva de sólo una clase base.
Ejemplo1
class estudiante : public persona { ... };
Un conjunto de datos, por omisión es privado. En el ejemplo anterior, la clase estudiante hereda, publicamente de la clase persona. Puede leerse: se
deriva de, implementa, es un subtipo de...
Todos los métodos y datos de la clase persona, son accessibles desde las instancias de la clase estudiante.
Ejemplo2
class estudiante : private persona { ... };
Los métodos de la clase persona ahora no son accesibles desde las instancias de la clase estudiante.
Por ejemplo el tipo de dato tipo_persona, no deberia ser accesible desde persona, pues se fija desde el constructor de la clase estudiante.
Ejemplo3
Cuando hay herencia pública, los permisos de la clase original se preservan. class A {
private: int a, b; public:
void set_a(int _a); void set_b(int _b); };
Tema IV. Encapsulación
Definición
La encapsulación es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas más comunes de encapsular elementos.
Encapsulación es la habilidad de una parte de un programa para ocultar sus datos al resto del código, impidiendo así accesos incorrectos o conflictos con los nombres de otras variables.
Justificación
Las principales razones técnicas para la utilización de la encapsulación son: 1) Mantener a salvo los detalles de representación, si solamente nos interesa el comportamiento del objeto.
2) Modificar y ajustar la representación a mejores soluciones algorítmicas o a nuevas tecnologías de software.
La encapsulación también permite controlar la forma de utilizar los datos y los procedimientos. Se pueden utilizar modificadores de acceso, como Private o Protected, para evitar que procedimientos externos ejecuten métodos de clase o lean y modifiquen datos en propiedades y campos. Los detalles internos de una clase deben declararse como Private para evitar que sean utilizados fuera de la misma.
Tema V. Abstracción
Definición
Es un mecanismos que permite representar en términos de un modelo sencillo una realidad muy compleja.
Separa el “qué” del “cómo”. Enfoca los aspectos esenciales inherentes a una entidad e ignora las propiedades casuales o temporales, se ignoran los detalles irrelevantes.
Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas
características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando los están, una variedad de técnicas son requeridas para ampliar una abstracción.
Abstracción funcional
Funcionalmente, un coche puede realizar las siguientes acciones:
• Ir • Parar
• Girar a la derecha • Girar a la izquierda
Hay cosas que se sabe que los coches hacen, pero el cómo lo hacen, la implementación de ir, parar, girar (a la derecha, a la izquierda) es irrelevante desde el punto del diseño. Esto es lo que se conoce como abstracción funcional.
Abstracción de datos
De forma semejante a la anterior, un coche tiene las siguientes características o atributos:
• Color • Velocidad • Tamaño • Carburante
La manera en que se almacenan o definen esos atributos, también es irrelevante para el diseño del objeto. Por ejemplo, el color puede definirse como la palabra rojo, o como un vector RGB (255,0,0). La forma en que el objeto almacena el atributo color es irrelevante para el programador. Este proceso de despreocupación de cómo se almacena el color es lo que se llama abstracción de datos.
Ventajas
• Permite el ocultamiento de la información. El acceso y la modificación
se hace a través de la interface y por las operaciones definidas por el mismo tipo abstracto del dato, pero, los detalles de implementación de sus operaciones no son visibles para el usuario final.
• Ayuda a proteger el acceso, la manipulación y actuación de los objetos:
se asegura que sólo pueda ejecutarse una operación que fue definida o descrita para un objeto particular en la interface.
• Cada abstracción es independiente.
• Reduce la complejidad global del sistema.
• Agiliza (facilita) la verificación y el razonamiento.
• La barrera entre especificación y diseño preliminar se elimina casi
completamente.
• Los programas son más cortos, legibles y flexibles. Es por ello