Mendeklarasikan variabel pengembalian dalam metode c # vs mengembalikan nilai secara langsung

17

Dalam debat mengenai variabel kembali, beberapa anggota tim lebih suka metode untuk mengembalikan hasilnya langsung ke pemanggil, sedangkan yang lain lebih suka menyatakan variabel kembali yang kemudian dikembalikan ke pemanggil (lihat contoh kode di bawah)

Argumen untuk yang terakhir adalah bahwa hal itu memungkinkan pengembang yang men-debug kode untuk menemukan nilai kembali metode sebelum kembali ke pemanggil sehingga membuat kode lebih mudah untuk dipahami: Ini terutama benar ketika panggilan metode dirantai daisy.

Adakah pedoman yang paling efisien dan / atau ada alasan lain mengapa kita harus mengadopsi satu gaya di atas yang lain?

Terima kasih

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }
pb01
sumber
11
Kedua contoh akan dikompilasi ke IL identik. Satu-satunya alasan Anda menginginkan contoh kedua adalah untuk tujuan debugging atau jika Anda perlu menggunakannya resultsebelum mengembalikannya.
ChrisF
1
Alasan lain adalah karena Anda perlu melakukan sesuatu yang lain antara menghitung hasil dan mengembalikannya.
tdammers
1
@ ChrisF, sebenarnya mereka tidak mengkompilasi ke IL yang sama untuk saya (ada tambahan stloc.0dan ldloc.0di versi kedua). Tapi saya pikir itu hanya terjadi dalam mode Debug. Dan itu tidak terlalu penting di sini.
svick
@svick - OK - saya harus menambahkan "dalam mode release";)
ChrisF
1
Karena Anda dapat dan kadang-kadang harus (demi singkatnya) menulis sesuatu yang terlihat seperti: a = b = c;dan a == b == c, saya akan menghindari menulis sesuatu yang terlihat a = b == cjika Anda bisa. Ketika saya pertama kali melihat sederet kode seperti itu, saya perlu beberapa detik untuk mencari tahu apa yang sedang terjadi. Kode itu menonjol. Saya ingin menampar tanda kurung sekitar a == 3, tetapi StyleCop tidak menyukainya - alasan yang baik untuk menggunakan versi nomor satu. Sesuatu yang lain: ini pada dasarnya adalah lambda, seperti a => (a == 3). Mengapa menambahkan sebaris kode ke fungsi sepele yang sudah membengkak?
Ayub

Jawaban:

7

Karena saya menggunakan Resharper dengan Visual Studio, Ctrl-RV (Atau Ctrl-Alt-V, jika Anda menggunakan binding kunci Resharper / IntelliJ) mengubah contoh pertama Anda menjadi contoh kedua. Jadi ketika saya ingin men-debug, saya bisa melakukannya dengan cukup mudah. Dan jika saya lupa mengembalikannya maka saya tidak akan merasa buruk karena Ctrl-RI akan mengembalikannya lagi untuk membuatnya lebih mudah dibaca.

Serius, buang waktu Anda berdebat tentang hal-hal yang lebih penting. Seperti tempat menaruh kurung kurawal atau spasi vs tab.

pdr
sumber
5
Saya lebih suka perdebatan saya tentang karakter yang tidak terlihat ...
ChaosPandion
Tip yang bagus, kawan! Sekarang kita dapat terus-menerus mem-re-faktor kode masing-masing jauh lebih cepat daripada yang kita bisa sebelumnya. Mungkin akan menghemat lebih banyak waktu daripada benar-benar mendiskusikannya! :)
pb01
@ pdr apakah itu ctrl + RV hanya bekerja dengan resharper? atau apakah itu semacam keybind khusus? itu tidak bekerja untuk saya.
Jane Doe
@JaneDoe: Saya terkejut menemukan bahwa itu adalah refactoring Resharper dan bahwa VS tidak memiliki yang setara. Jawaban dikoreksi. Maaf soal itu.
pdr
@ChaosPandion U + 200B untuk kemenangan!
Jesse C. Slicer
18

Secara pribadi saya menemukan contoh pertama lebih mudah dibaca. Anda masih dapat men-debug-nya, dengan menetapkan titik istirahat pada pernyataan pengembalian dan menambahkan a == 2ke jendela arloji atau dengan menggunakan arloji cepat.

Tapi ini benar-benar masalah preferensi pribadi. Kedua versi itu OK.

Olivier Jacot-Descombes
sumber
8
+1 meluruskan lebih sulit untuk membaca kode untuk membuat menempatkan break point lebih mudah adalah melakukan hal-hal yang salah di sekitar imho
jk.
Jendela tontonan atau jendela perantara tidak selalu merupakan solusi untuk masalah ini, karena terkadang ekspresi membutuhkan utas untuk berjalan.
JustAnotherUserYouMayKnowOrNot
@JustAnotherUserYouMayKnowOrNot: Ya. Ada juga kemungkinan untuk mencetak pesan ke dalam jendela debug dari dalam breakpoint. Klik kanan breakpoint dan pilih "When Hit ...".
Olivier Jacot-Descombes
Ekspresi juga dapat memiliki efek samping, menjalankannya lagi dapat menyebabkan masalah. Lebih baik tetap dengan var hasilnya.
JustAnotherUserYouMayKnowOrNot
9

Ketika kode mudah dibaca sebagai contoh Anda, tidak ada yang salah dengan mengembalikan hasil operasi logis seperti return a == 2. Namun, jika nilai kembali adalah pernyataan yang lebih kompleks atau terlihat seperti

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

maka Anda akan ingin menggunakan variabel untuk menyimpan potongan-potongan itu terlebih dahulu dan menyederhanakan pernyataan kembali, agar mudah dibaca.

CFL_Jeff
sumber
2

Dalam contoh sederhana seperti itu, salah satunya OK.

Untuk contoh yang lebih rumit, saya lebih suka cara kedua. Itu hanya karena itu lebih mudah dibaca dan orang lain mungkin harus menjaga kode.

Alan Delimon
sumber
Hanya jika ada nama variabel yang lebih baik daripada result, yang itu sendiri merupakan pengidentifikasi yang sepenuhnya non-deskriptif dan tidak berguna.
Alexander - Pasang kembali Monica