- Descripción general
- Diagrama de clases UML
- Caracterízación
- Tecnologías empleadas
- Instalación y ejecución
- Funcionamiento
- Mejoras futuras
Esta aplicación demuestra la comprensión de los principios de la Programación Orientada a Objetos (POO) y las buenas prácticas de desarrollo en Java. La clara separación de responsabilidades, el manejo robusto de errores y el uso de características modernas del lenguaje, contribuyen a una aplicación bien estructurada, mantenible y extensible.
La organización del programa en el sistema de archivos es la siguiente:
- conversor-moneda
- src
- Main.java
- com
- aluracursos
- conversormoneda
- models
- Currencies.java
- CurriencesPair.java
- MenuOptions.java
- RatesInformation.java
- services
- BaseRateService.java
- Calculator.java
- Rates.java
- utils
- ApiClient.java
- ApiClientException.java
- InputHandler.java
- MenuBuilder.java
- UserInterface.java
- models
- conversormoneda
- aluracursos
- src
A su vez, en el proyecto se ponen en práctica los siguientes fundamentos:
- Claros principios de diseño orientado a objetos
-
Encapsulamiento: Cada clase mantiene su propio estado y comportamiento, exponiendo solo lo necesario a través de métodos públicos. Por ejemplo,
Rates
yCalculator
gestionan la lógica de obtención y cálculo de tasas, respectivamente, sin exponer directamente los detalles de la API o el manejo de datos. -
Abstracción: La clase abstracta
BaseRateService
define el comportamiento común para los servicios relacionados con tasas (obtención de datos de la API, manejo de errores), permitiendo que las clases concretas (Rates
yCalculator
) se enfoquen en su lógica específica. -
Herencia: Aunque no se ve una herencia directa entre clases concretas,
Calculator
yRates
heredan el comportamiento común deBaseRateService
, promoviendo la reutilización de código y la consistencia. -
Polimorfismo: Se observa a través del uso de la interfaz
Runnable
enMenuBuilder
. Diferentes acciones (mostrar tasas, calculadora, salir) pueden ser asociadas a las opciones del menú y ejecutadas de manera uniforme a través del métodorun()
.
- Separación de responsabilidades (Single Responsibility Principle)
-
Main
: Su única responsabilidad es la de inicializar la aplicación, configurar el menú principal y controlar el flujo de la interacción del usuario. No se encarga de la lógica de negocio de las tasas o los cálculos. -
Rates
: Se encarga específicamente de obtener y mostrar las tasas de cambio. -
Calculator
: Su responsabilidad es tomar la entrada del usuario y realizar los cálculos de conversión de moneda. -
ApiClient
: Su única tarea es comunicarse con la API externa para obtener la información necesaria. -
InputHandler
: Maneja la entrada del usuario de forma segura y con validación. -
MenuBuilder
: Se dedica a la creación y visualización del menú interactivo. -
UserInterface
: Proporciona métodos para mostrar mensajes formateados al usuario, manteniendo la presentación separada de la lógica. -
Clases en el paquete
models
: Representan las estructuras de datos de la aplicación, como las monedas (Currencies
), el par de monedas (CurrenciesPair
), las opciones del menú (MenuOptions
) y la información de las tasas (RatesInformation
).
- Uso de patrones de diseño implícitos
-
Factory (Simple Factory): Aunque no es un patrón formalmente implementado con una clase factory explícita, la clase
MenuBuilder
actúa como una especie de fábrica para crear y gestionar las opciones del menú y sus acciones asociadas. -
Strategy: El uso de
Runnable
para las acciones del menú permite definir diferentes estrategias (las implementaciones derun()
en los métodos referenciados) que se ejecutan según la selección del usuario.
- Robustez y manejo de errores
-
Validación de la clave de API: El programa verifica al inicio que la variable de entorno
MI_API_KEY
esté configurada, evitando fallos posteriores por falta de autenticación. -
Manejo de excepciones de la API: La clase
ApiClient
implementa un manejo detallado de los posibles errores de la API, proporcionando mensajes informativos basados en el tipo de error recibido (clave inválida, cuota alcanzada, etc.). -
Manejo de excepciones de entrada:
InputHandler
utiliza bloquestry-catch
para asegurar que la entrada del usuario sea válida (números decimales positivos y códigos de moneda existentes). -
Propagación y manejo de
InterruptedException
: Se maneja la excepciónInterruptedException
al interactuar con la API, asegurando una respuesta adecuada en caso de interrupción del hilo.
- Organización y modularidad
-
Uso de paquetes: La aplicación está claramente organizada en paquetes (
models
,services
,utils
), lo que facilita la comprensión, el mantenimiento y la escalabilidad del código. Cada paquete agrupa clases con responsabilidades relacionadas. -
Clases pequeñas y enfocadas: Cada clase tiende a tener una responsabilidad bien definida, lo que hace que el código sea más legible y fácil de probar.
- Uso de características avanzadas de Java:
-
Enums (
Currencies
): Se utiliza unenum
para representar los códigos de moneda, lo que garantiza la seguridad de tipos y facilita la gestión de las monedas soportadas. -
Records (
CurrenciesPair
): Se utiliza unrecord
para representar un par de monedas de forma concisa e inmutable. -
Lambdas y Referencias a Métodos: El
MenuBuilder
utiliza referencias a métodos (rates::showExchangeRates
,calculator::showExchangeCalculator
) y una lambda (() -> System.out.println("Saliendo ...")
) para asociar acciones a las opciones del menú, lo que hace que el código sea más conciso y expresivo. -
StringBuilder: Se utiliza
StringBuilder
enMenuBuilder
para construir eficientemente las cadenas del menú. -
HttpClient
: Se utiliza la API deHttpClient
introducida en Java 11 para realizar las llamadas HTTP a la API externa.
- Fedora Linux 42 (Workstation Edition)
- OpenJDK 21.0.7
- IntelliJ IDEA 2025.1.1.1 (Community Edition)
- ExchangeRate-API
- Postman
- MvnRepository
- Google Gson
-
Obtener API Key de ExchangeRate-API
-
Configurar la API Key como variable de entorno de sistema para que el programa pueda ejecutarse correctamente.
-
Clonar en el directorio de descarga este repositorio:
git clone https://github.com/marcanojuan/conversor-moneda.git
- Descargar desde MvnRepository la libreria
Gson Ver. 2.13.1
y mover al directorio raiz del proyecto:
mv gson-2.13.1.jar conversor-moneda
- Acceder al directorio raiz del proyecto:
cd conversor-moneda
- Compilar el proyecto:
javac -cp ".:gson-2.13.1.jar" src/Main.java src/com/aluracursos/conversormoneda/**/*.java -d out
- Ejecutar el proyecto compilado:
java -cp "out:gson-2.13.1.jar" com.aluracursos/conversormoneda.Main
Nota: Todos los comandos son ejecutados bajo GNU/Linux.
El programa es interactivo y basado en un menú. El usuario elige la funcionalidad deseada (ver tasas o calcular conversión) ingresando un número, y luego proporciona la información requerida (monedas base/destino, monto) a través de la consola. La aplicación se encarga de comunicarse con una API externa para obtener los datos necesarios y muestra los resultados al usuario.
-
Historial de conversiones: Incorporar la función de registrar y visualizar el historial de las conversiones más recientes, ofreciendo a los usuarios una perspectiva detallada de sus actividades.
-
Soporte para más monedas: Extender la selección de divisas disponibles para la conversión, posibilitando a los usuarios operar entre un espectro más amplio de opciones monetarias.
-
Registros con marca de tiempo: Emplear las funcionalidades de la biblioteca
java.time
para generar registros de las conversiones efectuadas, detallando las monedas involucradas y la hora exacta de cada operación.