Ir al contenido principal

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

Comentarios

Publicar un comentario

Entradas populares de este blog

Leer un fichero properties con java.util.Properties

Los ficheros .properties son simples ficheros de texto que se suelen utilizar para guardar parámetros de configuración, en forma de pares clave-valor. Ejemplo de fichero: configuration.properties #User parameters user.name=Ana user.language=spanish Si estamos usando Java, podemos utilizar la clase java.util.Properties para leer los parámetros de este fichero: private static final String USER_NAME = "user.name"; private static final String USER_LANGUAGE = "user.language"; public void showProperties() throws Exception { Properties p = new Properties(); InputStream is = App.class.getResourceAsStream("/configuration.properties"); p.load(is); is.close(); String userName = p.getProperty(USER_NAME); String userCountry = p.getProperty(USER_LANGUAGE); System.out.println("userName: "+userName); System.out.println("userLanguage: "+userCountry); } Después de ejecutar este método, obtendríamos la siguiente salida: ...

JSF 2.0: Managed Beans (III)

Anteriormente ya hemos visto que cuando se declara un bean, tenemos que darle un scope: application, session, view, request, none. Un scope es un mapeo entre nombres y objetos que se almacena durante un determinado periodo de tiempo. En este post vamos a explicar cada uno de ellos. Si declaramos el bean desde el fichero faces-config.xml, indicamos el scope en <managed-bean-scope> y si queremos hacerlo con anotaciones, utilizaremos @{Application,Session,View,Request,None}Scoped Application Con este scope, se guarda la información durante toda la vida de la aplicación web, independientemente de todas las peticiones y sesiones que se realicen. Este bean se instancia con la primera petición a la aplicación y desaparece cuando la aplicación web se elimina del servidor. Si queremos que el bean se instancie antes de que se muestre la primera página de la aplicación, usamos la propiedad eager a true. @ManagedBean(eager=true) ó <managed-bean eager="true"> Session...

JSF 2.0: Message bundles

Los message bundles son ficheros .properties que guardan mensajes del tipo clave=valor. Si centralizamos todos los mensajes de nuestra aplicación en estos ficheros, es más fácil poder localizarlos si queremos realizar algún cambio y también nos ayuda para la internacionalización de la aplicación. Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes name=Tu nombre: age=Tu edad: ¿Cómo los declaramos? 1) En cada página JSF donde lo necesitemos <f:loadBundle basename="com.examples.messages" var="msgs"/> 2) De manera global en faces-config.xml <application>      <resource-bundle>           <base-name>com.examples.messages</base-name>           <var>msg</var>      </resource-bundle> </application> Esta opción es más eficiente ya que sólo crea el bundle una v...