Saya mengambil pertanyaan Anda mengapa tidak merancang bahasa untuk mencegah perlunya konvensi? Dengan kata lain, mengapa Scala tidak memaksakan penggunaan kurung sepanjang waktu, alih-alih membiarkan programmer terkadang menghilangkannya?
Jawabannya ditemukan dalam transparansi referensial . Pada dasarnya, jika suatu fungsi tidak memiliki efek samping, panggilan fungsi dapat diganti dengan hasilnya, tanpa mengubah perilaku program.
Itu berarti suatu fungsi tanpa parameter atau efek samping secara semantik setara dengan val
nilai pengembalian fungsi tersebut. Karena properti ini, ketika sebuah kelas berevolusi, pemrogram mungkin beralih bolak-balik antara menggunakan val
atau menggunakan fungsi, sebagaimana ditentukan oleh kenyamanan atau efisiensi.
Karena Anda dapat menghilangkan tanda kurung, itu berarti kode yang memanggil sesuatu seperti queue.size
tidak perlu tahu atau peduli apakah size
fungsi atau a val
. Oleh karena itu, pelaksana Queue
kelas bebas untuk mengubah di antara keduanya tanpa harus mengubah kode panggilan apa pun (meskipun saya percaya ini perlu dikompilasi ulang). Ini menstabilkan antarmuka publik kelas. Misalnya, Anda dapat memulai queue.size
dengan memanggil size
yang mendasarinya List
, yang berpotensi O(n)
, kemudian berubah size
menjadi val
karena alasan efisiensi.
Konvensi menyarankan tanda kurung ketika ada efek samping untuk memperjelas bahwa anggota kelas ini jelas merupakan panggilan fungsi, dan karenanya berpotensi tidak transparan secara referensial. Penting untuk memanggil kode untuk mengetahui apakah efek samping dihasilkan, sehingga mereka dapat menghindari menyebutnya berulang kali. Jika Anda tidak peduli apakah itu suatu fungsi atau tidak, Anda dapat memperlakukannya seolah-olah tidak.