Objetos 2 - Resumen
Objetos 2 - Resumen
Mensajes/Métodos
Los mensajes no son lo mismo que los metodos, el mensaje es la firma de como queremos
que se llame el objeto, que parametros recibe y que va a devolver. Mientras que el método
es la implementación del mentaje.
¿Diferencia entre identidad e igualdad?
Identidad: Si ocupan la misma instancia
Igualdad: Diferentes instancias, mismos atributos - equals()
Polimorfismo: Propiedad que tienen los objetos mediante la cual pueden mandar mensajes
iguales a otras clases.
Binding dinámico
El binding dinámico es un mecanismo por el cual se escoge, en tiempo de ejecución, el
método que responderá a un determinado mensaje. Es útil cuando este no puede ser
determinado de forma estática, es decir, en tiempo de compilación.
Esta característica de la programación orientada a objetos permite definir varias
implementaciones usando la misma interfaz, por tanto el binding dinámico constituye un tipo
de polimorfismo.
El binding dinámico se utiliza cuando múltiples clases, en una jerarquía de clases, contienen
diferentes implementaciones del mismo método.
UML
El Lenguaje Unificado de Modelado (UML) fue creado para forjar un lenguaje de modelado
visual común y semántica y sintácticamente rico para la arquitectura, el diseño y la
implementación de sistemas de software complejos, tanto en estructura como en
comportamiento.
SOLID: Acrónimo de los 5 principios del diseño orientado a objetos (OOD) de Robert Martin.
S: Single Responsability: Una clase tiene una única responsabilidad, una clase sola
debería tener un solo motivo para cambiar.
O: Open-Close Principle: Una clase está cerrada para su modificación, pero está abierta
para su extensión.
L: Substitution Liskov Principle. Una subclase debe ser sustituida por su superclase. De
no ser así, se viola este principio. Si la superclase (Coche) tiene un método que acepta un
parámetro del tipo de la superclase (Coche), entonces su subclase (Renault) debería
aceptar como argumento un tipo de la superclase (Coche) o un tipo de la subclase.
I: Interface Segregation. Este principio establece que los clientes no deberían verse
forzados a depender de interfaces que no usan. Dicho de otra manera, cuando un cliente
depende de una clase que implementa una interfaz cuya funcionalidad este cliente no usa,
pero que otros clientes sí usan, este cliente estará siendo afectado por los cambios que
fuercen otros clientes en dicha interfaz.
D: Dependency Inversion Principle: Establece que las dependencias deben estar en las
abstracciones, no en las concreciones. Los módulos de alto nivel no deberían depender de
módulos de bajo nivel. Ambos deberían depender de abstracciones. Las abstracciones no
deberían depender de detalles.
ENUMs
Variables categoricas
Colecciones
Otros:
- .noneMatch()
- .allMatch()
- .contains()
- .findFirst().orElse(null)
- .sorted()
- .stream().max(Comparator.comparing(Product::getUnitPrice));
- list.remove(objeto)
- .size()
- .isEmpty()
- lista.get(0)
Map:
Map<Integer, String> nombreMap = new HashMap<Integer, String>();
nombreMap.size(); // Devuelve el numero de elementos del Map
nombreMap.isEmpty();
nombreMap.put(K clave, V valor); // Añade un elemento al Map
nombreMap.get(K clave); // Devuelve el valor de la clave que se le
pasa como parámetro o 'null' si la clave no existe
nombreMap.clear(); // Borra todos los componentes del Map
nombreMap.remove(K clave); // Borra el par clave/valor de la clave
que se le pasa como parámetro
nombreMap.containsKey(K clave); // Devuelve true si en el map hay
una clave que coincide con K
nombreMap.containsValue(V valor); // Devuelve true si en el map
hay un Valor que coincide con V
nombreMap.values(); // Devuelve una "Collection" con los valores
del Map
Test Doubles
Patrones de diseño
Patrón Observer:
Permite definir una dependencia uno a uno entre dos o más objetos para transmitir todos los
cambios de un objeto concreto de la forma más sencilla y rápida posible. Para conseguirlo,
puede registrarse en un objeto (observado) cualquier otro objeto, que funcionará como
observador. El primer objeto, también llamado sujeto, informa a los observadores
registrados cada vez que es modificado.
Implementación:
Patron Composite:
Composite es un patrón de diseño estructural que te permite componer objetos en
estructuras de árbol y trabajar con esas estructuras como si fueran objetos individuales.
Implementación:
// En el componente a veces no hace falta tener el add, remove
Patron Templated Method
Es un patrón de diseño de comportamiento que define el esqueleto de un algoritmo
en la superclase pero permite que las subclases sobrescriban pasos del algoritmo
sin cambiar su estructura.
Propósito:
○ Define el esqueleto de un algoritmo de una operación
(método Cuenta>>extraer).
○ Delega en las sub-clases (CajaAhorro, CuentaCorriente,
CuentaEmpresarial) las pasos que varían, sin cambiar la
estructura del algoritmo.
○ El metodo que esta definido como principal es final para que no pueda ser modificado,
sino no es una plantilla
Implementación:
Patrón Adapter
Convierte la interfaz de una clase (Impresora2000) en otra interfaz que el cliente
(Imprimibles) espera. El adaptador permite a las clases trabajar juntas (polimorifsmo), lo que
de otra manera no podría hacerse debido a sus interfaces incompatibles.
Implementación:
Patrón State
Permite que un objeto modifique su comportamiento cada vez que cambie su estado
interno. Parecerá que cambia la clase del objeto.
Implementación:
Patron Strategy
Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables.
Permite que un algoritmo varíe independientemente de los clientes que lo usan
Implementación:
Refactoring:
La característica principal del refactoring es que no le agrega funcionalidad al usuario final.
Malos olores o bad smells: Indicios en el código de que algo mal escrito, desprolijo, poco
legible, poco flexible, etc existe.
Duplicate code: El mismo codigo o codigo muy similar aparece en varios lugares al mismo
tiempo
- Arreglo de bugs dificil de replicar
- El codigo es mas extenso de lo necesario
- Dificil de mantener
Large methods: El metodo es muy extenso. De que depende la longitud. Cuanto mas largo,
mas dificil de comprender es, por lo tanto mas dificil de mantener.
Clases grandes: Cuando una clase trata de hacer muchas cosas, tiene muchas variables de
instancia, cuando posee muchas variables de instancia es muy probable que haya codigo
duplicado.
Shotgun Surgery: Cuando nos damos cuenta que para realizar cualquier cambio debemos
modificar un gran numero de metodos y/o clases.
Esto hace que sea mas facil de perderse en ese seguimiento del impacto. Funcionalidades
que son de importancia pueden quedar fuera de control.
Feature envy: Un metodo en una clase usa muchas veces variables y getters de otra clase
para hacer su propio trabajo, esta “envidiosa”. Esto muestra que el metodo esta ubicado en
una clase que no deberia estar.
Switch Statements: Las ramas del condicional tienen logicas diferentes de acuerdo al tipo
de objetos. Si todos los objetos son instancias de la misma clase significa que hay que
hacer una jerarquia. La misma estructura condicional aparece en diferentes lugares.
Data class: Clases que solamente poseen datos, getters y setters y nada mas.
No comportamiento asociado. Puede ser la contrapartida de la envidiosa de atributos. Suele
dar una idea de que el diseño es procedural.
Extract Method: Se puede debe usar cuando - metodos muy largos, muy comentados,
incrementar reuso y la legibilidad
Move Method: Un método está usando muchas funcionalidades de otra clase (feature envy).
Mover el metodo a la clase que lo usa. Hacer una invocación enviando mensaje. Puede
primero incluir un extract method.