Berasal dari latar belakang Python, di mana selalu ada "cara yang tepat untuk melakukannya" (cara "Pythonic") ketika datang ke gaya, saya bertanya-tanya apakah hal yang sama ada untuk Ruby. Saya telah menggunakan pedoman gaya saya sendiri tetapi saya berpikir untuk merilis kode sumber saya, dan saya ingin mematuhi aturan tidak tertulis yang mungkin ada.
Apakah itu "The Ruby Way" untuk secara eksplisit mengetikkan return
metode? Saya sudah melihatnya selesai dengan dan tanpa, tetapi apakah ada cara yang tepat untuk melakukannya? Apakah mungkin ada waktu yang tepat untuk melakukannya? Sebagai contoh:
def some_func(arg1, arg2, etc)
# Do some stuff...
return value # <-- Is the 'return' needed here?
end
ruby
coding-style
return-value
Sasha Chedygov
sumber
sumber
Jawaban:
Pertanyaan lama (dan "dijawab"), tetapi saya akan melemparkan dua sen saya sebagai jawaban.
TL; DR - Anda tidak harus melakukannya, tetapi itu bisa membuat kode Anda jauh lebih jelas dalam beberapa kasus.
Meskipun tidak menggunakan pengembalian eksplisit mungkin "cara Ruby", itu membingungkan bagi programmer yang bekerja dengan kode asing, atau tidak terbiasa dengan fitur Ruby ini.
Ini adalah contoh yang agak dibuat-buat, tetapi bayangkan memiliki fungsi kecil seperti ini, yang menambahkan satu ke angka yang lewat, dan menugaskannya ke variabel instan.
Apakah ini dimaksudkan sebagai fungsi yang mengembalikan nilai, atau tidak? Sangat sulit untuk mengatakan apa yang dimaksud pengembang, karena keduanya memberikan variabel instan, DAN mengembalikan nilai yang ditetapkan juga.
Misalkan nanti, programmer lain (mungkin tidak terlalu familiar dengan bagaimana Ruby mengembalikan berdasarkan baris terakhir dari kode yang dieksekusi) datang dan ingin memasukkan beberapa pernyataan cetak untuk logging, dan fungsinya menjadi seperti ini ...
Sekarang fungsinya rusak jika ada yang mengharapkan nilai yang dikembalikan . Jika tidak ada yang mengharapkan nilai yang dikembalikan, tidak apa-apa. Jelas jika suatu tempat lebih jauh ke bawah rantai kode, sesuatu yang memanggil ini mengharapkan nilai yang dikembalikan, itu akan gagal karena tidak mendapatkan kembali apa yang diharapkan.
Pertanyaan sebenarnya sekarang adalah ini: apakah ada yang benar-benar mengharapkan nilai yang dikembalikan? Apakah ini merusak sesuatu atau tidak? Akankah itu merusak sesuatu di masa depan? Siapa tahu! Hanya tinjauan kode lengkap dari semua panggilan yang akan memberi tahu Anda.
Jadi bagi saya setidaknya, pendekatan praktik terbaik adalah dengan sangat eksplisit bahwa Anda mengembalikan sesuatu jika itu penting, atau tidak menghasilkan apa-apa sama sekali ketika tidak.
Jadi dalam kasus fungsi demo kecil kami, dengan asumsi kami ingin mengembalikan nilai, itu akan ditulis seperti ini ...
Dan akan sangat jelas bagi setiap programmer bahwa ia mengembalikan nilai, dan jauh lebih sulit bagi mereka untuk memecahkannya tanpa menyadarinya.
Atau, orang dapat menulis seperti ini dan meninggalkan pernyataan kembali ...
Tapi mengapa repot-repot meninggalkan kata kembali? Mengapa tidak letakkan saja di sana dan buatlah 100% jelas apa yang terjadi? Ini benar-benar tidak akan berdampak pada kemampuan kode Anda untuk melakukan.
sumber
return
menambahkan makna semantik pada kode, mengapa tidak? Ini hampir tidak terlalu jelas - kita tidak berbicara 5 baris vs 3, hanya satu kata lagi. Saya lebih suka melihatreturn
setidaknya dalam fungsi (mungkin tidak dalam blok) untuk mengekspresikan apa kode sebenarnya. Terkadang Anda harus mengembalikan fungsi-tengah - jangan tinggalkanreturn
kata kunci terakhir di baris terakhir hanya karena Anda bisa. Saya tidak menyukai verbositas sama sekali, tetapi saya mendukung konsistensi.side_effect()
dan pengembang lain memutuskan untuk (ab) menggunakan nilai balik implisit dari prosedur Anda. Untuk memperbaiki ini, Anda dapat membuat prosedur Anda secara eksplisitreturn nil
.Tidak. Gaya Ruby yang baik umumnya hanya menggunakan pengembalian eksplisit untuk pengembalian awal . Ruby besar pada kode minimalisme / sihir implisit.
Yang mengatakan, jika pengembalian eksplisit akan membuat segalanya lebih jelas, atau lebih mudah dibaca, itu tidak akan membahayakan apa pun.
sumber
return
sudah memiliki makna semantik yang signifikan sebagai EXIT AWAL ke fungsi.return
di baris terakhir sebagai EXIT AWAL?Saya pribadi menggunakan
return
kata kunci untuk membedakan antara apa yang saya sebut metode fungsional , yaitu metode yang dieksekusi terutama untuk nilai pengembaliannya, dan metode prosedural yang dieksekusi terutama untuk efek sampingnya. Jadi, metode di mana nilai kembali itu penting, dapatkanreturn
kata kunci tambahan untuk menarik perhatian pada nilai balik.Saya menggunakan perbedaan yang sama ketika memanggil metode: metode fungsional mendapatkan tanda kurung, metode prosedural tidak.
Dan last but not least, saya juga menggunakan perbedaan itu dengan blok: blok fungsional mendapatkan kurung kurawal, blok prosedural (yaitu blok yang "melakukan" sesuatu) dapatkan
do
/end
.Namun, saya mencoba untuk tidak menjadi religius tentang hal itu: dengan balok, kurung kurawal dan
do
/end
memiliki prioritas yang berbeda, dan alih-alih menambahkan tanda kurung eksplisit untuk mengaburkan ekspresi, saya hanya beralih ke gaya lain. Hal yang sama berlaku untuk pemanggilan metode: jika menambahkan tanda kurung di sekitar daftar parameter membuat kode lebih mudah dibaca, saya melakukannya, bahkan jika metode tersebut bersifat prosedural.sumber
Sebenarnya yang penting adalah membedakan antara:
Ruby tidak memiliki cara asli untuk membedakan ini - yang membuat Anda rentan untuk menulis prosedur
side_effect()
dan pengembang lain memutuskan untuk menyalahgunakan nilai balik implisit dari prosedur Anda (pada dasarnya memperlakukannya sebagai fungsi tidak murni).Untuk mengatasinya, keluarkan daun dari buku Scala dan Haskell dan minta prosedur Anda dikembalikan secara eksplisit
nil
(aliasUnit
atau()
dalam bahasa lain).Jika Anda mengikuti ini, maka menggunakan
return
sintaksis eksplisit atau tidak hanya menjadi masalah gaya pribadi.Untuk membedakan lebih jauh antara fungsi dan prosedur:
do/end
()
, sedangkan saat Anda menjalankan fungsi, janganPerhatikan bahwa Jörg W Mittag sebenarnya menganjurkan sebaliknya - menghindari
()
untuk prosedur - tetapi itu tidak dianjurkan karena Anda ingin invokasi metode efek samping secara jelas dapat dibedakan dari variabel, terutama ketika arity adalah 0. Lihat panduan gaya Scala tentang metode doa untuk detail.sumber
function_a
, danfunction_a
ditulis untuk menelepon (dan hanya dapat beroperasi dengan menelepon)procedure_b
, apakahfunction_a
benar-benar sebuah fungsi? Ini mengembalikan nilai, memenuhi kebutuhan Anda untuk fungsi, tetapi memiliki efek samping, memenuhi persyaratan prosedur.function_a
bisa berisi pohonprocedure_...
panggilan, karena memangprocedure_a
bisa berisi pohonfunction_...
panggilan. Seperti Scala tetapi tidak seperti Haskell, tidak ada jaminan di Ruby bahwa suatu fungsi tidak berefek samping.Panduan gaya menyatakan, bahwa Anda tidak boleh menggunakan
return
pada pernyataan terakhir Anda. Anda masih dapat menggunakannya jika itu bukan yang terakhir . Ini adalah salah satu konvensi yang diikuti oleh komunitas dengan ketat, dan Anda juga harus jika Anda berencana untuk berkolaborasi dengan siapa pun yang menggunakan Ruby.Yang sedang berkata, argumen utama untuk menggunakan
return
s eksplisit adalah bahwa itu membingungkan bagi orang-orang yang datang dari bahasa lain.Heuristik umum untuk panjang metode (tidak termasuk getter / setter) di java adalah satu layar . Dalam hal ini, Anda mungkin tidak melihat definisi metode dan / atau sudah lupa dari mana Anda kembali.
Di sisi lain, di Ruby yang terbaik adalah tetap menggunakan metode yang panjangnya kurang dari 10 baris . Mengingat itu, orang akan bertanya-tanya mengapa dia harus menulis ~ 10% lebih banyak pernyataan, ketika mereka jelas tersirat.
Karena Ruby tidak memiliki metode batal dan semuanya jauh lebih ringkas, Anda hanya menambahkan overhead untuk tidak ada manfaat jika Anda menggunakan
return
s eksplisit .sumber
Saya setuju dengan Ben Hughes dan tidak setuju dengan Tim Holt, karena pertanyaannya menyebutkan cara definitif Python melakukannya dan bertanya apakah Ruby memiliki standar yang sama.
Itu benar.
Ini adalah fitur bahasa yang sangat terkenal sehingga siapa pun yang diharapkan men-debug masalah di ruby harus diharapkan untuk mengetahuinya.
sumber
return
kata kunci ketika tidak perlu.Ini masalah gaya mana yang paling Anda sukai. Anda harus menggunakan kata kunci kembali jika Anda ingin kembali dari suatu tempat di tengah metode.
sumber
Seperti kata Ben. Fakta bahwa 'nilai kembali metode ruby adalah nilai balik dari pernyataan terakhir di badan fungsi' menyebabkan kata kunci kembali jarang digunakan dalam sebagian besar metode ruby.
sumber
if failed_check then nil else @list end
? Itu benar-benar fungsional .