Java APIs Diseño y Homogeneidad

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:

Otros artículos relacionados