Tell, don’t ask” nos recuerda que no debemos usar los objetos para pedirles cosas y tomar decisiones después, lo que debemos hacer es decirles a los objetos que hagan cosas para que éstos internamente tomen sus propias decisiones según su estado. Si lo hacemos bien, evitaremos un acoplamiento entre objetos, conseguiremos sistemas mas robustos y escalables. Y es que un objeto se define por su comportamiento.

Por lo tanto, cuando hablamos de “Tell, don’t ask” hablamos de cohesión, y se refiere principalmente al grado de cercanía entre los elementos de una clase (objeto).

Una cohesión alta se asocia con aspectos como la robustez, la fiabilidad, la reutilización y la comprensión. Por el contrario, una cohesión débil se asocia a aspectos menos deseables, como pueden ser la dificultad de mantenimiento, de testear, de reusar y por supuesto de entender.

Una de las principales características que debe cumplir la cohesión entre objetos es que éstos ocultan su funcionamiento interno, entre otras cosas esto ayuda a evitar el acoplamiento y a entender mucho mejor como trabajar con un objeto.

El código procedural recibe información y luego toma decisiones.
El código orientado a objetos le dice a los objetos que hagan cosas.

– Alec Sharp

¿Cómo ves tus objetos, como simples containers de datos o como emisores y receptores de mensajes para que hagan cosas?.

Captura de pantalla 2017-02-13 a las 14.12.05.png

Pregunta por el resultado, no por los datos.

En lugar de preguntar por los datos:

Age age = sebastian.getAge();
if (age >= 18) {
   letDoTheThingsThatAdultsDo(sebastian);
}

Pregunta por los resultados:

if (sebastian.isAdult()){
   letDoTheThingsThatAdultsDo(sebastian);
}

Lo que nos interesa saber en este ejemplo, es si Sebastian es mayor de edad, si la mayoría de edad es de 18 o 21 no importa. Además el código es mucho más limpio y claro si cumplimos el principio “Tell don’t ask”.

Beneficios de seguir los principios “Tell, don’t ask”.

  1. Mayor encapsulación.
  2. Más cohesión en los objetos.
  3. Bajo acoplamiento.
  4. Te ayuda a enfocarte en el comportamiento de sus clases y en las funcionalidades que deseas que se expongan.