Full Transcript

Tema 40. Conceptos básicos de orientación a objetos: Objetos, Clases, Herencia, Métodos. Abstracción. Encapsulamiento. Herencia. Polimorfismo. El lenguaje de modelado unificado (UML). La orientación a objetos es un paradigma de programación que se basa en la creación de objetos que contienen datos...

Tema 40. Conceptos básicos de orientación a objetos: Objetos, Clases, Herencia, Métodos. Abstracción. Encapsulamiento. Herencia. Polimorfismo. El lenguaje de modelado unificado (UML). La orientación a objetos es un paradigma de programación que se basa en la creación de objetos que contienen datos y funciones, y en su interacción para resolver problemas. (\*) Para todos los ejemplos en este tema se tomará la notación del lenguaje de programación orientados a objetos java. Un **objeto** en programación orientada a objetos es una instancia de una clase. Un objeto se crea en tiempo de ejecución. Un objeto se caracteriza por tener: - [Una identidad]: que le distingue de los demás objetos. - [Un estado]: que viene definido por el valor de sus propiedades en un momento determinado de su ciclo de vida. - [Un comportamiento]: viene determinado por sus métodos. Los objetos pueden interactuar entre sí, lo que permite construir sistemas complejos a partir de estos objetos. Para crear un objeto se utiliza el operador \"new\" seguido del nombre de la clase. Por ejemplo: Rectangulo rec = new Rectangulo(); Una vez que se ha creado el objeto, se pueden acceder a sus atributos y métodos utilizando la sintaxis del punto. Por ejemplo: Una **clase** se define como la descripción de un conjunto de objetos que comparten atributos, comportamiento, relaciones y semántica. Una clase es un concepto estático, sólo existen en tiempo de definición y compilación. Las clases constan de atributos, métodos y constructores. - [Atributos]: proporcionan un lugar para almacenar el estado de un objeto. - [Métodos]: proporcionan el comportamiento del objeto. - [Constructores]: es un tipo especial de método y proporcionan la capacidad de crear instancias de la clase. Se caracterizan por: - Tener el mismo nombre que la clase. - No devolver ningún valor. Una clase se define mediante la palabra reservada \"class\", seguida del nombre de la clase y un bloque de código entre llaves. Dentro de este bloque de código se definen los atributos y métodos de la clase. Por ejemplo, la siguiente es la definición básica de una clase \"Rectangulo\": *class Rectangulo {* *int base;* *int altura;* *int calcularArea() {* *return base \* altura;* *}* *int calcularPerimetro() {* *return 2 \* base + 2 \* altura;* *}* *}* (\*) La herencia se desarrollará más adelante en el tema. Los **métodos** son acciones o comportamientos que un objeto puede realizar. Los métodos se definen dentro de una clase, y pueden ser llamados desde objetos de esa clase. Definición de un método: *modificador declaración de retorno nombreDelMetodo (\[parametro1, parametro2,...\]) {* *\-\-- Instrucciones que se ejecutarán cuando se le llame* *}* El modificador: - public - protected - private La declaración de retorno: - void: si no devuelve nada. - tipo de datos: del valor devuelto. Los parámetros son opcionales. Siguiendo con el ejemplo anterior, considera la siguiente clase \"Rectángulo\" que tiene dos métodos: \"calcularArea\" y \"calcularPerimetro\": En este ejemplo, la clase \"Rectángulo\" tiene dos métodos que calculan el área y el perímetro del rectángulo. Ambos métodos no tienen parámetros y devuelven un valor entero. Para llamar a un método desde un objeto de la clase, se utiliza el operador de punto seguido del nombre del método. Por ejemplo: *Rectangulo rect = new Rectangulo();* *rect.base = 10;* *rect.altura = 5;* *int area = rect.calcularArea(); // area será igual a 50* *int perimetro = rect.calcularPerimetro(); // perimetro será igual a 30* En este ejemplo, se crea un objeto \"Rectangulo\" y se le asignan valores a sus atributos base y altura. Luego se llama a los métodos \"calcularArea\" y \"calcularPerimetro\" utilizando el objeto \"rect\". Los valores devueltos por estos métodos se asignan a las variables \"area\" y \"perimetro\", respectivamente. La **abstracción** se refiere a la capacidad de definir clases que representen conceptos o entidades del mundo real de una manera simplificada, dejando de lado los detalles que no son relevantes para el problema que se está resolviendo. Ello nos permitirá reducir la complejidad del diseño y la implementación del software. En la abstracción, se identifican las características y comportamientos esenciales de una entidad y se agrupan en una clase. Ventajas: - Simplificación del código: Al ocultar los detalles innecesarios, podemos trabajar con objetos de manera más simple y clara. - Reutilización de código: Una vez que hemos creado una abstracción de un objeto, podemos utilizarla en múltiples partes de nuestro programa, evitando duplicar código y ahorrando tiempo y esfuerzo. - Facilita el mantenimiento: Si necesitamos realizar cambios en la implementación interna de un objeto, solo tenemos que actualizar la abstracción correspondiente, sin afectar otras partes del programa que interactúan con él. - Mayor modularidad: La abstracción nos permite dividir nuestro código en componentes más pequeños y manejables, lo cual facilita la colaboración y el mantenimiento a largo plazo. /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ Un ejemplo de abstracción en programación orientada a objetos podría ser una clase llamada \"Coche\". La abstracción en este caso se logra al definir una clase genérica \"Coche\" que puede ser utilizada para crear objetos de diferentes tipos de coches, como \"Corsa\", \"Polo\", etc. Cada uno de estos objetos tendría sus propios valores de atributos y podrían tener sus propios métodos únicos. Una clase será abstracta si tiene algún método abstracto y esa clase no podrá ser instanciada, solo pueden ser instanciadas las clases que se extienden de ella e implementan los métodos abstractos: El **encapsulamiento** se refiere a la capacidad de ocultar los detalles internos de un objeto y proporcionar una interfaz clara y consistente para interactuar con él. En la práctica, esto significa que los atributos y métodos de un objeto deben ser declarados como públicos, privados o protegidos, según el nivel de acceso que queremos permitir a otros objetos. Existen tres niveles de encapsulamiento: - [Público] (public): Los atributos y métodos públicos son accesibles desde cualquier lugar en el código. Pueden ser accedidos y modificados por cualquier objeto que tenga una referencia a la instancia de la clase que los define. - [Protegido] (protected): Los atributos y métodos protegidos son accesibles desde la propia clase y desde las subclases que la extienden, pero no desde fuera de ellas. Estos son útiles para restringir el acceso a ciertas partes de una clase y permitir que las subclases la extiendan sin tener que exponer su implementación interna. - [Privado] (private): Los atributos y métodos privados solo son accesibles desde dentro de la propia clase. Estos atributos y métodos no pueden ser accesibles desde fuera de la clase ni por las subclases que la extienden. Esto permite que los detalles internos de la implementación de la clase se mantengan ocultos y que se evite el acceso no autorizado a sus atributos y métodos. Si se desea acceder a atributos privados, se deberán declarar los métodos get y set públicos para que se pueda desde fuera de la clase poder acceder a esos atributos. La **herencia** es un concepto fundamental en la programación orientada a objetos que permite crear nuevas clases a partir de clases existentes. En la herencia, una clase llamada subclase (o clase derivada) hereda atributos y métodos de otra clase llamada superclase (o clase base). La subclase extiende la superclase, es decir, la subclase incluye todos los atributos y métodos de la superclase y además puede definir sus propios atributos y métodos adicionales. La subclase también puede modificar los métodos heredados de la superclase, o definir nuevos métodos que complementen o reemplacen a los de la superclase. Existen dos tipos de herencia: - Simple: La clase solo puede heredar de una única clase. - Múltiple: La clase puede heredar de varias clases. La herencia se define en la declaración de la subclase, especificando la superclase de la que se hereda. Ya vimos un ejemplo de herencia cuando vimos el apartado de abstracción con la clase Vehículo. Las clases Corsa y Polo además de heredar el método imprimirMarca heredan los atributos color y matrícula. El **polimorfismo** Consiste dotar a un objeto de distintas conductas según el contexto. Existen varios tipos de polimorfismo: - Universal: - Paramétrico - De inclusión - Ad-hoc: - De sobrecarga - De coerción. Solo la primera categoría agrupa los tipos que se conocen como polimorfismo verdadero porque es en tiempo de ejecución cuando se determina que comportamiento ejecutar (*Late binding*). Los Ad-hoc se resuelven en tiempo de compilación. - [Polimorfismo paramétrico]: es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (número y/o tipo). El polimorfismo paramétrico selecciona automáticamente el [método](https://www.ecured.cu/M%C3%A9todo) correcto a aplicar en función del tipo de datos los parámetros o el número de parámetros. Por lo tanto, podemos por ejemplo, definir varios métodos addition() efectuando una suma de valores. - El método *int addition (int,int)* devolvería la suma de dos números enteros. - El método *float addition (float, float)* devolvería la suma de dos flotantes. - El método *char addition (char, char)* daría por resultado la suma de dos caracteres definidos por el autor. - [Polimorfismo de inclusión] (también llamado redefinición o subtipado): La habilidad para redefinir un método que se [hereda](https://www.ecured.cu/index.php?title=Hereda&action=edit&redlink=1) de una [clase base](https://www.ecured.cu/index.php?title=Clase_base&action=edit&redlink=1) y se llama [especialización](https://www.ecured.cu/index.php?title=Especializaci%C3%B3n&action=edit&redlink=1). Por lo tanto, se puede llamar a un método del objeto sin tener que conocer su [tipo intrínseco](https://www.ecured.cu/index.php?title=Tipo_intr%C3%ADnseco&action=edit&redlink=1): esto es polimorfismo de subtipado. Siguiendo con el ejemplo de la clase abstracta de coche: (\*) Para continuar con el ejemplo anterior de la clase Coche tenemos vamos a considerar a la clase Coche no abstracta porque sino no podríamos hacer instancias de ese objeto. - [El polimorfismo de sobrecarga]: ocurre cuando existen métodos con el mismo nombre, con funcionalidad similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la función «display». Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla. - [Polimorfismo de coerción]: En una operación semántica se convierte un parámetro de un método al tipo de dato esperado para que evitar que se produzca un error de tipos. El **Lenguaje de Modelado Unificado (UML, por sus siglas en inglés)** es un lenguaje de modelado visual utilizado para describir sistemas y procesos complejos en la programación orientada a objetos (POO). Es decir, es una herramienta gráfica para visualizar, especificar, construir y documentar sistemas de software. Los objetivos de UML son muchos, pero se pueden sintetizar sus funciones: - [Visualizar]: UML permite expresar de una forma gráfica un sistema de forma que otro lo puede entender. - [Especificar]: UML permite especificar cuáles son las características de un sistema antes de su construcción. - [Construir:] A partir de los modelos especificados se pueden construir los sistemas diseñados. - [Documentar]: Los propios elementos gráficos sirven como documentación del sistema desarrollado que pueden servir para su futura revisión. Aunque UML está pensado para modelar sistemas complejos con gran cantidad de software, el lenguaje es los suficientemente expresivo como para modelar sistemas que no son informáticos, como flujos de trabajo (workflow) en una empresa, diseño de la estructura de una organización y por supuesto, en el diseño de hardware. [[https://elibro-net.ponton.uva.es/es/ereader/uva/63076?page=123]](https://elibro-net.ponton.uva.es/es/ereader/uva/63076?page=123) **Diagramas Estructurales** [Diagrama de casos de usos]: representa gráficamente los casos de uso que tiene un sistema. Se define un caso de uso como cada interacción supuesta con el sistema a desarrollar, donde se representan los requisitos funcionales. Es decir, se está diciendo lo que tiene que hacer un sistema y cómo. En la figura 3 se muestra un ejemplo de casos de uso, donde se muestran tres actores (los clientes, los taquilleros y los jefes de taquilla) y las operaciones que pueden realizar (sus roles). ![](media/image2.png) [El diagrama de clases]: muestra un conjunto de clases, interfaces y sus relaciones. Éste es el diagrama más común a la hora de describir el diseño de los sistemas orientados a objetos. En la figura 4 se muestran las clases globales, sus atributos y las relaciones de una posible solución al problema de la venta de entradas. Se busca: - Organizar el sistema, describiendo sus diferentes entidades, así como sus características y relaciones entre ellas. - Ayuda en la implementación del sistema. - Permite ver los esquemas lógicos de las estructuras de datos. [Diagrama de Objetos]: Muestra una vista completa o parcial de los objetos de un sistema en un instante de ejecución determinado. Comparte la misma notación que los diagramas de clases. El nombre del objeto se representa subrayado, a diferencia del nombre de las clases. Se busca: - Ilustrar las estructuras de datos/objetos del sistema. - Especificar detalles del modelo. - Obtener una "foto" del sistema en un determinado punto. ![](media/image4.png) **Diagramas de comportamientos** - Tipo de diagramas que persiguen mostrar el comportamiento dinámico de un sistema - Reflejan como determinadas actividades del sistema cambian a lo largo del tiempo [Diagrama de Estados:] Un Diagrama de Estados muestra una Máquina de Estados con el comportamiento del objeto. Máquina de Estados: Una máquina de estados especifica las secuencias de estados por las que pasa un objeto a lo largo de su vida en respuesta a eventos, junto con sus respuestas a esos eventos (Booch, Rumbaugh, Jacobson). Se busca: - Reflejar el comportamiento de los objetos del sistema a través de su ciclo de vida. [Diagrama de actividades:] Muestra el paso a paso de las diferentes actividades del sistema. Se busca: - Modelar el comportamiento de determinados procesos del sistema - Modelar el comportamiento de procesos complejos que engloben varios subprocesos. - Representar el flujo de negocio del sistema ![](media/image6.png) **Los diagramas de Interacción** Tipo de diagramas que modelan la comunicación entre los diferentes elementos del sistema. A diferencia de los diagramas de comportamiento, muestran la comunicación entre distintos componentes, en lugar de entre elementos de un mismo componente. [Diagrama de secuencia]: Muestra la interacción entre componentes del sistema desde el punto de vista temporal. La interacción se representa desde el punto de vista de paso de mensajes entre objetos o actores a lo largo del tiempo. Se busca: - Describir procesos internos entre diferentes módulos - Describir comunicaciones con otros sistemas o con actores [Diagramas de Colaboración]: Muestra la interacción entre objetos desde el punto de vista espacial, esto es, sólo se centra en el paso de mensajes. Utiliza los mismos elementos que los diagramas de secuencia, a excepción de las "líneas de vida". Se busca: - Identificar los diferentes objetos del sistema y su relación con los demás. - Describir el paso de mensajes entre los objetos o roles. ![](media/image8.png) **Diagramas de Implementación** Diagramas que muestran los aspectos de implementación del sistema, ya sea a nivel lógico (código fuente) como a nivel de estructura física (hardware). Permiten una visión general del sistema, sin entrar en detalles de implementación o comportamiento. [Diagrama de Componentes:] Muestra como un sistema se divide en componentes, así como las relaciones entre ellos. Poseen un nivel de abstracción superior a los diagramas de clases, ya que usualmente un componente se implementa por una o más clases en tiempo de ejecución. Utilizados en su mayor parte en el ámbito de la arquitectura del software Se busca: - Modelar la vista lógica de un sistema - Modelar el código fuente - Modelar las diferentes versiones ejecutables - Modelar bases de datos físicas - Modelar sistemas adaptables [Diagrama de Despliegue:] Muestra la topología hardware del sistema. Utilizados en su mayor parte en el ámbito de la arquitectura. Desarrollado por diseñadores, ingenieros de sistemas e ingenieros de redes. Se busca: - Indicar la distribución de los componentes - Evaluar el rendimiento y la carga del hardware del sistema - Examinar redundancia, balance de carga, etc. ![](media/image10.png)

Use Quizgecko on...
Browser
Browser