0% encontró este documento útil (0 votos)
6 vistas30 páginas

Objetos 2 - Resumen

El documento proporciona una visión general de la programación orientada a objetos (POO) en Java, incluyendo conceptos clave como clases, encapsulamiento, herencia, polimorfismo y principios de diseño como SOLID. También se discuten componentes del entorno de desarrollo Java, como JRE, JDK y JVM, así como patrones de diseño y técnicas de refactorización. Se abordan temas adicionales como colecciones, enums y el uso de UML para modelar sistemas de software.

Cargado por

Systemdigital
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
6 vistas30 páginas

Objetos 2 - Resumen

El documento proporciona una visión general de la programación orientada a objetos (POO) en Java, incluyendo conceptos clave como clases, encapsulamiento, herencia, polimorfismo y principios de diseño como SOLID. También se discuten componentes del entorno de desarrollo Java, como JRE, JDK y JVM, así como patrones de diseño y técnicas de refactorización. Se abordan temas adicionales como colecciones, enums y el uso de UML para modelar sistemas de software.

Cargado por

Systemdigital
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 30

POO EN JAVA

OBJETIVOS ORIGINALES DE JAVA


- Orientado a objetos
- Simple
- Soporte para concurrencia y distribución
- Garbage collection
- Portabilidad
- Estaticamente tipadas

¿Qué es JRE, JDK y JVM?


Java Runtime Environment o JRE es un conjunto de utilidades que permite la ejecución de
programas Java. Java Runtime Environment.
Una máquina virtual Java, una implementación de la Especificación de máquina virtual Java,
interpreta el código binario Java compilado (bytecode) para el procesador de una
computadora para poder ejecutar las instrucciones de un programa Java.
Java™ Development Kit (JDK) es un software para desarrolladores de Java. Incluye el
intérprete Java, clases Java y herramientas de desarrollo Java (JDT): compilador,
depurador, desensamblador, visor de applets, generador de archivos de apéndice y
generador de documentación.

¿Qué es una clase?


Una clase es la descripción de un conjunto de objetos similares; consta de métodos y de
datos que resumen las características comunes de dicho conjunto.
Estáticamente tipado: Se dice de un lenguaje de programación que usa un tipado estático
cuando la comprobación de tipificación se realiza durante la compilación, y no durante la
ejecución.
Dinámicamente tipado: Un lenguaje de programación es dinámicamente tipado si una
variable puede tomar valores de distintos tipos
¿Qué es Byte Code?
Bytecode ofrece la posibilidad de garantizar el rendimiento de un programa en todas las
plataformas. Esto sirve como «código intermedio» que interpreta los comandos del código
fuente y los traduce al lenguaje de destino requerido para el hardware respectivo.
En las clases los constructores ya vienen definidos pero sin parámetros.
Se puede tener más de un constructor pero con diferente tipo de parámetros y números de
parámetros. A eso se le llama sobrecarga de constructores, y pasa lo mismo con los
métodos.
El constructor por defecto ya no se podría usar, tendrías que definirlo si ya habías definido
uno con parámetro.
Si no se le pone modificador público al constructor queda tipo paquete o default. ???
Para instanciar una clase basta con poner new el nombre de la clase y los parámetros si
son requeridos.
Encapsulamiento
Usan modificadores private, protected, public y default (no hace falta escribirlo).
Para encapsular habría que ponerlo privado y utilizar un setter del atributo. Porque sino
cualquiera podría acceder a la modificación de nuestros atributos solo poniendo
directamente el nombre. Ej: auto.atributo = “Romper encapsulamiento”.
Otras formas de encapsular son con el modificador final
Tiene sentido que una clase sea abstracta y final? No, porque al ser abstracta no podría
instanciarse y al ser final no permite que ésta pueda extenderse por lo tanto es una clase
que no se va a usar nunca en nuestro dominio.

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()

Protocolo: Es un conjunto de mensajes que implementan un método.

Interfaz: Conjunto de contratos dentro de una clase. Define protocolo.


Herencia: Es la transmisión del código entre una clase y otras. Para esto se declara la
palabra extends: << class Hija extends Padre >>.

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.

Clase anémica: Clase que tiene atributos, pero nada de lógica/métodos.

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

Clase Abstracta (Cuenta): define de forma abstracta las


operaciones primitivas e implementa un template method con el
esqueleto de la operación.
● Clase Concreta: implementa las operaciones primitivas.

Técnica fundamental de reuso.


● Principio de Hollywood: “no nos llames, nosotros te llamamos”.
● El template method invoca a este tipo de operaciones:
○ Operaciones concretas definida en la clase abstracta
○ Operaciones en colaboradores
○ Operaciones primitivas (abstractas)
○ Operaciones gancho (hook operaciones, hook methods, por default no hacen nada)

Métodos hook: proporcionan un comportamiento predeterminado que las subclases


pueden extender si es necesario.
Una operación de enganche a menudo no hace nada por defecto.
Es importante que los “métodos de plantilla” especifiquen qué operaciones son ganchos
(may be overridden) y cuáles son operaciones abstractas (must be overridden).
Para reutilizar una clase abstracta de manera efectiva, los escritores de subclases deben
comprender qué operaciones están diseñadas para ser sobreescritas.

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.

Replace Condicional With Polymorphism:


- Crear la jerarquia
- Por cada rama crear un metodo en cada subclase que redefine el de la superclase
- Copiar la parte del condicional
- Compilar y testear
- Borrar de la superclase la parte del condicional
- Compilar y testear
- Repetir para cada rama
- Convertir el método de lo super clase en abstracto

También podría gustarte