Thursday, 9 April 2009

Fluent Interface

Actualmente estoy leyendo : Google Guice: Agile Lightweight Dependency Injection Framework, un libro muy interesante sobre la plataforma Goggle Guice "pronunciado Juice", y que se basa en un framework sobre Direct Injection. Dentro de este, se hace referencia al Embedded Domain Specific Language (EDSL) y a un concepto llamado Fluent Interface que es el que comentaré a continuación. Este concepto se basa en la premisa de hacer el código más legible, simple y mantenible. Utilizando el chaining method (método de encadenamiento), hacemos que nuestra clase pueda parametrizar sus propiedades encadenándolas una detrás de otra, sin tener que crear propiedades ni variables intermedias para nuestro uso. Aquí os pongo un ejemplo sencillo que seguro entenderéis.

Supongamos que tenemos una clase llamada "Car" y que tenemos que configurar que tiene 4 ruedas y que además queremos configurar la presión de las 4 ruedas, siguiendo la filosofía tradicional, haríamos:




Car car;

car = new Car();
car.addWheels(4);
int pressure1 = 5;
car.addWheelPressure(pressure1);
int pressure2 = 6;
car.addWheelPressure(pressure2);
int pressure3 = 5;
car.addWheelPressure(pressure3);
int pressure4 = 6;
car.addWheelPressure(pressure4);


La manera de hacerlo mediante Chaining Method, seria la siguiente:





public class Car {
private int wheels;
private ArrayList<Integer> pressure = new ArrayList<Integer>();

public Car addWheels(int wheels) {
this.wheels = wheels;
return this;
}

public Car addWheelPressure(int pressure) {
this.pressure.add(pressure);
return this;
}

public String getCode() {
return "Number of Wheels: " + this.wheels + " \n" +
"Wheel Pressure 1: " + this.pressure.get(0) + " Kg/cm2 \n" +
"Wheel Pressure 2: " + this.pressure.get(1) + " Kg/cm2 \n" +
"Wheel Pressure 3: " + this.pressure.get(2) + " Kg/cm2 \n" +
"Wheel Pressure 4: " + this.pressure.get(3) + " Kg/cm2 \n";
}

}


public class principal {
static Car car;

public static void main(String[] args) {
car = new Car().addWheels(4).
addWheelPressure(5).
addWheelPressure(6).
addWheelPressure(5).
addWheelPressure(6);
System.out.println(car.getCode());
}
}

//La salida del programa muestra:

Number of Wheels: 4
Wheel Pressure 1: 5 Kg/cm2
Wheel Pressure 2: 6 Kg/cm2
Wheel Pressure 3: 5 Kg/cm2
Wheel Pressure 4: 6 Kg/cm2






este método, permite crear clases más simples, más mantenibles y permite una mejor adaptación al lenguaje.

Podéis encontrar más información en los siguientes enlaces:

http://es.wikipedia.org/wiki/Interfaz_fluida
http://en.wikipedia.org/wiki/Method_chaining
http://www.insectnation.org/articles/2007/06/27/covariant-returns-and-method-chaining-in-java/

2 comments: