Questo post sul blog è stato pubblicato su Hacker News con diversi voti. Provenienti dal C ++, la maggior parte di questi esempi sembra andare contro ciò che mi è stato insegnato.
Come esempio n. 2:
Male:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
contro buono:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
Il consiglio in C ++ è che dovresti preferire le funzioni gratuite invece delle funzioni membro poiché aumentano l'incapsulamento. Entrambi sono identici semanticamente, quindi perché preferire la scelta che ha accesso a più stati?
Esempio 4:
Male:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
contro buono:
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
Perché è responsabilità User
formattare una stringa di errore non correlata? E se volessi fare qualcosa oltre a stampare 'No street name on file'
se non ha strada? E se la strada si chiamasse la stessa cosa?
Qualcuno potrebbe illuminarmi sui vantaggi e la logica di "Tell, Don't Ask"? Non sto cercando quale sia meglio, ma invece cerco di capire il punto di vista dell'autore.