Saya curiga saya tidak akan membahas pertanyaan ini, tetapi saya seorang programmer yang sangat berpengalaman, dan saya berharap beberapa pembaca yang lebih berpikiran terbuka akan memperhatikan.
Saya percaya bahwa itu sesuai dengan bahasa pemrograman berorientasi objek lebih baik untuk prosedur pengembalian nilai (VRPs) mereka menjadi deterministik dan murni.
'VRP' adalah nama akademis modern untuk fungsi yang disebut sebagai bagian dari ekspresi, dan memiliki nilai balik yang secara tidak sengaja menggantikan panggilan selama evaluasi ekspresi. Misalnya dalam pernyataan seperti x = 1 + f(y)
fungsi f
berfungsi sebagai VRP.
'Deterministik' berarti bahwa hasil fungsi hanya bergantung pada nilai-nilai parameternya. Jika Anda memanggilnya lagi dengan nilai parameter yang sama, Anda yakin untuk mendapatkan hasil yang sama.
'Murni' berarti tidak ada efek samping: memanggil fungsi tidak melakukan apa-apa selain menghitung hasilnya. Ini dapat diartikan sebagai tidak ada efek samping yang penting , dalam praktiknya, jadi jika VRP mengeluarkan pesan debugging setiap kali disebut, misalnya, yang mungkin dapat diabaikan.
Jadi, jika, dalam C #, fungsi Anda tidak deterministik dan murni, saya katakan Anda harus menjadikannya void
fungsi (dengan kata lain, bukan VRP), dan nilai apa pun yang perlu dikembalikan harus dikembalikan dalam parameter out
atau ref
parameter.
Misalnya, jika Anda memiliki fungsi untuk menghapus beberapa baris dari tabel database, dan Anda ingin mengembalikan jumlah baris yang dihapus, Anda harus mendeklarasikannya seperti ini:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Jika kadang-kadang Anda ingin memanggil fungsi ini tetapi tidak mendapatkan count
, Anda selalu dapat menyatakan kelebihan beban.
Anda mungkin ingin tahu mengapa gaya ini lebih cocok untuk pemrograman berorientasi objek. Secara umum, itu cocok dengan gaya pemrograman yang bisa (sedikit tidak tepat) disebut 'pemrograman prosedural', dan itu adalah gaya pemrograman prosedural yang lebih cocok pemrograman berorientasi objek.
Mengapa? Model klasik objek adalah bahwa mereka memiliki properti (alias atribut), dan Anda menginterogasi dan memanipulasi objek (terutama) melalui membaca dan memperbarui properti tersebut. Gaya pemrograman prosedural cenderung membuatnya lebih mudah untuk melakukan ini, karena Anda dapat mengeksekusi kode arbitrer di antara operasi yang mendapatkan dan mengatur properti.
Kelemahan dari pemrograman prosedural adalah bahwa, karena Anda dapat mengeksekusi kode arbitrer di semua tempat, Anda bisa mendapatkan beberapa interaksi yang sangat tumpul dan rentan bug melalui variabel global dan efek samping.
Jadi, cukup sederhana, itu adalah praktik yang baik untuk memberi sinyal kepada seseorang yang membaca kode Anda bahwa suatu fungsi dapat memiliki efek samping dengan membuatnya kembali tidak bernilai.