Metode Parameterless & Kosong-Paren di Scala

10

Saya sedang belajar Scala saat ini melalui Programming Scala Odersky (2nd). Saya akan membahas bab 10 di mana ia mulai memperkenalkan metode tanpa parameter dan paren kosong. Aku hanya tidak bisa melupakannya.

Sejauh ini, yang saya mengerti adalah bahwa saya harus menggunakan parens kosong jika metode memiliki efek samping dan metode tanpa parameter sebaliknya.

Saya tidak tahu apa manfaat dari konvensi ini. Saya membaca posting di Stack Exchange, tapi jujur ​​saja, ketika posting mulai membahas topik ini secara mendalam saya tersesat.

Saya mencari penjelasan sederhana tentang apa yang biasanya digunakan untuk fitur bahasa ini dan apa keuntungannya untuk membantu saya memahaminya dengan lebih baik.


sumber

Jawaban:

14

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.

Karl Bielefeldt
sumber
6

Itu adalah konvensi, bukan bagian dari desain bahasa. Ini digunakan sebagai rambu untuk membantu orang-orang yang harus membaca kode setelah Anda menulisnya untuk memahaminya dengan lebih baik.

Dari Panduan Gaya Scala tentang Doa Metode:

Scala memungkinkan penghilangan tanda kurung pada metode arity-0 (tanpa argumen):

reply() 

// is the same as 

reply

Namun, sintaks ini hanya boleh digunakan ketika metode yang dimaksud tidak memiliki efek samping (murni fungsional). Dengan kata lain, itu akan diterima untuk menghilangkan tanda kurung saat memanggil queue.size, tetapi tidak saat memanggil println().

Mengamati agama secara konvensi ini akan secara dramatis meningkatkan keterbacaan kode dan akan membuatnya lebih mudah untuk memahami sekilas operasi yang paling dasar dari setiap metode yang diberikan. Tahan keinginan untuk menghilangkan tanda kurung hanya untuk menyimpan dua karakter!

Di .NET, konvensi adalah untuk menggunakan metode ketika kode dapat mengambil beberapa saat untuk menjalankan (katakanlah, lebih dari 50ms), dan properti (pada dasarnya metode kosong-paren) ketika tidak akan (yaitu itu adalah pencarian sederhana).

Robert Harvey
sumber