Ten blog został opublikowany w Hacker News z kilkoma pozytywnymi opiniami. Pochodząc z C ++, większość tych przykładów wydaje się sprzeczna z tym, czego mnie nauczono.
Tak jak w przykładzie 2:
Zły:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
kontra dobry:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
Rada w C ++ jest taka, że powinieneś preferować wolne funkcje zamiast funkcji składowych, ponieważ zwiększają one enkapsulację. Oba są identyczne semantycznie, więc dlaczego preferować wybór, który ma dostęp do większej liczby stanów?
Przykład 4:
Zły:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
kontra dobry:
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
Dlaczego User
formatowanie niepowiązanego ciągu błędów jest obowiązkiem ? Co jeśli chcę zrobić coś poza drukowaniem, 'No street name on file'
jeśli nie ma ulicy? Co jeśli ulica ma taką samą nazwę?
Czy ktoś mógłby mnie oświecić na temat zalet i uzasadnienia „Powiedz, nie pytaj”? Nie szukam tego, co jest lepsze, ale próbuję zrozumieć punkt widzenia autora.