Resumen de la segunda parte de POO PDF
Document Details
Uploaded by LavishPlateau257
Tags
Summary
Este documento resume la segunda parte de un curso sobre POO, incluyendo conceptos como mecanismos de abstracción, clasificación y reutilización, herencia, polimorfismo y encapsulamiento. Explica cómo estos conceptos ayudan a desarrollar software eficiente.
Full Transcript
Resumen de la segunda parte de POO Puntos claves Tema 6 1. Mecanismos de Abstracción: Herramientas que permiten simplificar y organizar el código. 2. Clasificación y Reutilización: Uso de clases para instanciar objetos y reutilizar definiciones. 3. Agregación y Composición:...
Resumen de la segunda parte de POO Puntos claves Tema 6 1. Mecanismos de Abstracción: Herramientas que permiten simplificar y organizar el código. 2. Clasificación y Reutilización: Uso de clases para instanciar objetos y reutilizar definiciones. 3. Agregación y Composición: Construcción de elementos complejos a partir de elementos más simples. 4. Herencia: Permite que una clase derive de otra, facilitando la reutilización de código. 5. Polimorfismo: Capacidad de diferentes clases de ser tratadas como instancias de la misma clase a través de una interfaz común. 6. Encapsulamiento: Ocultación de los detalles internos de una clase y exposición de solo lo necesario. 7. Objetos: Instancias de clases que representan entidades en el mundo real. 8. Clases: Plantillas que definen las propiedades y comportamientos de los objetos. 9. Métodos: Funciones definidas dentro de una clase que describen los comportamientos de los objetos. 10. Problema del Diamante: Conflicto de nomenclatura que surge en la herencia múltiple. 11. Reusabilidad de Código: Ventaja de construir sobre logros previos, evitando la duplicación de esfuerzos. 12. Desarrollo de Software Eficiente: Aumento de la productividad y robustez al utilizar componentes probados. Mecanismos de Abstracción Son técnicas que permiten simplificar la complejidad del código al enfocarse en las características relevantes de un problema. A través de la abstracción, los desarrolladores pueden crear modelos que representan la realidad de manera más comprensible, facilitando la organización y el mantenimiento del código. Clasificación y Reutilización Este mecanismo se basa en el uso de clases para crear objetos. Al definir una clase, se establece una plantilla que describe las propiedades y comportamientos de los objetos que se instanciarán a partir de ella. Esto permite reutilizar el código de la clase cada vez que se crea un nuevo objeto, lo que ahorra tiempo y esfuerzo en el desarrollo. Agregación y Composición Ambos son mecanismos que permiten construir objetos complejos a partir de objetos más simples. La agregación implica una relación "tiene un" donde un objeto puede existir independientemente de otro (por ejemplo, una clase "Coche" que tiene un objeto "Motor"). La composición, en cambio, implica una relación más fuerte donde el objeto compuesto no puede existir sin sus componentes (por ejemplo, una clase "Empresa" que está compuesta por empleados; si la empresa deja de existir, los empleados también dejan de tener sentido). Herencia Es un mecanismo que permite que una clase (subclase) derive de otra (superclase), heredando sus propiedades y métodos. Esto facilita la reutilización de código, ya que se pueden extender las funcionalidades de una clase existente sin necesidad de reescribir el código. Polimorfismo Se refiere a la capacidad de diferentes clases de ser tratadas como instancias de la misma clase a través de una interfaz común. Esto permite que un mismo método pueda actuar de diferentes maneras según el objeto que lo invoque, lo que aumenta la flexibilidad y la extensibilidad del código. Encapsulamiento Es el principio de ocultar los detalles internos de una clase y exponer solo lo necesario a través de una interfaz pública. Esto protege el estado interno del objeto y evita que se modifique de manera no controlada, promoviendo la integridad de los datos. Objetos Son instancias de clases que representan entidades del mundo real. Cada objeto tiene su propio estado (valores de sus atributos) y comportamiento (métodos que puede ejecutar). Clases Son plantillas que definen las propiedades (atributos) y comportamientos (métodos) de los objetos. Una clase actúa como un modelo a partir del cual se pueden crear múltiples objetos. Métodos Son funciones definidas dentro de una clase que describen los comportamientos de los objetos. Los métodos permiten que los objetos realicen acciones y manipulen su propio estado. Problema del Diamante Es un conflicto que puede surgir en la herencia múltiple, donde una clase hereda de dos clases que tienen un ancestro común. Esto puede causar ambigüedad en la resolución de métodos y propiedades, ya que el compilador no sabe cuál de las dos clases debe utilizar. Reusabilidad de Código Es una ventaja clave de la POO que permite construir sobre logros previos, evitando la duplicación de esfuerzos. Al reutilizar clases y métodos existentes, se ahorra tiempo y se reduce la posibilidad de errores. Desarrollo de Software Eficiente La POO promueve un desarrollo más eficiente al permitir la creación de software robusto y mantenible. Al utilizar componentes probados y bien definidos, se acortan los tiempos de desarrollo y se mejora la calidad del software. Ejemplos Mecanismos de Abstracción En un sistema de gestión de vehículos, se puede crear una clase abstracta `Vehículo` que contenga métodos como `mover()` y `detener()`. Las clases `Coche` y `Bicicleta` heredan de `Vehículo` y implementan estos métodos de manera específica. Clasificación y Reutilización Definir una clase `Animal` con atributos como `nombre` y `edad`, y métodos como `hacerSonido()`. Luego, se pueden crear instancias de `Perro` y `Gato` que reutilizan la definición de `Animal`: public class Animal { String nombre; int edad; void hacerSonido() {} } public class Perro extends Animal { void hacerSonido() { System.out.println("Guau"); } } Agregación y Composición Agregación En una clase `Universidad` que tiene una lista de `Estudiantes`. Los estudiantes pueden existir independientemente de la universidad. public class Estudiante { String nombre; } public class Universidad { List estudiantes; } Composición Una clase `Casa` que tiene objetos `Habitación`. Si la casa se destruye, las habitaciones también dejan de existir. public class Habitacion { String nombre; } public class Casa { List habitaciones; // Composición } Herencia Una clase `Vehículo` que tiene atributos como `marca` y `modelo`, y una subclase `Coche` que hereda de `Vehículo` y añade un atributo `numeroDePuertas`. public class Vehiculo { String marca; String modelo; } public class Coche extends Vehiculo { int numeroDePuertas; } Polimorfismo Una clase `Forma` con un método `dibujar()`. Las subclases `Circulo` y `Cuadrado` implementan `dibujar()` de manera diferente. Se puede tratar a ambas como `Forma`: public class Forma { void dibujar() {} } public class Circulo extends Forma { void dibujar() { System.out.println("Dibujando un círculo"); } } public class Cuadrado extends Forma { void dibujar() { System.out.println("Dibujando un cuadrado"); } } Encapsulamiento Una clase `CuentaBancaria` que tiene un atributo `saldo` privado y métodos públicos para depositar y retirar dinero, asegurando que el saldo no se modifique directamente. public class CuentaBancaria { private double saldo; public void depositar(double monto) { saldo += monto; } public void retirar(double monto) { saldo -= monto; } public double getSaldo() { return saldo; } } Objetos Crear un objeto `miCoche` de la clase `Coche`: Coche miCoche = new Coche(); miCoche.marca = "Toyota"; miCoche.modelo = "Corolla"; Clases Definir una clase `Libro` con atributos como `titulo` y `autor`, y un método `leer()`. public class Libro { String titulo; String autor; void leer() { System.out.println("Leyendo " + titulo); } } Métodos En la clase `Calculadora`, un método `sumar()` que toma dos números y devuelve su suma. public class Calculadora { int sumar(int a, int b) { return a + b; } } Problema del Diamante Si tenemos una clase `A` que tiene un método `metodo()`, y dos clases `B` y `C` que heredan de `A` y ambas implementan `metodo()`, y luego una clase `D` que hereda de `B` y `C`, puede haber confusión sobre cuál `metodo()` se debe usar. class A { void metodo() {} } class B extends A { void metodo() {} } class C extends A { void metodo() {} } class D extends B, C { } // Confusión sobre qué metodo() usar Reusabilidad de Código Usar una clase `Utilidades` que contiene métodos estáticos como `calcularPromedio()`, que se pueden llamar desde diferentes partes del programa sin necesidad de duplicar el código. public class Utilidades { public static double calcularPromedio(int[] numeros) { // lógica para calcular promedio } } Desarrollo de Software Eficiente Utilizar bibliotecas de código abierto como `Apache Commons` o `Guava` que proporcionan funcionalidades probadas y optimizadas, permitiendo a los desarrolladores centrarse en la lógica específica de su aplicación en lugar de reinventar la rueda. Preguntas tipo test 1. ¿Qué es la generalización en programación orientada a objetos? a. Definir una clase como un caso particular de otra. b. Definir una clase o tipo como un caso general de varias clases o tipos. c. Agrupar objetos sin relación entre sí. d. Crear instancias de una clase. e. Respuesta Correcta: B 2. ¿Cuál de las siguientes afirmaciones describe mejor la agregación? a. Un objeto que no puede existir sin otro. b. Un objeto que es una simple agrupación de otros objetos. c. Un objeto que hereda propiedades de otro. d. Un objeto que representa un concepto abstracto. e. Respuesta Correcta: B 3. ¿Qué mecanismo permite definir un objeto como perteneciente a un tipo o clase mediante instanciación? a. Generalización b. Clasificación c. Agregación d. Especialización e. Respuesta Correcta: B 4. En el contexto de la programación orientada a objetos, ¿qué significa la herencia? a. La capacidad de un objeto para crear otros objetos. b. La capacidad de una subclase para heredar características de una superclase. c. La creación de instancias de una clase. d. La eliminación de un objeto. e. Respuesta Correcta: B 5. ¿Cuál de las siguientes metodologías se utiliza para crear una jerarquía de clases comenzando desde el concepto más abstracto? a. Bottom-up b. Top-down c. Agregación d. Especialización e. Respuesta Correcta: B 6. ¿Cuáles de los siguientes son mecanismos de abstracción en programación orientada a objetos? (Selecciona todas las que apliquen) a. Generalización b. Clasificación c. Agregación d. Instanciación e. Respuestas Correctas: A, B, C 7. ¿Qué relación describe mejor la composición en programación orientada a objetos? a. Un objeto que es parte de otro objeto. b. Un objeto que no puede existir sin otro. c. Un objeto que tiene una relación de "tiene un". d. Un objeto que representa un concepto abstracto. e. Respuestas Correctas: A, C 8. La especialización es el proceso inverso a la generalización. a. Verdadero b. Falso c. Respuesta Correcta: A 9. La reutilización del código es una desventaja de los mecanismos de abstracción. a. Verdadero b. Falso c. Respuesta Correcta: B 10. Describa cómo la programación orientada a objetos utiliza los conceptos de generalización y especialización para facilitar la reutilización del código. Proporcione ejemplos para ilustrar su respuesta. a. La programación orientada a objetos (POO) se basa en la utilización de clases y objetos para modelar el mundo real, y los conceptos de generalización y especialización son fundamentales para estructurar y organizar el código de manera eficiente, facilitando así la reutilización. Generalización La generalización es el proceso de definir una clase base (o superclase) que encapsula las características comunes de varias clases derivadas (o subclases). Este enfoque permite crear una jerarquía de clases donde las subclases heredan atributos y métodos de la superclase, evitando la duplicación de código. Ejemplo de Generalización: Supongamos que tenemos una superclase llamada Vehículo, que tiene atributos como marca, modelo y año. A partir de esta superclase, podemos crear subclases como Coche, Motocicleta y Camión, que heredan las propiedades de Vehículo y pueden tener sus propios atributos específicos, como número de puertas para Coche o capacidad de carga para Camión. class Vehiculo { private String marca; private String modelo; private int año; public Vehiculo(String marca, String modelo, int año) { this.marca = marca; this.modelo = modelo; this.año = año; } // Getters y setters (si es necesario) public String getMarca() { return marca; } public String getModelo() { return modelo; } public int getAño() { return año; } } class Coche extends Vehiculo { private int numPuertas; public Coche(String marca, String modelo, int año, int numPuertas) { super(marca, modelo, año); this.numPuertas = numPuertas; } // Getter y setter para numPuertas (si es necesario) public int getNumPuertas() { return numPuertas; } } class Motocicleta extends Vehiculo { private String tipo; public Motocicleta(String marca, String modelo, int año, String tipo) { super(marca, modelo, año); this.tipo = tipo; } // Getter y setter para tipo (si es necesario) public String getTipo() { return tipo; } } Especialización La especialización es el proceso inverso a la generalización. Consiste en definir subclases que representan casos más específicos de una superclase. Esto permite que las subclases implementen o modifiquen el comportamiento heredado de la superclase, adaptándolo a sus necesidades particulares. Ejemplo de Especialización: Siguiendo el ejemplo anterior, podemos especializar la clase Coche para crear una subclase CocheElectrico, que podría tener un atributo adicional como autonomía y un método específico para calcular el consumo de energía. class CocheElectrico extends Coche { private double autonomia; public CocheElectrico(String marca, String modelo, int año, int numPuertas, double autonomia) { super(marca, modelo, año, numPuertas); this.autonomia = autonomia; } public double calcularConsumo(double distancia) { // Método específico para calcular el consumo de energía return distancia / autonomia; } // Getter y setter para autonomia (si es necesario) public double getAutonomia() { return autonomia; } } Reutilización del Código La combinación de generalización y especialización permite una alta reutilización del código. Al definir una superclase con comportamientos comunes, se puede reutilizar ese código en múltiples subclases sin necesidad de reescribirlo. Esto no solo ahorra tiempo y esfuerzo, sino que también reduce la posibilidad de errores, ya que cualquier cambio en la superclase se refleja automáticamente en todas las subclases. Además, al crear nuevas subclases, los desarrolladores pueden extender la funcionalidad existente sin modificar el código original, lo que promueve un diseño más limpio y mantenible. Conclusión En resumen, la programación orientada a objetos utiliza los conceptos de generalización y especialización para estructurar el código de manera que se maximice la reutilización. Al permitir que las subclases hereden y especialicen el comportamiento de las superclases, se facilita la creación de sistemas complejos de manera más eficiente y organizada. Esto es especialmente útil en proyectos grandes, donde la mantenibilidad y la escalabilidad son cruciales. Tema 7 1. Definición de Objetos: Comprender qué son los objetos y su papel en la POO. 2. Clases y Objetos: La relación entre clases (plantillas) y objetos (instancias). 3. Encapsulamiento: La práctica de ocultar el estado interno de un objeto y requerir toda interacción a través de métodos. 4. Herencia: Cómo las clases pueden heredar propiedades y métodos de otras clases. 5. Polimorfismo: La capacidad de diferentes clases de responder a la misma llamada de método de diferentes maneras. 6. Métodos Virtuales: La vinculación tardía de métodos que permite el polimorfismo. 7. Bajo Acoplamiento: La importancia de que los objetos sean independientes entre sí para mejorar la escalabilidad. 8. Sobrecarga de Métodos: La posibilidad de definir múltiples métodos con el mismo nombre pero diferentes parámetros. 9. Interfaces: Cómo las interfaces permiten definir un contrato que las clases pueden implementar. 10. Constructores y Destructores: La función de los constructores en la inicialización de objetos y los destructores en la limpieza de recursos. 11. Colecciones de Objetos: Uso de estructuras de datos como listas y arreglos para manejar múltiples objetos. 12. Ejemplo Práctico: Implementación de un sistema bancario que utiliza clases como `CuentaBancaria`, `CajaDeAhorro`, y `CuentaCorriente`. Definición de Objetos Los objetos son instancias de clases que encapsulan datos y comportamientos relacionados. En POO, un objeto representa una entidad del mundo real con atributos (propiedades) y métodos (funciones) que definen su comportamiento. Por ejemplo, un objeto `Coche` puede tener atributos como `color` y `modelo`, y métodos como `acelerar()` y `frenar()`. Clases y Objetos Una clase es una plantilla o modelo que define las propiedades y comportamientos comunes de un grupo de objetos. Los objetos son instancias concretas de estas clases. Por ejemplo, la clase `Animal` puede definir atributos como `nombre` y `edad`, mientras que un objeto `perro` es una instancia de la clase `Animal` con valores específicos para esos atributos. Encapsulamiento El encapsulamiento es una práctica que consiste en ocultar el estado interno de un objeto y exponer solo lo necesario a través de métodos públicos. Esto protege los datos de accesos no autorizados y permite que el objeto controle cómo se accede y modifica su estado. Por ejemplo, un objeto `CuentaBancaria` puede tener un saldo privado que solo puede ser modificado a través de métodos como `depositar()` y `retirar()`. Herencia La herencia permite que una clase (subclase) herede propiedades y métodos de otra clase (superclase). Esto promueve la reutilización del código y la creación de jerarquías de clases. Por ejemplo, una clase `Vehículo` puede ser la superclase de `Coche` y `Motocicleta`, que heredan atributos y métodos comunes, pero también pueden tener sus propias características específicas. Polimorfismo El polimorfismo es la capacidad de diferentes clases de responder a la misma llamada de método de diferentes maneras. Esto permite que un mismo método se comporte de manera diferente según el objeto que lo invoque. Por ejemplo, el método `hacerSonido()` puede ser implementado de manera diferente en las clases `Perro` y `Gato`, donde el perro ladra y el gato maulla. Métodos Virtuales Los métodos virtuales son aquellos que se vinculan tardíamente, es decir, la decisión sobre qué método invocar se toma en tiempo de ejecución, no en tiempo de compilación. Esto es fundamental para el polimorfismo, ya que permite que el método correcto se ejecute según el tipo real del objeto en tiempo de ejecución. Bajo Acoplamiento El bajo acoplamiento se refiere a la independencia entre objetos, lo que significa que un objeto no debe depender demasiado de otros. Esto mejora la escalabilidad y la mantenibilidad del sistema, ya que los cambios en un objeto tienen un impacto mínimo en otros. Por ejemplo, un objeto `CajeroAutomático` puede interactuar con diferentes tipos de cuentas sin necesidad de conocer su implementación interna. Sobrecarga de Métodos La sobrecarga de métodos permite definir múltiples métodos con el mismo nombre pero diferentes parámetros (tipo o número). Esto facilita la creación de métodos que realizan funciones similares pero con diferentes tipos de entrada. Por ejemplo, un método `sumar()` puede aceptar dos enteros o tres enteros, dependiendo de la sobrecarga. Interfaces Las interfaces son contratos que definen un conjunto de métodos que una clase debe implementar. No contienen implementación, solo la firma de los métodos. Esto permite que diferentes clases implementen la misma interfaz de maneras distintas, promoviendo la interoperabilidad. Por ejemplo, una interfaz `Imprimible` puede ser implementada por clases como `Documento` y `Imagen`, cada una con su propia lógica de impresión. Constructores y Destructores Los constructores son métodos especiales que se invocan al crear un objeto, y se utilizan para inicializar sus atributos. Los destructores, por otro lado, se invocan al destruir un objeto y se utilizan para liberar recursos. Por ejemplo, un constructor de `CuentaBancaria` puede inicializar el saldo y el propietario, mientras que un destructor puede cerrar conexiones a bases de datos. Colecciones de Objetos Las colecciones de objetos son estructuras de datos que permiten almacenar y gestionar múltiples objetos. Ejemplos comunes incluyen listas, arreglos y mapas. Estas colecciones facilitan la manipulación de grupos de objetos, como almacenar todas las cuentas bancarias en un `ArrayList` para realizar operaciones en conjunto. Ejemplo Práctico Un sistema bancario puede implementar clases como `CuentaBancaria`, `CajaDeAhorro`, y `CuentaCorriente`. Cada clase puede tener atributos y métodos específicos, y el sistema puede utilizar polimorfismo para permitir que diferentes tipos de cuentas respondan a operaciones como `extraer()` o `depositar()`, sin necesidad de conocer el tipo específico de cuenta en cada caso. Ejemplos Definición de Objetos class Coche { String color; String modelo; void acelerar() { System.out.println("El coche está acelerando."); } void frenar() { System.out.println("El coche está frenando."); } } // Uso Coche miCoche = new Coche(); miCoche.color = "Rojo"; miCoche.modelo = "Toyota"; miCoche.acelerar(); Clases y Objetos class Animal { String nombre; void hacerSonido() { System.out.println("El animal hace un sonido."); } } // Uso Animal perro = new Animal(); perro.nombre = "Rex"; perro.hacerSonido(); Encapsulamiento class CuentaBancaria { private double saldo; public void depositar(double monto) { saldo += monto; } public void retirar(double monto) { if (monto