UNIDAD I PROGRAMACION ORIENTADA A OBJETOS LSC. Natalia Rodríguez Castellón Antecedentes • Tradicionalmente, la programación fue hecha en una manera secuencial o lineal, es decir una serie de pasos consecutivos con estructuras consecutivas y bifurcaciones. • Los lenguajes basados en esta forma de programación ofrecían ventajas al principio, pero el problema ocurre cuando los sistemas se vuelven complejos. Estos programas no ofrecen flexibilidad y el mantener una gran cantidad de líneas de código en un sólo bloque se vuelve una tarea complicada. • Frente a esta dificultad aparecieron los lenguajes basados en la programación estructurada. La idea principal de esta forma de programación era separar las partes complejas del programa en módulos o segmentos que sean ejecutados conforme se requieran. Obteniendo un diseño modular que fue reemplazando la programación lineal. • Entonces, vemos que la evolución que se fue dando en la programación se orientaba siempre a ir descomponiendo más el programa. Este tipo de descomposición conduce directamente a la Programación orientada a objetos. • Pues la creciente tendencia de crear programas cada vez más grandes y complejos llevó a los desarrolladores a crear una nueva forma de programar que les permitiera crear sistemas de niveles empresariales y con reglas de negocios muy complejas. Para estas necesidades ya no bastaba la programación estructurada ni mucho menos la programación lineal. Es así como aparece la Programación Orientada a Objetos (POO). • La POO viene de la evolución de la programación estructurada; básicamente la POO simplifica la programación con la nueva filosofía y nuevos conceptos que tiene. • La POO se basa en dividir el programa en pequeñas unidades lógicas de código. A estas pequeñas unidades lógicas de código se les llama objetos. Los objetos son unidades independientes que se comunican entre ellos mediante mensajes. Características Encapsulación • Manera de ocultar los detalles de la representación interna de un objeto presentando solo la interface para el usuario. • El encapsulamiento consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto en una sola entidad. El encapsulamiento se logra gracias a la abstracción y el ocultamiento. • La ventaja del encapsulamiento es la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará conocer qué hace la Clase pero no será necesario saber cómo lo hace. Características…. Polimorfismo • Indica la posibilidad de que un objeto tome varias formas diferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos. • En términos prácticos, el polimorfismo permite referirse a objetos de clases diferentes mediante el mismo elemento de programa (método) y realizar la misma operación de diferentes formas, según sea el objeto que se referencia en ese momento. El polimorfismo se relaciona con los métodos. • Hay 3 tipos de Polimorfismo: Polimorfismo de Sobrecarga Polimorfismo Paramétrico Polimorfismo de Inclusión o redefinición Características…. • • • Polimorfismo de Sobrecarga: Ocurre cuando los métodos del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra. Diferentes objetos tienen métodos con el mismo nombre, por ejemplo: el método „encender‟ para el objeto televisión, impresora, celular, auto, etc. Este tipo de polimorfismo nos permite definir operadores cuyo comportamiento varía de acuerdo a los parámetros que se les aplican. Por ejemplo: el operador „+‟, tiene diferente comportamiento si se usa con números que cuando es usado con letras. Polimorfismo Paramétrico: es la capacidad para definir varios métodos utilizando el mismo nombre, pero usando parámetros diferentes. Se conoce como sobrecarga de métodos. Polimorfismo de Inclusión también llamado redefinición: cuando se utiliza herencia, se puede definir un método sin importar el objeto específico, sino el de la clase generalizada. Por ejemplo: en un juego de ajedrez podemos tener el método movimiento, sin importar el objeto específico que puede ser un rey, reina, caballo, torre, etc. Es decir, permite que los métodos de los hijos puedan ser invocados mediante un mensaje que se envía al padre. Características…. Herencia • Es la capacidad de un objeto (clase) para utilizar las estructuras y los métodos existentes en antepasados o ascendentes. Es uno de los conceptos más cruciales en la POO ya que permite la reutilización de código desarrollado anteriormente. • La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. Tipos de herencia • Herencia simple: un tipo derivado se crea a partir de una única clase base. • Herencia múltiple: una clase tiene más de una ascendente inmediato. Características…. Superclase: Clase de la cual otra clase hereda. Subclase: Clase que hereda de una o más clases. (subclase, especialización de la superclase). NO todos los lenguajes de programación orientada a objetos usan la herencia múltiple. Clase abstracta. Su comportamiento no esta totalmente definido. sirven para captar las propiedades generales que posteriormente son particularizadas en las subclases. Clase Base. Clase que no tiene superclases. Características…. Abstracción • Caracterización de un objeto de acuerdo a las propiedades que nos interesen en un instante de tiempo. • Por ejemplo los automóviles, ¿Qué características podemos abstraer de los automóviles? O lo que es lo mismo ¿Qué características semejantes tienen todos los automóviles? Todos tendrán una marca, un modelo, número de motor, peso, llantas, puertas, ventanas, etc. Y en cuanto a su comportamiento todos los automóviles podrán acelerar, frenar, retroceder, etc. • En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el mecanismo por el cual se gestionan las abstracciones. Características…. Cohesión • Es la interacción interna de un módulo: todos los elementos de un módulo han de tener relación. Acoplamiento • Es la interacción entre módulos, y se refiere al grado de dependencia que tienen dos módulos (un método, una clase, un componente, etc.) para realizar algún cometido. Sus propiedades deberían ser: • Facilitar la sustitución de un módulo realizando pocos cambios en los otros. • Facilitar el seguimiento y aislamiento de un error (módulo defectuoso). • Cuando dos módulos son absolutamente independientes (cada una puede hacer su trabajo sin contar para nada con la otra), encontramos el grado más bajo de acoplamiento. Este debe ser el objeto al programar. objetos • Un objeto del mundo real es cualquier cosa que vemos a nuestro alrededor. En la POO se define como una entidad que contiene los atributos que describen el estado de un objeto del mundo real y las acciones que se asocian con dicho objeto. OBJETO = DATOS (atributos) + OPERACIONES (métodos) • Un objeto es un elemento independiente de un programa de computadora, que representa un grupo asociado de características y está diseñado para realizar tareas específicas. A los objetos también se les conoce como instancias. objetos • Un objeto se compone por: • Estado se compone de las propiedades estáticas de un objeto con valores dinámicos asociados a ellas en un momento dado. (variables de instancia) • Comportamiento es la forma en que actúa y reacciona el objeto, expresado en términos de cambios de estado y envío de mensajes a otros objetos. (métodos) (encender, acelerar, frenar, apagar) • Identidad. Propiedad que distingue a un objeto de los demás. clases • Una clase es la descripción de un conjunto de objetos. Consta de métodos y datos que resumen las características comunes de un conjunto de objetos. Muestra el comportamiento general de un grupo de objetos. • Definición teórica: La clase es un modelo o prototipo que define las variables y métodos comunes a todos los objetos de cierta clase. También se puede decir que una clase es una plantilla genérica para un conjunto de objetos de similares características. • Un objeto es una instancia de una clase. • Las clases son estáticas, forman parte del texto del programa y no cambian durante su ejecución. Los objetos por el contrario son totalmente dinámicos, se crean, cambian su estado y se destruyen. Clases • En UML, una clase es representada por un rectángulo que posee tres divisiones: • En donde: – Superior: Contiene el nombre de la Clase – Intermedio: Contiene los atributos (o variables de instancia) que caracterizan a la Clase (pueden ser private, protected o public). – Inferior: Contiene los métodos u operaciones, los cuales son la forma como interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public). Clases • Ejemplo: Una Cuenta Corriente que posee como característica: – Balance • Puede realizar las operaciones de: – Depositar – Girar – y Balance • El diseño asociado es: Clases • Atributos y Métodos: – Atributos: • Pueden ser de tres tipos, los que definen el grado de comunicación y visibilidad de ellos con el entorno, estos son: • public: Indica que el atributo será visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados. • private: Indica que el atributo sólo será accesible desde dentro de la clase (sólo sus métodos lo pueden accesar). • protected : Indica que el atributo no será accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de las subclases que se deriven. Clases – Métodos: • Los métodos u operaciones de una clase son la forma en como ésta interactúa con su entorno, éstos pueden tener las características: • public: Indica que el método será visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados. • private: Indica que el método sólo será accesible desde dentro de la clase (sólo otros métodos de la clase lo pueden accesar). • protected: Indica que el método no será accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de métodos de las subclases que se deriven. Relaciones entre clases Las relaciones entre clases es como se pueden interrelacionar dos o más clases (cada uno con características y objetivos diferentes). Para comprenderlo es necesario entender el concepto de cardinalidad de relaciones: En UML, la cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada extremo de la relación y éstas pueden ser: – uno o muchos: 1..* (1..n) – 0 o muchos: 0..* (0..n) – número fijo: m (m denota el número). Relaciones entre clases Dependencia o Instanciacion • Es una relación de uso, es decir una clase usa a otra, que depende de ella para su propósito. Con la dependencia mostramos que un cambio en la clase utilizada puede afectar al funcionamiento de la clase utilizadora, pero no al contrario. • Se recomienda que una clase realice una única función. De manera que las clases que deban realizar funciones complejas estarán formadas a partir de una asociación de diversas pequeñas clases en las que delegará cada funcionalidad en concreto. Ejemplo: un carro usa un motor Generalizacion(Herencia)-Especializacion “Es un tipo de”, “Es un” Indica que una subclase hereda los métodos y atributos especificados por una Super Clase, por ende la Subclase además de poseer sus propios métodos y atributos, poseerá las características y atributos visibles de la Super Clase (public y protected), ejemplo: Desde el punto de vista (de arriba-abajo) de la clase ascendente (padre), se trata de una generalización de las hijas en el padre. Desde el punto de vista de las (abajo-arriba) clases descendientes (hijas), se trata de una especialización de la clase base. Relaciones entre clases • Agregación (herencia) “es-parte_de” o “tiene-un” • Cuando se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicación, tenemos dos posibilidades: – Por Valor: Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye. Este tipo de relación es comunmente llamada Composición (el Objeto base se contruye a partir del objeto incluido, es decir, es "parte/todo"). – Por Referencia: Es un tipo de relación dinámica, en donde el tiempo de vida del objeto incluido es independiente del que lo incluye. Este tipo de relación es comunmente llamada Agregación (el objeto base utiliza al incluido para su funcionamiento). • En donde se destaca que: • Un Almacen posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias). • Cuando se destruye el Objeto Almacen también son destruidos los objetos Cuentas, en cambio no son afectados los objetos Cliente. • La composición (por Valor) se destaca por un rombo relleno. • La agregación (por Referencia) se destaca por un rombo transparente. Relaciones entre clases Asociación “pertenece-a” , “esta-asociado-con”, “trabaja_para”, “emplea_a” • Es una relación entre clases. Implica una dependencia semántica. Se da cuando una clase usa a otra clase para realizar algo. • El establecimiento de una asociación define los roles (papeles) entre objetos de dos clases y sus cardinalidades ( multiplicidad ); es decir, cuantas instancias (ejemplares) de cada clase pueden estar implicadas en una asociación. • Una asociación es, normalmente, bidireccional, lo que significa que si un objeto se asocia con otros objetos, ambos objetos se conocen entre si. Una asociación representa que objetos de dos clases tienen un enlace entre ellos, lo que significa por ejemplo, que ellos conocen sobre los otros, están conectados a, para cada x hay una y Relaciones entre clases La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre si. Cabe destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro. Ejemplo: Un cliente puede tener asociadas muchas Ordenes de Compra, en cambio una orden de compra solo puede tener asociado un cliente. metodos Métodos • Los métodos ( operaciones o servicios ) describen el comportamiento asociado a un objeto. La ejecución de un método puede cambiar el estado del objeto o dato local del objeto. Por ejemplo un automóvil al “encenderse” cambia su estado • Cada método tiene un nombre y un cuerpo que realiza la acción o comportamiento asociado con el nombre del método. • El cuerpo de un método consta de un bloque de código que ejecuta la acción requerida. Todos los métodos que alteran o acceden a los datos de un objeto se definen dentro de la clase. No se deben modificar los datos ( atributos ) de los objetos directamente. Mensajes, instancias Un Mensaje • Es una petición que se envía a un objeto para indicarle que realice alguna acción. Permite la comunicación entre objetos ya que estos realizan acciones cuando reciben mensajes. • Esta técnica de enviar mensajes a objetos se denomina paso de mensajes. Consiste en invocar un método. Ej. objeto. método ([parámetros]); Instancias • Una instancia se produce con la creación de un objeto perteneciente a una clase (instanciar una clase), un objeto es una instancia de una clase, el objeto recibe los atributos, propiedades y métodos de la clase para ser usados dentro de un programa. • Ejemplo : Circulo miCirculo =new Circulo();