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 valnilai pengembalian fungsi tersebut. Karena properti ini, ketika sebuah kelas berevolusi, pemrogram mungkin beralih bolak-balik antara menggunakan valatau menggunakan fungsi, sebagaimana ditentukan oleh kenyamanan atau efisiensi.
Karena Anda dapat menghilangkan tanda kurung, itu berarti kode yang memanggil sesuatu seperti queue.sizetidak perlu tahu atau peduli apakah sizefungsi atau a val. Oleh karena itu, pelaksana Queuekelas 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.sizedengan memanggil sizeyang mendasarinya List, yang berpotensi O(n), kemudian berubah sizemenjadi valkarena 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.