Saya telah berdiskusi dengan rekan kerja tentang melanggar return
pernyataan dan pernyataan yang menghitung nilai balik dalam dua baris.
Sebagai contoh
private string GetFormattedValue()
{
var formattedString = format != null ? string.Format(format, value) : value.ToString();
return formattedString;
}
dari pada
private string GetFormattedValue()
{
return format != null ? string.Format(format, value) : value.ToString();
}
Dari segi kode, saya tidak benar-benar melihat nilai pada varian pertama. Bagi saya, yang terakhir lebih jelas, terutama untuk metode yang pendek. Argumennya adalah bahwa varian sebelumnya lebih mudah untuk di-debug - yang merupakan prestasi yang sangat kecil, karena VisualStudio memungkinkan kita melakukan pemeriksaan yang sangat terperinci terhadap pernyataan, ketika eksekusi dihentikan karena titik istirahat.
Pertanyaan saya adalah, apakah masih ada gunanya menulis kode kurang jelas, hanya untuk membuat debug sekilas lebih mudah? Apakah ada argumen lebih lanjut untuk varian dengan perhitungan split dan return
pernyataan?
sumber
private string GetFormattedValue() => string.Format(format ?? "{0}", value);
Jawaban:
Memperkenalkan variabel yang menjelaskan adalah refactoring terkenal yang terkadang dapat membantu membuat ekspresi rumit menjadi lebih mudah dibaca. Namun, dalam kasus yang ditunjukkan,
Selain itu, versi yang lebih baru dari Visual Studio debugger dapat menunjukkan nilai balik suatu fungsi dalam banyak kasus tanpa memperkenalkan variabel yang berlebihan (tetapi berhati-hatilah, ada beberapa peringatan, lihat posting SO yang lebih tua ini dan jawaban yang berbeda ).
Jadi dalam kasus khusus ini, saya setuju untuk Anda, namun, ada kasus lain di mana variabel yang menjelaskan memang dapat meningkatkan kualitas kode.
sumber
result
nama variabel. Tidak terlalu lama dan lebih mudah untuk di-debugresult
sering hanya menambahkan derau ke kode dan jarang meningkatkan keterbacaan, yang merupakan inti dari jawaban saya. Ini dapat dibenarkan dalam konteks di mana ini membantu debugging, tapi saya akan menghindari ketika menggunakan debugger yang tidak memerlukan variabel terpisah.result
menyampaikan informasi bahwa ini adalah nilai yang dihasilkan dari fungsi, sehingga Anda dapat melihatnya sebelum fungsi kembali.Mengingat fakta bahwa:
a) Tidak ada dampak pada kode akhir karena kompiler mengoptimalkan variabel menjauh.
b) Memiliki terpisah meningkatkan kemampuan debugging.
Saya pribadi sampai pada kesimpulan bahwa ini adalah praktik yang baik untuk memisahkan mereka 99% dari waktu.
Tidak ada kerugian material untuk melakukannya dengan cara ini. Argumen bahwa itu kode kembung adalah keliru, karena kode kembung adalah masalah sepele dibandingkan dengan kode tidak dapat dibaca atau sulit untuk debug. Selain itu, metode ini tidak dapat dengan sendirinya membuat kode yang membingungkan, itu sepenuhnya terserah pengembang.
sumber
Seringkali, memperkenalkan variabel hanya untuk memberi nama beberapa hasil sangat membantu ketika itu membuat kode lebih mendokumentasikan diri. Dalam hal ini itu bukan faktor karena nama variabel sangat mirip dengan nama metode.
Perhatikan bahwa satu metode garis tidak memiliki nilai bawaan. Jika perubahan memperkenalkan lebih banyak baris tetapi membuat kode lebih jelas, itu adalah perubahan yang baik.
Namun secara umum, keputusan ini sangat tergantung pada preferensi pribadi Anda. Misalnya, saya menemukan kedua solusi membingungkan karena operator kondisional digunakan secara tidak perlu. Saya lebih suka pernyataan jika. Tetapi di tim Anda, Anda mungkin telah menyetujui berbagai konvensi. Kemudian lakukan apa pun yang disarankan oleh konvensi Anda. Jika konvensi ini diam mengenai kasus seperti ini, perhatikan bahwa ini adalah perubahan yang sangat kecil yang tidak masalah dalam jangka panjang. Jika pola ini terjadi berulang kali, mungkin memulai diskusi bagaimana Anda sebagai tim ingin menangani kasus-kasus ini. Tapi itu memisahkan antara "kode yang baik" dan "mungkin kode yang sedikit lebih baik".
sumber
?
dan:
saya gunakanif() {
dan} else {
- - - -\\ :)
Menanggapi pertanyaan Anda:
Pertanyaan saya adalah, apakah masih ada gunanya menulis kode kurang jelas, hanya untuk membuat debug sekilas lebih mudah?
Iya nih. Bahkan, bagian dari pernyataan Anda sebelumnya bagi saya (jangan tersinggung) sedikit picik (lihat huruf tebal di bawah) " Argumennya adalah bahwa varian sebelumnya lebih mudah untuk di-debug - yang merupakan prestasi yang cukup kecil , karena VisualStudio memungkinkan kami memeriksa laporan dengan sangat rinci, ketika eksekusi dihentikan karena titik istirahat. "
Membuat debugging lebih mudah (hampir) tidak pernah " kecil " karena oleh beberapa perkiraan 50% dari waktu programmer dihabiskan untuk debugging ( Reversible Debugging Software ).
Apakah ada argumen lebih lanjut untuk varian dengan perhitungan split dan pernyataan pengembalian?
Iya nih. Beberapa pengembang berpendapat bahwa penghitungan split lebih mudah dibaca. Ini, tentu saja, membantu dengan debugging tetapi juga membantu ketika seseorang mencoba menguraikan aturan bisnis apa pun yang mungkin dilakukan atau diterapkan oleh kode Anda.
CATATAN: Aturan bisnis mungkin lebih baik disajikan dalam database karena mereka dapat sering berubah. Namun demikian, pengkodean yang jelas dalam bidang ini masih sangat penting. ( Cara Membangun Mesin Aturan Bisnis )
sumber
Saya akan melangkah lebih jauh:
Mengapa?
Menggunakan operator ternary untuk logika yang lebih kompleks tidak dapat dibaca, jadi Anda akan menggunakan gaya seperti di atas untuk pernyataan yang lebih kompleks. Dengan selalu menggunakan gaya ini, kode Anda konsisten dan lebih mudah bagi manusia untuk diurai. Selain itu, dengan memperkenalkan jenis konsistensi (dan menggunakan kode serat dan tes lainnya) Anda dapat menghindari
goto fail
kesalahan ketik.Keuntungan lain adalah bahwa laporan cakupan kode Anda akan memberi tahu Anda jika Anda lupa menyertakan tes
format
bukan nol. Ini tidak akan menjadi kasus bagi operator ternary.Alternatif pilihan saya - jika Anda berada di "dapatkan pengembalian secepat mungkin" dan tidak menentang beberapa pengembalian dari metode:
Jadi, Anda dapat melihat pengembalian terakhir untuk melihat apa defaultnya.
Penting untuk konsisten - dan mintalah semua metode Anda mengikuti satu atau beberapa konvensi lainnya.
sumber
value.ToString()
dipanggil tidak perlu ketika formatnya bukan nol. Dalam kasus umum, ini bisa termasuk perhitungan non-sepele, dan dapat memakan waktu lebih lama dari versi termasuk string format. Pertimbangkan, misalnya, avalue
yang menyimpan PI ke satu juta tempat desimal, dan format string yang hanya meminta beberapa digit pertama.private string GetFormattedValue() => string.Format(format ?? "{0}", value);
sama mempengaruhi, dan menggunakan unit test untuk memastikan kebenaran alih-alih mengandalkan debugger.Saya tidak berpikir bahwa teknik seperti itu dapat dibenarkan oleh kebutuhan untuk debug. Saya telah mengalami pendekatan ini sendiri ribuan kali, dan dari waktu ke waktu saya terus melakukan ini, tetapi saya selalu ingat apa yang dikatakan Martin Fowler tentang debugging :
sumber
Saya pikir beberapa orang terpaku pada masalah yang berkaitan dengan pertanyaan, seperti operator ternary. Ya, banyak orang membencinya, jadi mungkin ada baiknya mengemukakannya.
Mengenai fokus pertanyaan Anda, memindahkan pernyataan kembali untuk direferensikan oleh variabel ...
Pertanyaan ini membuat 2 asumsi yang tidak saya setujui:
Bahwa varian kedua lebih jelas atau mudah dibaca (saya katakan yang sebaliknya benar), dan
bahwa setiap orang menggunakan Visual Studio. Saya telah menggunakan Visual Studio berkali-kali dan dapat menggunakannya dengan baik, tetapi saya biasanya menggunakan sesuatu yang lain. Lingkungan dev yang memaksa IDE spesifik adalah sesuatu yang saya akan skeptis.
Memecah sesuatu ke variabel bernama jarang membuat sesuatu lebih sulit untuk dibaca, hampir selalu melakukan yang sebaliknya. Spesifik cara di mana seseorang tidak dapat menyebabkan masalah, seperti jika tuan dokumentasi diri tidak
var thisVariableIsTheFormattedResultAndWillBeTheReturnValue = ...
maka jelas yang buruk, tapi itu adalah masalah yang terpisah.var formattedText = ...
baik-baik saja.Dalam kasus khusus ini, dan mungkin banyak kasus karena kita berbicara tentang 1-liner, variabel tidak akan banyak memberi tahu Anda bahwa nama fungsi belum memberi tahu Anda. Oleh karena itu, variabel tidak bertambah banyak. Argumen debugging masih bisa berlaku, tetapi sekali lagi, dalam kasus khusus ini saya tidak melihat apa pun yang mungkin menjadi fokus Anda ketika debugging, dan itu selalu dapat dengan mudah diubah nanti jika entah bagaimana seseorang membutuhkan format itu untuk debugging atau apa pun.
Secara umum, dan Anda memang meminta aturan umum (contoh Anda hanya itu, contoh bentuk umum), semua poin yang dibuat mendukung varian 1 (2-liner) benar. Itu adalah pedoman yang baik untuk dimiliki. Tetapi pedoman harus fleksibel. Misalnya, proyek yang sedang saya kerjakan sekarang memiliki 80 karakter per baris maksimum, jadi saya membagi banyak baris, tetapi saya biasanya menemukan garis 81-85 karakter yang akan canggung untuk memecah atau mengurangi keterbacaan dan saya membiarkannya selesai batasnya.
Karena tidak mungkin menambah nilai, saya tidak akan melakukan 2 baris untuk contoh spesifik yang diberikan. Saya akan melakukan varian 2 (1-liner) karena poin tidak cukup kuat untuk melakukan sebaliknya dalam kasus ini.
sumber