Esta publicación de blog se publicó en Hacker News con varios votos a favor. Viniendo de C ++, la mayoría de estos ejemplos parecen ir en contra de lo que me han enseñado.
Tal como el ejemplo # 2:
Malo:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
versus bueno:
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 debe preferir las funciones gratuitas en lugar de las funciones miembro, ya que aumentan la encapsulación. Ambos son idénticos semánticamente, entonces, ¿por qué preferir la opción que tiene acceso a más estado?
Ejemplo 4
Malo:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
versus bueno:
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 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 se llama igual?
¿Podría alguien aclararme sobre las ventajas y la lógica de "Tell, Don't Ask"? No busco cuál es mejor, sino que trato de entender el punto de vista del autor.