Этот пост был опубликован на Hacker News с несколькими отзывами. Исходя из C ++, большинство этих примеров, кажется, идут вразрез с тем, чему меня учили.
Например, пример № 2:
Плохо:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
по сравнению с хорошим:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
Совет в C ++ заключается в том, что вы должны отдавать предпочтение свободным функциям, а не функциям-членам, поскольку они увеличивают инкапсуляцию Оба они семантически идентичны, так почему же предпочитаете выбор, который имеет доступ к большему количеству состояний?
Пример 4:
Плохо:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
по сравнению с хорошим:
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
Почему это является обязанностью User
форматировать несвязанную строку ошибки? Что если я захочу сделать что-то кроме печати, 'No street name on file'
если на ней нет улицы? Что если улица названа так же?
Может ли кто-нибудь рассказать мне о преимуществах и объяснениях «говори, не спрашивай»? Я не ищу что лучше, а пытаюсь понять точку зрения автора.