El principio tell don't ask consiste en que cuando se realiza la instanciación de un objeto no se debería preguntar sobre las propiedades internas del mismo para llevar a cabo una acción fuera del objeto, sino que se debería dejar la responsabilidad de realizar la acción al objeto en sí y que el mismo objeto compruebe el estado de la propiedad.
Imaginemos que tenemos una tienda y tenemos el la clase producto y queremos controlar el stock de un producto en concreto:
class Producto{
public $stock;
public function addToCart(){}
}
En el código que no sigue los principios de Tell don't ask toda la acción se realiza fuera del objeto, de este modo:
$producto = new Producto();
if ($producto->stock > 0){
$producto->addToCart();
}
Para hacerlo bien usando el principio tell don't ask habría que hacerlo así:
class Producto{
public $stock;
public function addToCart()
{
if ($producto->stock > 0){
$producto->addToCart();
}
}
}
$producto = new Producto();
$producto->addToCart();
Gracias a esta buena práctica se ha conseguido encapsular todas las propiedades y acciones del objeto dentro del mismo.