Saya sesekali mengalami metode di mana pengembang memilih untuk mengembalikan sesuatu yang tidak penting untuk fungsi tersebut. Maksud saya, ketika melihat kode itu, ternyata berfungsi sama baiknya dengan void
dan setelah beberapa saat berpikir, saya bertanya, "Kenapa?" Apakah ini terdengar familier?
Kadang-kadang saya setuju bahwa paling sering lebih baik mengembalikan sesuatu seperti bool
atau int
, daripada hanya melakukan a void
. Tapi saya tidak yakin, dalam gambaran besar, tentang pro dan kontra.
Bergantung pada situasi, mengembalikan suatu int
dapat membuat penelepon mengetahui jumlah baris atau objek yang dipengaruhi oleh metode (misalnya, 5 catatan disimpan ke MSSQL). Jika metode seperti "InsertSomething" mengembalikan boolean, saya dapat meminta metode yang dirancang untuk kembali true
jika berhasil, jika tidak false
. Penelepon dapat memilih untuk bertindak atau tidak pada informasi itu.
Di samping itu,
- Bisakah itu mengarah ke tujuan yang kurang jelas dari pemanggilan metode? Pengodean yang buruk sering memaksa saya untuk memeriksa ulang konten metode. Jika itu mengembalikan sesuatu, itu memberi tahu Anda bahwa metode adalah tipe Anda harus melakukan sesuatu dengan hasil yang dikembalikan.
- Masalah lainnya adalah, jika implementasi metode tidak diketahui oleh Anda, apa yang diputuskan pengembang untuk kembali yang tidak berfungsi penting? Tentu saja Anda bisa berkomentar.
- Nilai kembali harus diproses, ketika pemrosesan dapat berakhir pada braket penutupan metode.
- Apa yang terjadi di bawah tenda? Apakah metode yang dipanggil dapatkan
false
karena kesalahan yang dilemparkan? Atau apakah itu kembali salah karena hasil yang dievaluasi?
Apa pengalaman Anda dengan ini? Bagaimana Anda akan bertindak atas hal ini?
sumber
void
setidaknya memberi tahu pengembang bahwa nilai pengembalian metode tidak penting; ia melakukan suatu tindakan, alih-alih menghitung nilai.Jawaban:
Dalam kasus nilai pengembalian bool untuk menunjukkan keberhasilan atau kegagalan suatu metode, saya lebih suka
Try
paradigma -prefix yang digunakan dalam berbagai metode .NET.Misalnya suatu
void InsertRow()
metode bisa melempar pengecualian jika sudah ada baris dengan kunci yang sama. Pertanyaannya adalah, apakah masuk akal untuk menganggap bahwa penelepon memastikan baris mereka unik sebelum memanggil InsertRow? Jika jawabannya tidak, maka saya juga akan memberikanbool TryInsertRow()
yang mengembalikan false jika baris sudah ada. Dalam kasus lain, seperti kesalahan konektivitas db, TryInsertRow masih bisa melempar pengecualian, dengan asumsi bahwa menjaga konektivitas db adalah tanggung jawab pemanggil.sumber
IMHO mengembalikan "kode status" berasal dari zaman historis, sebelum pengecualian menjadi biasa di bahasa tingkat menengah ke yang lebih tinggi seperti C #. Saat ini lebih baik untuk melemparkan pengecualian jika beberapa kesalahan tak terduga mencegah metode Anda berhasil. Dengan cara itu yakin kesalahan tidak luput dari perhatian, dan penelepon dapat menanganinya sebagaimana mestinya. Jadi dalam kasus ini, itu sangat baik untuk metode untuk mengembalikan apa-apa (yaitu
void
) daripada bendera status boolean atau kode status integer. (Tentu saja orang harus mendokumentasikan pengecualian apa yang dapat dilemparkan metode dan kapan.)Di sisi lain, jika itu adalah fungsi dalam arti sempit, yaitu melakukan beberapa perhitungan berdasarkan parameter input, dan diharapkan mengembalikan hasil perhitungan itu, tipe pengembaliannya jelas.
Ada area abu-abu di antara keduanya, ketika seseorang dapat memutuskan untuk mengembalikan beberapa informasi "tambahan" dari metode tersebut, jika dianggap berguna bagi peneleponnya. Seperti contoh Anda tentang jumlah baris yang terpengaruh dalam sisipan. Atau untuk metode untuk menempatkan elemen ke koleksi asosiatif, mungkin berguna untuk mengembalikan nilai sebelumnya yang terkait dengan kunci itu, jika ada. Penggunaan tersebut dapat diidentifikasi dengan menganalisis dengan cermat skenario penggunaan API yang diketahui dan diantisipasi.
sumber
Jawaban Peter mencakup pengecualian dengan baik. Pertimbangan lain di sini melibatkan Pemisahan Command-Query
Prinsip CQS mengatakan bahwa suatu metode harus berupa perintah, atau kueri dan bukan keduanya. Perintah tidak boleh mengembalikan nilai, hanya memodifikasi negara, dan permintaan hanya mengembalikan dan tidak mengubah negara. Ini menjaga semantik sangat jelas dan membantu membuat kode lebih mudah dibaca dan dipelihara.
Ada beberapa kasus yang melanggar prinsip CQS adalah ide yang bagus. Ini biasanya seputar kinerja atau keamanan utas.
sumber
Apa pun jalan yang akan Anda jalani dengan ini. Tidak memiliki nilai balik di sana untuk penggunaan di masa mendatang (mis. Memiliki fungsi selalu kembali benar) ini adalah usaha yang sangat buruk dan tidak membuat kode lebih jelas untuk dibaca. Ketika Anda memiliki nilai kembali Anda harus selalu menggunakannya, dan untuk dapat menggunakannya Anda harus memiliki setidaknya 2 nilai pengembalian yang mungkin.
sumber
Saya biasa menulis banyak fungsi yang tidak valid. Tetapi karena saya mendapatkan seluruh metode chaining crack, saya mulai mengembalikan ini daripada batal - mungkin juga membiarkan seseorang mengambil keuntungan dari pengembalian karena Anda tidak dapat melakukan squat dengan batal. Dan jika mereka tidak ingin melakukan apa pun dengan itu, mereka bisa mengabaikannya.
sumber
Ruby
pada suatu titik? Itulah yang memperkenalkan saya pada metode chaining.return Thing.Change1().Change2();
mengharapkan untuk mengubahThing
dan mengembalikan referensi ke aslinya, atau diharapkan untuk mengembalikan referensi ke hal baru yang berbeda dari aslinya, sambil meninggalkan asli tidak tersentuh.