Cómo mejorar la cohesión de nuestras clases

La cohesión indica si una clase tiene un único propósito, lo que significa que está bien diseñada. Por tanto, nuestro objetivo es crear clases con una cohesión alta.

Una clase debería tener un número pequeño de variables de instancia y cada uno de sus métodos deberían utilizar una o más de estas variables. En general, cuantas más variables utiliza un método, más cohesivo es éste a la clase.

Veamos el ejemplo de una clase altamente cohesiva:

public class Stack {
   private int topOfStack = 0;
   List elements = new LinkedList();

   public int size() {
      return topOfStack;
   }

   public void push(int element) {
      topOfStack++;
      elements.add(element);
   }

   public int pop() throws PoppedWhenEmpty {
      if (topOfStack == 0) throw new PoppedWhenEmpty();
      int element = elements.get(--topOfStack);
      elements.remove(topOfStack);
      return element;
   }
}

En esta clase todos sus métodos utilizan las variables de instancia de la clase: topOfStack y elements, excepto size() que sólo utiliza una, con lo que vemos que la cohesión es alta.

Consideremos ahora que tenemos una función enorme que declara un montón de variables y queremos extraer parte de su código en otra función, para mejorar así nuestro código. Sin embargo, el código que queremos extraer usa cuatro de las variables declaradas en la función. ¿Deberíamos entonces pasar estas cuatro variables como argumentos de nuestra nueva función?

No es necesario. Si las pasamos a variables de instancia de la clase, entonces podríamos llamar a nuestra nueva función sin pasarle ninguna de estas variables. Así podríamos dividir fácilmente esta función en otras más pequeñas.

Sin embargo, ¡¡esto hace que nuestra clase pierda cohesión!! porque ahora tiene variables de instancia que sólo las utilizan unos pocos métodos… ¡Un momento! Si sólo unos pocos métodos utilizan unas pocas variables de instancia, ¿Por qué no creamos una nueva clase con ellos? Así, nuestra clase no perderá cohesión y la nueva clase creada será altamente cohesiva.

Acabamos de ver cómo una buena manera de hacer que nuestras clases no pierdan cohesión es dividirlas en otras más pequeñas 🙂

Referencia: Clean Code. A Handbook of Agile Software Craftsmanship – Robert C. Martin

Un comentario en “Cómo mejorar la cohesión de nuestras clases

Deja un comentario