Blogpost ini diposting di Hacker News dengan beberapa upvotes. Berasal dari C ++, sebagian besar contoh ini tampaknya bertentangan dengan apa yang telah saya ajarkan.
Seperti contoh # 2:
Buruk:
def check_for_overheating(system_monitor)
if system_monitor.temperature > 100
system_monitor.sound_alarms
end
end
versus bagus:
system_monitor.check_for_overheating
class SystemMonitor
def check_for_overheating
if temperature > 100
sound_alarms
end
end
end
Saran dalam C ++ adalah Anda harus lebih memilih fungsi bebas daripada fungsi anggota karena meningkatkan enkapsulasi. Keduanya identik secara semantik, jadi mengapa lebih suka pilihan yang memiliki akses ke lebih banyak negara?
Contoh 4:
Buruk:
def street_name(user)
if user.address
user.address.street_name
else
'No street name on file'
end
end
versus bagus:
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
Mengapa tanggung jawab User
untuk memformat string kesalahan yang tidak terkait? Bagaimana jika saya ingin melakukan sesuatu selain mencetak 'No street name on file'
jika tidak ada jalan? Bagaimana jika jalan itu dinamai hal yang sama?
Bisakah seseorang mencerahkan saya pada keuntungan dan alasan "Katakan, Jangan Tanyakan"? Saya tidak mencari yang lebih baik, tetapi mencoba memahami sudut pandang penulis.