Parte 2 -Tema 3 Flashcards
Programación orientada a objetos
¿Qué es la Programación Orientada a Objetos (POO)?
Es un paradigma de programación que organiza el software alrededor de datos, o “objetos”, que contienen tanto datos como el comportamiento que opera sobre esos datos.
¿Cuáles son los pilares fundamentales de la POO?
- Abstracción: Modelar el mundo real en términos de objetos.
- Encapsulación: Ocultar los detalles internos de un objeto y exponer solo lo necesario.
- Herencia: Crear nuevas clases a partir de clases existentes, heredando sus atributos y métodos.
- Polimorfismo: La capacidad de que objetos de diferentes clases respondan de manera diferente al mismo mensaje.
¿Qué es una clase?
Es un plano o plantilla que define las características (atributos) y comportamientos (métodos) de un objeto.
¿Qué es un objeto?
Es una instancia de una clase, una representación concreta de esa clase.
¿Cuál es la diferencia entre una clase y un objeto?
Una clase es abstracta, mientras que un objeto es concreto.
¿Qué es la encapsulación?
Es el mecanismo de ocultar los detalles internos de un objeto y exponer solo una interfaz para interactuar con él.
¿Por qué es importante la encapsulación?
Aumenta la seguridad del código, facilita el mantenimiento y reduce la dependencia entre las diferentes partes del programa.
¿Qué es la herencia?
Es un mecanismo que permite crear nuevas clases (subclases) a partir de clases existentes (superclases), heredando sus atributos y métodos
¿Cuáles son los tipos de herencia?
Simple, múltiple (no soportada en todos los lenguajes) y jerárquica.
¿Qué es el polimorfismo?
Es la capacidad de que objetos de diferentes clases respondan de manera diferente al mismo mensaje.
¿Cuáles son los tipos de polimorfismo?
- Polimorfismo de sustitución: Un objeto de una subclase puede ser utilizado donde se espera un objeto de la superclase.
- Sobrecarga: Múltiples métodos con el mismo nombre pero diferentes parámetros.
- Sobreescritura: Redefinición de un método en una subclase.
Abstracción
La capacidad de focalizarse en las características esenciales de un objeto, ignorando los detalles de implementación.
Interfaz
Define un contrato que una clase debe cumplir, especificando los métodos que debe implementar.
Asociación
Una relación entre dos clases.
Agregación
Una relación “tiene un” entre dos clases, donde un objeto es parte de otro.
Composición
Una relación “está compuesto por” más fuerte que la agregación, donde un objeto no puede existir sin otro.
¿Qué es una clase en POO?
- Es un plano o plantilla que define las características (atributos) y comportamientos (métodos) de un objeto.
- Ejemplo: La clase “Perro” podría tener atributos como “raza”, “nombre”, “edad” y métodos como “ladrar()”, “comer()”, “jugar()”.
¿Qué es un objeto en POO?
Es una instancia de una clase, una representación concreta de esa clase.
¿Qué es un atributo en POO?
Es una característica o propiedad de un objeto, que representa un dato asociado a ese objeto.
¿Qué es un método en POO?
Es una acción o comportamiento que un objeto puede realizar.
¿Qué es la encapsulación y cómo se relaciona con los atributos y métodos?
Es el mecanismo de ocultar los detalles internos de un objeto (atributos) y exponer solo una interfaz para interactuar con él (métodos).
¿Cuáles son los principales modificadores de acceso en POO?
- Público: Accesible desde cualquier parte del programa.
- Privado: Accesible solo desde dentro de la clase.
- Protegido: Accesible desde dentro de la clase y sus subclases.
- Paquete: Accesible desde cualquier clase dentro del mismo paquete.
¿Qué es un constructor?
Es un método especial que se utiliza para inicializar los objetos de una clase.
¿Qué es un destructor?
Es un método especial que se utiliza para liberar los recursos asociados a un objeto cuando este es destruido.
¿Qué es una clase abstracta?
Es una clase que no puede ser instanciada directamente. Sirve como plantilla para otras clases, definiendo un conjunto de atributos y métodos comunes.
¿Qué es una interfaz?
Es un contrato que define un conjunto de métodos que una clase debe implementar. No contiene implementación alguna.
¿Qué son los Patrones de Diseño?
Son soluciones típicas a problemas de diseño recurrentes en la programación orientada a objetos. Son como recetas que describen cómo resolver un problema específico de una manera flexible y reutilizable.
¿Cuál es el objetivo de los Patrones de Diseño?
Promover la reutilización de código, mejorar la legibilidad, facilitar el mantenimiento y fomentar mejores prácticas de diseño.
¿Cuáles son las principales categorías de patrones de diseño?
- Creacionales: Se ocupan de la creación de objetos.
- Estructurales: Se ocupan de la composición de clases o objetos.
- De comportamiento: Se ocupan de la asignación de responsabilidades entre objetos y la comunicación entre ellos.
¿Cuál es el objetivo de los patrones creacionales?
Abstraer el proceso de creación de objetos, permitiendo mayor flexibilidad y control sobre el proceso. Ejemplos: Factory Method, Abstract Factory, Builder, Singleton, Prototype.
¿Cuál es el objetivo de los patrones estructurales?
Simplificar la estructura de un diseño al identificar formas simples de relacionar objetos. Ejemplos: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.
¿Cuál es el objetivo de los patrones de comportamiento?
Identificar los patrones comunes de interacción entre objetos. Ejemplos: Observer, Strategy, Command, Template Method, Iterator, Mediator, State, Visitor.
¿Qué son los principios SOLID?
Son cinco principios básicos de la programación orientada a objetos que promueven un diseño de software más robusto y fácil de mantener.
El acrónimo SOLID representa
- S: Single Responsibility Principle (Principio de Responsabilidad Única)
- O: Open/Closed Principle (Principio de Abierto/Cerrado)
- L: Liskov Substitution Principle (Principio de Sustitución de Liskov)
- I: Interface Segregation Principle (Principio de Segregación de Interfaces)
- D: Dependency Inversion Principle (Principio de Inversión de Dependencias)
¿Qué dice el SRP?
Una clase debe tener una única razón para cambiar.
¿Cuál es el objetivo del SRP?
Aumentar la cohesión y disminuir el acoplamiento.
Ejemplo SRP
Una clase que gestiona la base de datos no debería encargarse también de la lógica de negocio.
¿Qué dice el OCP?
Las entidades de software (clases, módulos, funciones, etc.) deberían estar abiertas para extensión, pero cerradas para modificación.
¿Cuál es el objetivo del OCP?
Facilitar la evolución del software sin romper el código existente.
Ejemplo OCP
Utilizar herencia y polimorfismo para añadir nuevas funcionalidades sin modificar el código original.
¿Qué dice el LSP?
Los objetos de una subclase deben ser sustituibles por objetos de su superclase sin alterar la corrección de el programa.
¿Cuál es el objetivo del LSP?
Garantizar que las subclases respeten el contrato de la superclase.
Ejemplo LSP
Si una clase Cuadrado hereda de Rectángulo, debe ser posible usar un objeto Cuadrado donde se espera un Rectángulo
¿Qué dice el ISP?
Muchos clientes específicos son mejores que un cliente de propósito general.
¿Cuál es el objetivo del ISP?
Evitar que los clientes dependan de interfaces que no utilizan.
Ejemplo ISP
En lugar de una interfaz grande con muchos métodos, crear interfaces más pequeñas y específicas.
¿Qué dice el DIP?
Los módulos de alto nivel no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones.
¿Cuál es el objetivo del DIP?
Aumentar la flexibilidad y la testabilidad del código.
Ejemplo DIP
Utilizar interfaces para desacoplar módulos y permitir la inyección de dependencias.
¿Qué es la inyección de dependencias?
Es un patrón de diseño que permite proporcionar a una clase las dependencias que necesita en tiempo de ejecución, en lugar de que la clase misma las instancie.
¿Cuál es el objetivo principal de la inyección de dependencias?
Desacoplar las clases, aumentar la testabilidad, facilitar el mantenimiento y promover la reutilización del código.
¿Cuáles son las principales ventajas de utilizar la inyección de dependencias?
- Mayor testabilidad: Permite aislar las clases y facilitar la creación de pruebas unitarias.
- Menor acoplamiento: Reduce la dependencia entre clases, lo que hace que el código sea más flexible y fácil de modificar.
- Mayor reutilización: Facilita la reutilización de componentes al permitir cambiar las dependencias en tiempo de ejecución.
Facilita la inyección de mocks: Permite sustituir componentes reales por simulacros (mocks) durante las pruebas.
¿Cuáles son los principales tipos de inyección de dependencias?
- Constructor: Las dependencias se inyectan a través del constructor de la clase.
- Setter: Las dependencias se inyectan a través de métodos setter.
- Interfaz: Las dependencias se inyectan a través de una interfaz.
¿Qué es un contenedor de inyección de dependencias?
Es una herramienta que automatiza el proceso de creación y gestión de objetos, resolviendo las dependencias entre ellos.