This post is also available in english
Tell don’t ask es un principio de la programación orientada a objetos que nos ayuda a recordar que este paradigma se trata de crear objetos con lógica que operen con sus datos. Para clarificarlo, en vez de preguntarle datos a un objeto y actuar en consecuencia con esos datos, debemos decirle al objeto que hacer ya que él conoce sus datos.
Vamos a ver un ejemplo con código para entender mejor esta idea.
Imaginemos que estamos programando un sistema que permite gestionar tareas. Estas tareas se pueden finalizar cuando ya estén terminadas, pero no se puede finalizar una tarea que ya esta finalizada, esto provocaría un error. Si escribimos este código con el estilo “ask” se vería asi:
class Task {
private id: number;
private name: string;
status = "pending";
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
}
let task = Task(1, "my first task");
if (task.status == "finished") throw new Error('Task is already finished!!!');
task.status = "finished";
En el código anterior podemos ver como preguntamos datos a task y actuamos con la información que nos brinda. En cambio, orientado a “tell don’t ask” se vería asi:
class Task {
private id: number;
private name: string;
status = "pending";
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
finish() {
if (this.status == "finished") throw new Error('Task is already finished!!!');
this.status = "finished";
}
}
let task = Task(1, "my first task");
task.finish();
De esta forma estamos encapsulando los datos y la lógica a la clase que tiene el conocimiento para hacer esta operación. Esto es mas familiar al paradigma orientado objetos donde enviamos “mensajes” a los objetos para que realicen alguna operación con los datos que conocen en vez de estar preguntando por esos datos y realizar alguna lógica en base a eso, al estilo “ask” el código se ve mas procedural.