Llevo unos días dando mantenimiento a un código que sigue creciendo en su proceso de desarrollo. Esto me da algunas perspectivas sobre las maneras de desarrollar que reduzcan el tamaño de los métodos y añadan semántica a las estructuras de datos así como algunas bases de diseño. Precisamente, estando en esas labores recordé un princpio que podría servir. Ahora veremos algunos aspectos de la Ley de Démeter aplicado a los métodos de una clase.

La Ley de Démeter es un principio que podemos aplicar durante el desarrollo de software. La idea central es la búsqueda de objetos pequeños que nos faciliten su manejo y su uso de recursos. También nos sirve para reducir la labor de darle semántica y aplicar principios como el de única responsabilidad, entre otros.

Podríamos resumir este principio de la siguiente manera:

class Class {                   // los métodos de un objeto
public:                         // sólo deberían llamar a
  ...                           // los métodos pertenecientes a:
  void doSomething(Argument &argument) {
    Direct direct;
    int value = method();       // sí mismo

    argument.do();              // cualquier argumento

    created = new Created();
    created.execute();          // cualquier objeto
                                // que él construya

    direct.show();              // cualquier objeto
                                // creado directamente
  }
private:
  Created *created;
  int method();
}

Básicamente estamos limitando el número de funciones invocadas dentro de cada método así como sus responsables. Lo que directamene ayuda mantener clases menos infladas y reducir su número de colaboradores los necesarios para ejecutar determinada tarea.

En las siguientes líneas dejo unos ejemplos en los que podríamos cuestionarnos cuáles están menos acopladas o siguen el principio y cuáles no:

  1. Veamos cuál mantiene el principio
#include <date>              class Date;
class Race1 {                class Race2 {
  Date start;                  Date start;
public:                      public:
  Race1(Date &start);          Race2(Date &start);
}                            }
  1. Un ejemplo en Java
public void showAddress(Person person) {
  Address address = person.getAddress();
  sendToScreen(address.screenFormat());
}
  1. Otro de Java
public class Recipe {
  private Casserole casserole;
  private Vector ingredients;

  public Recipe() {
    casserole = new Casserole();
    ingredients = new Vector();
  }

  private void make() {
    casserole.add(ingredients.elements());
  }
}
  1. Este se parece al ejemplo
void makeTransaction(Account account, int) {
  Customer *customer;
  Money amount;

  amount.setValue(123.456789);
  account.setBalance(amount);
  customer = account.getOwner();
  logWorkflow(customer->name(), MAKE_TRASACTION);
}
Anuncios