El uso de Java APIs es algo de lo más común cuando trabajamos en el día a día , pero en muchos casos no nos damos cuenta del gran esfuerzo que se ha realizado en su diseño para mantener un API sencillo y homogeneidad es algo que muchas veces se hecha en falta. Vamos a ver un ejemplo sencillo utilizando la clase Nota y varios métodos para hacer calculo sobre ella:
Como podemos observar en el diagrama la clase dispone de la propiedad valor y los métodos esMayor , media y máxima . Hasta aquí todo parece muy razonable y podemos utilizarlo en un programa main para trabajar con ello.
package com.arquitecturajava.ejemplo1;
public class Principal {
public static void main(String[] args) {
Nota nota1= new Nota (7);
Nota nota2= new Nota (5);
System.out.println(nota1.esMayor(nota2));
Nota nota3= new Nota(4);
Nota nota4= new Nota(9);
System.out.println(Nota.maxima(nota1,nota2,nota3,nota4));
System.out.println(Nota.media(nota1,nota2,nota3,nota4));
}
} El resultado le podemos ver impreso en la consola y todo funciona perfectamente.
No hay mucho que objetar. ¿O tal vez sí?.
Java APIs y Homegeneidad
La realidad es que la clase no es muy homogénea a la hora de trabajar con el concepto de Nota ya que recibe en muchos casos la variable Nota y siempre devuelve un valor numérico a la hora de utilizarla.
Si trabajamos más el concepto de homegeneidad podremos conseguir una clase más sólida y con mejor reutilización. Para ello modificaremos los métodos media y máxima que serán los encargados de devolver una nueva nota con la media o una nota con el máximo valor mejorando la flexibilidad
El código quedaría:
package com.arquitecturajava.ejemplo2;
public class Nota {
private double valor;
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
public Nota(double valor) {
super();
this.valor = valor;
}
public boolean esMayor(Nota nota) {
if (this.getValor() > nota.getValor()) {
return true;
} else {
return false;
}
}
public static Nota media(Nota... notas) {
double total = 0;
for (Nota nota : notas) {
total += nota.getValor();
}
return new Nota(total / notas.length);
}
public static Nota maxima(Nota... notas) {
Nota maxima = notas[0];
for (Nota nota : notas) {
if (nota.getValor() > maxima.getValor()) {
maxima = nota;
}
}
return maxima;
}
}
Esto nos facilitaría por ejemplo el operar con Notas y calcular la Nota máxima de las medias:
package com.arquitecturajava.ejemplo2;
public class Principal {
public static void main(String[] args) {
Nota nota1= new Nota (7);
Nota nota2= new Nota (5);
System.out.println(nota1.esMayor(nota2));
Nota nota3= new Nota(4);
Nota nota4= new Nota(9);
Nota media1=Nota.media(nota1,nota2);
Nota media2= Nota.media(nota3,nota4);
System.out.println(Nota.maxima(media1,media2).getValor());
}
} El resultado es que la media más alta es es la media 2 con 6.5:
Conclusión
Apliquemos el concepto de homogeneidad al diseñar nuestras Java APIs y conseguiremos ganar en flexibilidad y reutilización: