Цей допис для блогу був розміщений на Hacker News з кількома оновленнями. Походить із С ++, більшість із цих прикладів, здається, суперечать тому, чого я вчив.
Такі як приклад №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'
якщо на ньому немає вулиці? Що робити, якщо вулиця названа однаково?
Чи може хтось просвітити мене про переваги та обґрунтування "Скажи, не питай"? Я не шукаю кращого, а натомість намагаюся зрозуміти точку зору автора.