Este proyecto implementa una calculadora por consola que evalúa operaciones aritméticas binarias y unarias. Inicialmente concebida como un ejercicio de "una sola clase", ahora ha sido refactorizada para aplicar rigurosamente el Principio de Responsabilidad Única (SRP) mediante el aislamiento estricto de las clases a través de paquetes.
La aplicación está segmentada semánticamente en los siguientes paquetes bajo com.example.calculadora:
interfaces/: Contiene los contratos abstractos.OperacionBinaria: Contrato para operaciones de 2 parámetros.OperacionUnaria: Contrato para operaciones de 1 parámetro.
operaciones.binarias/: Implementaciones concretas de sumas, restas, multiplicaciones y divisiones. Cada clase es responsable de una única operación aritmética.operaciones.unarias/: Implementaciones concretas de la raíz cuadrada y el logaritmo natural.core/: Contiene la lógica central independiente del flujo de consola.MotorCalculadora: Responsable exclusivamente de registrar y evaluar las operaciones, delegando la ejecución a las interfaces sin acoplarse a clases concretas.
app/:Main: Es el punto de entrada. Se encarga únicamente de configurar/iniciar elMotorCalculadora, inyectar las dependencias (las operaciones concretas) y manejar el ciclo interactivo (I/O) de la consola.
- SRP (Responsabilidad Única): Ahora sí, cada clase hace exactamente una cosa. Por ejemplo, la clase
Divisionsólo se preocupa de dividir y validar sus propios errores (división por cero).Mainmaneja la interfaz de usuario, y elMotorCalculadoramaneja el registro y enrutamiento. - OCP (Abierto/Cerrado): Podemos añadir
Potencia.javaimplementandoOperacionBinariay registrarla en elMain, sin tocar ni recompilar elMotorCalculadora. - LSP (Sustitución de Liskov): Cualquier operación implementada es inyectada polimórficamente en el
MotorCalculadoracomportándose según el contrato. - ISP (Segregación de Interfaces): Evitamos una interfaz universal, forzando contratos específicos de uno (
OperacionUnaria) o dos (OperacionBinaria) parámetros. - DIP (Inversión de Dependencias): El motor (
MotorCalculadora) depende de interfaces (OperacionBinaria,OperacionUnaria), no de las clasesSumaoRaizCuadradacreadas en los subpaquetes.
Para correr esta aplicación refactorizada por consola, desde la raíz del proyecto ejecuta:
# Compilar todo el proyecto
javac -sourcepath src/main/java src/main/java/com/example/calculadora/app/Main.java
# Ejecutar el punto de entrada principal
java -cp src/main/java com.example.calculadora.app.Main