En esta parte vamos a eliminar estos patrones repetitivos en el código.
Vamos a quitar estos loops while repetidos, moverlos a un método diferente llamado:
✅ leerNumeros(...)
y luego reutilizar ese método 3 veces, cada vez que leemos un valor diferente.
PRIMERO: copiamos TODO el bloque del while (desde la calculadora original).
📌 Este patrón aparece una y otra vez: preguntar → leer → validar → error → repetir.
Ahora creamos este método:
Todavía no te preocupes por el contenido, ya lo llenamos con el while.
Ahora aquí viene la parte difícil:
¿Qué hacemos?
❌ Opción mala: hacer 3 métodos:
leerByteleerFloatleerIntEso termina en 3 métodos casi idénticos… solo cambia una línea, y no es buena refactorización.
✅ Mejor opción: un solo método que devuelva double.
Luego en main hacemos casting al tipo que necesitemos.
Copiamos el código dentro del método y empezamos a parametrizarlo.
public static double leerNumeros(String prompt, double min, double max) {
Scanner scanner = new Scanner(System.in);
double value;
while (true){
System.out.println(prompt);
value = scanner.nextFloat();
if (value >= min && value <= max)
break;
System.out.println("Ingrese un valor entre " + min + "y" + max);
}
return value;
}El primer parámetro que necesitamos es la pregunta, el prompt.
📌 Texto de entrada que el usuario da al sistema: prompt
Entonces en vez de hardcodearlo, lo pasamos como parámetro:
También quitamos números “quemados” como 1, 30, etc.
Los pasamos como parámetros:
double mindouble maxy reemplazamos todo:
Ahora el mensaje de error también es genérico.
Finalmente devolvemos value:
Ahora toda la lógica de: leer + validar está en un solo lugar.
mainAhora podemos borrar los while repetidos y hacer esto:
📌 leerNumeros(...) devuelve double, y nosotros hacemos casting al tipo que necesitamos.
import java.text.NumberFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int principal = (int) leerNumeros("Principal", 1000, 1_000_000);
float InteresAnual = (float) leerNumeros("Tasa interés", 1, 30);
byte anos = (byte) leerNumeros("Años: ", 1, 30); // casting
double hipo = calcularHipo(principal, InteresAnual, anos);
String hipotecaFormat = NumberFormat.getCurrencyInstance().format(hipo);
System.out.println("Hipoteca: " + hipotecaFormat);
}
public static double leerNumeros(String prompt, double min, double max) {
Scanner scanner = new Scanner(System.in);
double value;
while (true){
System.out.println(prompt);
value = scanner.nextFloat();
if (value >= min && value <= max)
break;
System.out.println("Ingrese un valor entre " + min + "y" + max);
}
return value;
}
public static double calcularHipo(int principal,
float InteresAnual,
byte anos) {
final byte meses = 12;
final byte porcentaje = 100;
float numeroPagos = anos * meses;
float mesInteres = InteresAnual / porcentaje / meses;
double hipo = principal
*(mesInteres * Math.pow(1 + mesInteres, numeroPagos))
/(Math.pow(1 + mesInteres, numeroPagos) - 1);
return hipo;
}
}PEQUEÑO AJUSTE:
En el método calcularHipo, cambiamos el tipo de numeroPagos a short:
📌 Ya veremos por qué…
import java.text.NumberFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int principal = (int) leerNumeros("Principal", 1000, 1_000_000);
float InteresAnual = (float) leerNumeros("Tasa interés", 1, 30);
byte anos = (byte) leerNumeros("Años: ", 1, 30); // casting
double hipo = calcularHipo(principal, InteresAnual, anos);
String hipotecaFormat = NumberFormat.getCurrencyInstance().format(hipo);
System.out.println("Hipoteca: " + hipotecaFormat);
}
public static double leerNumeros(String prompt, double min, double max) {
Scanner scanner = new Scanner(System.in);
double value;
while (true){
System.out.println(prompt);
value = scanner.nextFloat();
if (value >= min && value <= max)
break;
System.out.println("Ingrese un valor entre " + min + "y" + max);
}
return value;
}
public static double calcularHipo(int principal,
float InteresAnual,
byte anos) {
final byte meses = 12;
final byte porcentaje = 100;
short numeroPagos = (short) (anos * meses);
float mesInteres = InteresAnual / porcentaje / meses;
double hipo = principal
*(mesInteres * Math.pow(1 + mesInteres, numeroPagos))
/(Math.pow(1 + mesInteres, numeroPagos) - 1);
return hipo;
}
}