Saya memiliki rekan kerja yang secara aktif berusaha meyakinkan saya bahwa saya tidak boleh menggunakan do..end dan sebagai gantinya menggunakan kurung kurawal untuk mendefinisikan blok multiline di Ruby.
Saya tegas di kamp hanya menggunakan kurung kurawal untuk one-liners pendek dan lakukan. Tapi saya pikir saya akan menjangkau komunitas yang lebih besar untuk mendapatkan resolusi.
Jadi yang mana, dan mengapa? (Contoh beberapa kode mestinya)
context do
setup { do_some_setup() }
should "do somthing" do
# some more code...
end
end
atau
context {
setup { do_some_setup() }
should("do somthing") {
# some more code...
}
}
Secara pribadi, hanya melihat jawaban di atas untuk saya, tetapi saya ingin membukanya untuk komunitas yang lebih luas.
ruby-on-rails
ruby
ruby-on-rails-3
coding-style
Blake Taylor
sumber
sumber
Jawaban:
Konvensi umum adalah menggunakan do..end untuk blok multi-line dan kurung kurawal untuk blok baris tunggal, tetapi ada juga perbedaan antara keduanya yang dapat diilustrasikan dengan contoh ini:
Ini berarti bahwa {} memiliki prioritas lebih tinggi daripada do..end, jadi ingatlah ketika memutuskan apa yang ingin Anda gunakan.
PS: Satu contoh lagi yang perlu diingat saat Anda mengembangkan preferensi Anda.
Kode berikut:
sangat berarti:
Dan kode ini:
sangat berarti:
Jadi untuk mendapatkan definisi aktual yang Anda inginkan, dengan kurung kurawal, Anda harus melakukan:
Mungkin menggunakan kawat gigi untuk parameter adalah sesuatu yang ingin Anda lakukan, tetapi jika Anda tidak melakukannya, mungkin yang terbaik adalah menggunakan lakukan.
sumber
puts [1,2,3].map do |k| k+1; end
hanya mencetak enumerator yaitu satu hal. Bukankah menempatkan dua argumen lewat sini yaitu[1,2,3].map
dando |k| k+1; end
?Dari Programming Ruby :
Jadi kodenya
Mengikat blok ke
param
variabel saat kodeMengikat blok ke fungsi
f
.Namun ini bukan masalah jika Anda menyertakan argumen fungsi dalam tanda kurung.
sumber
Ada beberapa sudut pandang tentang ini, ini benar-benar masalah preferensi pribadi. Banyak rubyist mengambil pendekatan yang Anda lakukan. Namun, dua gaya lain yang umum adalah selalu menggunakan satu atau yang lain, atau menggunakan
{}
untuk blok yang mengembalikan nilai, dando ... end
untuk blok yang dieksekusi untuk efek samping.sumber
Ada satu manfaat utama untuk kurung kurawal - banyak editor memiliki waktu yang jauh lebih mudah untuk mencocokkannya, membuat jenis debug tertentu lebih mudah. Sementara itu, kata kunci "do ... end" agak sedikit lebih sulit untuk dicocokkan, terutama karena "end" juga cocok "jika" s.
sumber
do ... end
kata kunci secara defaultdo ... end
kasus khusus yang membutuhkan logika spesifik bahasa.Aturan paling umum yang pernah saya lihat (paling baru di Eloquent Ruby ) adalah:
sumber
Saya memilih untuk melakukan / mengakhiri
Konvensi ini
do .. end
untuk multiline dan{ ... }
one-liners.Tapi saya suka yang
do .. end
lebih baik, jadi ketika saya memiliki satu liner, sayado .. end
tetap menggunakan tetapi memformatnya seperti biasa untuk melakukan / berakhir dalam tiga baris. Ini membuat semua orang senang.Salah satu masalah
{ }
adalah bahwa itu adalah mode puisi-permusuhan (karena mereka mengikat dengan ketat ke parameter terakhir dan bukan seluruh pemanggilan metode, jadi Anda harus memasukkan metode parens) dan mereka hanya, menurut saya, tidak terlihat baik. Mereka bukan kelompok pernyataan dan mereka berbenturan dengan konstanta hash untuk dibaca.Plus, saya sudah cukup melihat
{ }
dalam program C. Cara Ruby, seperti biasa, lebih baik. Hanya ada satu jenisif
blok, dan Anda tidak perlu kembali dan mengubah pernyataan menjadi pernyataan gabungan.sumber
do_stuff if x==1
), yang agak menyebalkan untuk dikonversi ke sintaksis biasa. Tapi itu diskusi lain.if
, postfixif
, postfixunless
(juga semacamif
, jika-tidak) dan satu barisif
denganthen
. Cara Ruby adalah memiliki banyak cara untuk mengekspresikan sesuatu yang selalu sama, jauh lebih buruk daripada apa yang ditawarkan C yang mengikuti aturan yang sangat sederhana dan ketat.Beberapa ruby berpengaruh menyarankan untuk menggunakan kawat gigi ketika Anda menggunakan nilai kembali, dan lakukan / akhiri ketika Anda tidak.
http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace (di archive.org)
http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc (di archive.org)
Ini sepertinya praktik yang baik secara umum.
Saya akan sedikit memodifikasi prinsip ini untuk mengatakan bahwa Anda harus menghindari penggunaan do / end pada satu baris karena lebih sulit untuk dibaca.
Anda harus lebih berhati-hati menggunakan kawat gigi karena itu akan mengikat ke param akhir metode daripada seluruh pemanggilan metode. Cukup tambahkan tanda kurung untuk menghindari itu.
sumber
Sebenarnya ini adalah pilihan pribadi, tetapi setelah mengatakan itu, selama 3 tahun terakhir pengalaman rubi saya apa yang saya pelajari adalah bahwa ruby memiliki gayanya.
Salah satu contohnya adalah, jika Anda datang dari latar belakang JAVA, untuk metode boolean yang mungkin Anda gunakan
perhatikan kasus unta dan paling sering 'adalah' awalan untuk mengidentifikasinya sebagai metode boolean.
Tetapi di dunia ruby, metode yang sama akan terjadi
jadi saya pribadi berpikir, lebih baik menggunakan 'ruby way' (Tapi saya tahu perlu waktu bagi seseorang untuk mengerti (butuh sekitar 1 tahun: D)).
Akhirnya, saya akan pergi bersama
blok.
sumber
Saya memberikan jawaban lain, meskipun perbedaan besar sudah ditunjukkan (prcedence / binding), dan itu dapat menyebabkan sulit untuk menemukan masalah (Manusia Timah, dan yang lainnya menunjukkan itu). Saya pikir contoh saya menunjukkan masalah dengan cuplikan kode yang tidak biasa, bahkan programmer yang berpengalaman tidak membaca seperti hari Minggu:
Lalu saya melakukan beberapa kode mempercantik ...
jika Anda mengubah di
{}
sini untukdo/end
Anda akan mendapatkan kesalahan, metodetranslate
itu tidak ada ...Mengapa ini terjadi ditunjukkan di sini lebih dari satu - diutamakan. Tapi di mana harus memasang kawat gigi di sini? (@ the Tin Man: Saya selalu menggunakan kawat gigi, seperti Anda, tetapi di sini ... diawasi)
jadi setiap jawaban suka
hanya salah jika digunakan tanpa "TAPI Mengawasi kawat gigi / didahulukan!"
lagi:
dan
(Apa pun hasil dari perpanjangan tidak dengan blok ...)
Jadi, jika Anda ingin menggunakan do / end use this:
sumber
Berkenaan dengan bias pribadi, saya lebih suka kurung kurawal daripada blok do / end karena lebih dapat dimengerti oleh sejumlah pengembang yang lebih tinggi karena mayoritas bahasa latar belakang menggunakannya pada konvensi do / end. Dengan itu dikatakan kunci sebenarnya adalah mencapai kesepakatan di dalam toko Anda, jika do / end digunakan oleh 6/10 pengembang daripada SEMUA ORANG harus menggunakannya, jika 6/10 menggunakan kurung kurawal, maka berpegang pada paradigma itu.
Ini semua tentang membuat pola sehingga tim secara keseluruhan dapat mengidentifikasi struktur kode lebih cepat.
sumber
Ada perbedaan tipis di antara mereka, tetapi {} mengikat lebih ketat daripada do / end.
sumber
Gaya pribadi saya adalah untuk menekankan keterbacaan atas aturan kaku
{
...}
vsdo
...end
pilihan, ketika pilihan seperti itu mungkin. Gagasan saya tentang keterbacaan adalah sebagai berikut:Dalam sintaksis yang lebih kompleks, seperti blok bertingkat multiline, saya mencoba untuk menyelingi
{
...}
dando
...end
pembatas untuk hasil yang paling alami, misalnya.Meskipun kurangnya aturan kaku mungkin menghasilkan pilihan yang sedikit berbeda untuk programmer yang berbeda, saya percaya bahwa optimasi kasus per kasus untuk keterbacaan, meskipun subyektif, adalah keuntungan bersih dari kepatuhan terhadap aturan yang kaku.
sumber
Ruby
adalah bahasa pragmatis terbaik di luar sana. Haruskah saya mengatakan bahasa scripting. Hari ini, saya pikir Anda akan sama-sama belajar dengan baikBrainfuck
.Saya mengambil contoh jawaban yang paling banyak dipilih di sini. Mengatakan,
Jika Anda memeriksa apa implementasi internal di array.rb, header metode peta mengatakan :
Invokes the given block once for each element of self.
yaitu menerima blok kode - apa pun yang ada di antara do dan end dieksekusi sebagai hasil. Kemudian hasilnya akan dikumpulkan sebagai array lagi, sehingga mengembalikan objek yang sama sekali baru.
sumber
Ada opsi ketiga: Tulis preprocessor untuk menyimpulkan "end" pada barisnya sendiri, dari indentasi. Pemikir mendalam yang lebih suka kode ringkas kebetulan benar.
Lebih baik lagi, retas ruby jadi ini adalah bendera.
Tentu saja, solusi paling sederhana "pilih perkelahian" Anda adalah dengan mengadopsi konvensi gaya bahwa semua urutan ujung muncul pada baris yang sama, dan mengajarkan pewarnaan sintaks Anda untuk membisukan mereka. Untuk memudahkan pengeditan, seseorang dapat menggunakan skrip editor untuk memperluas / menciutkan urutan ini.
20% hingga 25% dari baris kode ruby saya adalah "end" pada baris mereka sendiri, semua disimpulkan oleh konvensi indentasi saya. Ruby adalah bahasa mirip-lisp yang telah mencapai kesuksesan terbesar. Ketika orang-orang membantah ini, menanyakan di mana semua tanda kurung yang mengerikan, saya menunjukkan kepada mereka fungsi ruby yang diakhiri dengan tujuh baris "akhir" yang berlebihan.
Saya melakukan kode selama bertahun-tahun menggunakan preparat prosesor untuk menyimpulkan sebagian besar tanda kurung: Bilah '|' membuka grup yang diautoclosed pada akhir baris, dan tanda dolar '$' berfungsi sebagai penampung kosong di mana tidak akan ada simbol untuk membantu menyimpulkan pengelompokan. Ini tentu saja wilayah perang agama. Lisp / skema tanpa tanda kurung adalah yang paling puitis dari semua bahasa. Meski demikian, lebih mudah untuk tenang kurung menggunakan pewarnaan sintaks.
Saya masih kode dengan preprocessor untuk Haskell, untuk menambahkan heredocs, dan ke default semua baris flush sebagai komentar, semuanya diindentasi sebagai kode. Saya tidak suka karakter komentar, apa pun bahasanya.
sumber