Este blogpost se publicó en Hacker News con varios comentarios positivos. Viniendo de C ++, la mayoría de estos ejemplos parecen ir en contra de lo que me han enseñado.
Como el ejemplo # 2:
Malo:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
contra bien:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
El consejo en C ++ es que debería preferir las funciones libres en lugar de las funciones miembro, ya que aumentan la encapsulación. Ambos son idénticos semánticamente, así que ¿por qué preferir la opción que tiene acceso a más estados?
Ejemplo 4:
Malo:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
contra bien:
def street_name(user)
user.address.street_name
end
class User
def address
@address || NullAddress.new
end
end
class NullAddress
def street_name
'No street name on file'
end
end
¿Por qué es responsabilidad de User
formatear una cadena de error no relacionada? ¿Qué pasa si quiero hacer algo además de imprimir 'No street name on file'
si no tiene calle? ¿Qué pasa si la calle tiene el mismo nombre?
¿Podría alguien explicarme las ventajas y el razonamiento de "Decir, no preguntar"? No estoy buscando cuál es mejor, sino tratar de entender el punto de vista del autor.