## Bloque 3 Tema 4. Diseño y programación orientada a objetos. Elementos y componentes software: objetos, clases, herencia, métodos, sobrecarga. Ventajas e inconvenientes. Patrones de diseño y lenguaje de modelado unificado UML.

Este tema estudia los fundamentos de la programación orientada a objetos, los patrones de diseño y el lenguaje de modelado UML.

---

## 1. Programación orientada a objetos

La programación orientada a objetos, conocida como POO, es un paradigma de programación que modela la realidad mediante objetos que combinan datos y comportamiento.

Un objeto es una instancia concreta de una clase que tiene estado, representado por sus atributos; comportamiento, representado por sus métodos; e identidad, que lo distingue de otros objetos.

Una clase es la plantilla o molde que define los atributos y métodos comunes a todos los objetos de ese tipo. Por ejemplo, Empleado es una clase y Juan García con DNI 12345678A es un objeto o instancia de esa clase.

Los cuatro pilares de la programación orientada a objetos son los siguientes.

La abstracción consiste en representar solo las características relevantes de un objeto, ocultando los detalles de implementación. Se modela qué hace el objeto, no cómo lo hace internamente.

El encapsulamiento consiste en proteger los atributos de un objeto restringiendo el acceso directo desde el exterior. Los atributos suelen declararse privados y se accede a ellos mediante métodos públicos llamados getters y setters. Esto garantiza la integridad del estado del objeto.

La herencia permite crear una clase nueva, llamada subclase o clase hija, a partir de una clase existente, llamada superclase o clase padre, reutilizando y extendiendo sus atributos y métodos. Por ejemplo, Empleado hereda de Persona, adquiriendo sus atributos nombre y DNI y añadiendo nuevos como departamento y salario.

El polimorfismo permite que objetos de distintas clases respondan de forma diferente al mismo mensaje o llamada de método. Hay dos tipos: el polimorfismo de sobrescritura o override, en el que una subclase redefine un método de la superclase; y la sobrecarga u overload, en la que se definen varios métodos con el mismo nombre pero distintos parámetros dentro de la misma clase.

El acoplamiento es el grado de dependencia entre clases. Un bajo acoplamiento es deseable porque facilita el mantenimiento y la reutilización. La cohesión es el grado en que los elementos de una clase están relacionados entre sí. Una alta cohesión es deseable porque indica que la clase tiene una responsabilidad clara y única.

Las ventajas de la POO son la reutilización de código mediante herencia y composición, la modularidad, la facilidad de mantenimiento y la mejor representación del dominio del problema. Sus inconvenientes son la mayor complejidad inicial, el posible impacto en el rendimiento frente a la programación procedural y la curva de aprendizaje.

---

## 2. Patrones de diseño

Los patrones de diseño son soluciones reutilizables a problemas recurrentes en el diseño de software orientado a objetos. Se clasifican en tres categorías: creacionales, estructurales y de comportamiento.

El patrón MVC, o Modelo-Vista-Controlador, divide la aplicación en tres componentes. El Modelo gestiona los datos y la lógica de negocio. La Vista es la interfaz de usuario que muestra los datos. El Controlador recibe las acciones del usuario, actualiza el modelo y selecciona la vista adecuada. MVC es la base de la mayoría de los frameworks web modernos.

Los patrones GRASP, o General Responsibility Assignment Software Patterns, son un conjunto de principios para asignar responsabilidades a las clases. Los más importantes son los siguientes. Controller o Controlador asigna la responsabilidad de recibir y gestionar los eventos del sistema a una clase controladora. Low Coupling o bajo acoplamiento busca reducir las dependencias entre clases para facilitar el mantenimiento. High Cohesion o alta cohesión agrupa en una clase solo las responsabilidades fuertemente relacionadas. Polymorphism o polimorfismo usa la herencia y las interfaces para asignar comportamientos variables.

---

## 3. Lenguaje de modelado unificado UML

UML, o Unified Modeling Language, es el lenguaje estándar para visualizar, especificar y documentar sistemas orientados a objetos. Se divide en diagramas estructurales, que describen la estructura estática del sistema, y diagramas de comportamiento, que describen la dinámica.

Los diagramas estructurales más importantes son los siguientes. El diagrama de clases muestra las clases, sus atributos, métodos y las relaciones entre ellas como herencia, asociación, agregación y composición. Es el diagrama más utilizado. El diagrama de objetos muestra instancias concretas de las clases en un momento dado. El diagrama de componentes muestra los componentes físicos del sistema como servicios web, ejecutables y librerías. El diagrama de paquetes organiza las clases en grupos lógicos llamados paquetes. El diagrama de despliegue muestra la distribución física del sistema con nodos, que son las máquinas o servidores; artefactos, que son los ficheros, librerías y bases de datos; y las conexiones entre ellos.

Los diagramas de comportamiento más importantes son los siguientes. El diagrama de casos de uso muestra las funcionalidades del sistema desde el punto de vista del usuario, representadas como actores y casos de uso. El diagrama de actividades es similar a un diagrama de flujo y representa los flujos de trabajo o algoritmos. El diagrama de comunicación muestra cómo los objetos interactúan entre sí mediante mensajes. El diagrama de secuencia muestra la interacción entre objetos a lo largo del tiempo con un eje temporal vertical.

---

## Miniresumen final del tema

La POO se basa en cuatro pilares: abstracción, encapsulamiento, herencia y polimorfismo. La sobrecarga define métodos con el mismo nombre y distintos parámetros; la sobreescritura redefine un método de la superclase en la subclase. El patrón MVC separa Modelo, Vista y Controlador. Los patrones GRASP incluyen Controller, Low Coupling, High Cohesion y Polymorphism. UML tiene diagramas estructurales como el de clases y despliegue, y de comportamiento como los de casos de uso, actividades y secuencia.
