Este post do blog foi publicado no Hacker News com vários upvotes. Vindo do C ++, a maioria desses exemplos parece ir contra o que aprendi.
Como no exemplo 2:
Ruim:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
versus bom:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
O conselho em C ++ é que você deve preferir funções livres em vez de funções membro, pois aumentam o encapsulamento. Ambos são idênticos semanticamente, então por que preferir a escolha que tem acesso a mais estados?
Exemplo 4:
Ruim:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
versus bom:
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 que é da responsabilidade de User
formatar uma sequência de erros não relacionada? E se eu quiser fazer algo além de imprimir, 'No street name on file'
se não tiver rua? E se a rua tiver o mesmo nome?
Alguém poderia me esclarecer sobre as vantagens e a lógica "Diga, não pergunte"? Não estou procurando o que é melhor, mas tentando entender o ponto de vista do autor.