Saya benci referensi konten paywalled, tapi video ini menunjukkan apa yang saya bicarakan. Tepatnya 12 menit dalam Robert Martin melihat ini:
Dan mengatakan "Salah satu hal favorit saya untuk dilakukan adalah menyingkirkan kawat gigi yang tidak berguna" saat dia mengubahnya menjadi ini:
Dahulu kala, dalam pendidikan yang sangat jauh, saya diajari untuk tidak melakukan ini karena membuatnya mudah untuk memperkenalkan bug dengan menambahkan garis indentasi lain yang berpikir itu dikendalikan oleh if
saat tidak.
Agar adil bagi Paman Bob, ia merecode metode Java yang panjang hingga fungsi kecil yang, saya setuju, jauh lebih mudah dibaca. Ketika dia selesai mengubahnya, (22.18) terlihat seperti ini:
Saya bertanya-tanya apakah itu seharusnya memvalidasi menghapus kawat gigi. Saya sudah terbiasa dengan praktik terbaik . Bisakah Paman Bob ditantang dalam hal ini? Apakah Paman Bob membela gagasan itu?
sumber
if
blok hanya satu baris, itu tidak masalah. Jika Anda perlu menambahkan lebih banyak baris, itu harus fungsi lain yang mengurangiif
blok kembali ke satu baris (panggilan fungsi). Jika Anda mematuhi itu, maka kawat gigi tidak masalah - sama sekali .return (page==null) ? "" : includePage(mode,page);
jika dia terlalu ingin mendapatkan ... Saya pikir gaya tanpa-penjepit itu keren sampai saya mulai mengembangkan aplikasi secara profesional. Diff noise, kemungkinan kesalahan ketik dll. Kawat gigi, berada di sana sepanjang waktu, menghemat waktu & overhead yang perlu Anda perkenalkan nanti.Jawaban:
Keterbacaan bukanlah hal kecil.
Saya memiliki pikiran campuran ketika datang ke kawat gigi yang melampirkan metode tunggal. Saya pribadi menghapusnya untuk hal-hal seperti pernyataan pengembalian satu baris, tetapi meninggalkan kawat gigi seperti itu sebenarnya sangat menggigit kami di tempat terakhir saya bekerja. Seseorang menambahkan satu baris kode ke
if
pernyataan tanpa juga menambahkan tanda kurung yang diperlukan, dan karena itu adalah C, itu menabrak sistem tanpa peringatan.Saya tidak pernah menantang siapa pun yang religius tentang selalu menggunakan kawat gigi setelah kegagalan kecil itu.
Jadi saya melihat manfaat dari keterbacaan, tetapi saya sangat menyadari masalah yang dapat muncul ketika Anda meninggalkan kawat gigi itu.
Saya tidak akan repot mencari studi atau pendapat seseorang yang dipublikasikan. Setiap orang memiliki satu (pendapat, yaitu), dan karena ini adalah masalah gaya, satu pendapat sama baiknya dengan yang lain. Pikirkan masalah Anda sendiri, evaluasi pro dan kontra, dan buat pikiran terkutuk Anda sendiri. Jika toko tempat Anda bekerja memiliki standar pengkodean yang mencakup masalah ini, cukup ikuti itu.
sumber
-Wmisleading-indentation
.Anda dapat menemukan beberapa promosi yang diterbitkan atau penolakan gaya tanpa penyangga di sini atau di sini atau di mana gudang sepeda dicat.
Melangkah menjauh dari gudang sepeda, ingat bug OS X / iOS SSL hebat tahun 2014?
Yap, "disebabkan" oleh blok tanpa penyangga https://www.imperialviolet.org/2014/02/22/applebug.html
Preferensi mungkin tergantung pada gaya penyangga. Jika saya harus menulis
Saya mungkin cenderung menghemat ruang juga. Tapi
hanya menggunakan satu baris "ekstra".
Saya tahu Anda tidak bertanya, tetapi jika saya bekerja sendiri, saya adalah bidat. Jika saya menghapus kawat gigi, saya lebih suka
Ini tidak memiliki masalah visual yang sama dengan bug iOS-style iOS, tetapi menyimpan lebih banyak baris "tidak perlu" daripada Paman Bob;) Dibaca dengan baik jika Anda terbiasa, dan memiliki penggunaan umum di Ruby (
includePage(mode, suiteSetup) unless suiteSetup.nil?
). Oh well, ketahuilah bahwa ada banyak pendapat.sumber
} else[if(...)] {
, itu tidak menambahkan garis tambahan apa pun, sehingga hanya menambah satu baris tambahan di seluruh hal.Paman Bob memiliki banyak lapisan pertahanan terhadap kesalahan seperti itu yang tidak biasa ketika "selalu menggunakan kawat gigi" adalah kebijaksanaan yang berlaku:
Saya pikir jika seseorang menerbitkan tantangan kepada Paman Bob, ia akan memiliki bantahan yang cukup bagus dengan poin-poin di atas. Ini adalah salah satu kesalahan termudah untuk ditangkap lebih awal.
sumber
while(true);{break;}
. Jika benar-benar ada konteks yang valid untuk ini, saya perlu waktu untuk mengatasinya.includePage()
bukan makro yang ditulis dengan buruk dengan lebih dari satu pernyataan?Untuk sebagian besar ini adalah preferensi pribadi, namun ada beberapa hal yang perlu dipertimbangkan.
Kemungkinan Bug
Meskipun dapat dikatakan bahwa bug yang disebabkan oleh lupa untuk menambahkan-in kawat gigi jarang terjadi, dari apa yang saya lihat bahwa mereka tidak terjadi sesekali (tidak melupakan terkenal goto IOS gagal bug). Jadi saya pikir ini harus menjadi faktor ketika mempertimbangkan gaya kode Anda (beberapa alat memperingatkan tentang indentasi menyesatkan , jadi itu tergantung pada rantai alat Anda juga) .
Hari Code (yang berbunyi seperti itu mungkin menjadi bug)
Bahkan dengan asumsi proyek Anda tidak menderita dari bug tersebut, ketika membaca kode Anda mungkin melihat beberapa blok dari kode yang terlihat seperti mereka bisa menjadi bug - tetapi tidak, mengambil beberapa siklus mental Anda.
Kita mulai dengan:
Pengembang menambahkan komentar yang bermanfaat.
Kemudian pengembang mengembangkannya.
Atau menambahkan blok bersarang:
Atau menggunakan makro:
"... Karena makro dapat mendefinisikan beberapa baris kode, apakah makro digunakan
do {...} while (0)
untuk banyak baris? Seharusnya karena itu ada dalam panduan gaya kita tapi aku lebih baik memeriksa kalau-kalau!"Contoh di atas adalah semua kode yang valid, namun semakin banyak konten dalam blok-kode, semakin banyak yang perlu Anda baca untuk memastikan tidak ada kesalahan.
Mungkin gaya kode Anda mendefinisikan bahwa blok multi-line memerlukan penjepit (tidak peduli apa, bahkan jika itu bukan kode) , tetapi saya telah melihat komentar semacam ini ditambahkan dalam kode produksi. Ketika Anda membacanya, ada sedikit keraguan bahwa siapa pun yang terakhir mengedit baris-baris itu lupa menambahkan kurung kurawal, kadang-kadang saya merasa perlu memeriksa ulang berfungsi sebagaimana dimaksud (terutama ketika menyelidiki bug di area kode ini) .
Kebisingan Diff
Salah satu alasan praktis untuk menggunakan kawat gigi untuk saluran tunggal adalah untuk mengurangi kebisingan berbeda .
Yaitu, mengubah:
Untuk:
... menyebabkan garis kondisional muncul di dalam diff ketika sedang diubah, ini menambahkan beberapa overhead kecil tetapi tidak perlu.
Karena itu, tidak semua alat mendukung perbedaan berbasis kata, diff (svn, git, hg ... dll) akan menunjukkan seolah-olah seluruh baris berubah, bahkan dengan alat mewah, kadang-kadang Anda mungkin perlu dengan cepat melihat ke garis polos berbasis-diff untuk melihat apa yang berubah.
git blame
) akan menunjukkan baris sebagai sedang diubah, membuat pelacakan asal dari suatu langkah lebih banyak untuk menemukan perubahan nyata .Keduanya kecil, dan tergantung pada berapa banyak waktu yang Anda habiskan dalam tinjauan kode atau pelacakan yang melakukan perubahan baris kode.
Ketidaknyamanan yang lebih nyata karena perubahan garis tambahan dalam diff, kemungkinan kapalnya lebih tinggi bahwa perubahan dalam kode akan menyebabkan konflik yang menggabungkan dan perlu diselesaikan secara manual .
Ada pengecualian untuk ini, untuk basis kode yang memiliki
{
jalurnya sendiri - ini bukan masalah.The diff kebisingan argumen tidak tahan jika Anda menulis dalam gaya ini:
Namun ini bukan konvensi umum, jadi terutama menambahkan jawaban untuk kelengkapan (tidak menyarankan proyek harus menggunakan gaya ini) .
sumber
{
-pada-garis-sendiri. Saya benar-benar benci gaya itu, dan tidak suka mengerjakan proyek-proyek di mana gaya itu diperlukan. Mungkin dengan itu dalam pikiran, saya akan merasa sedikit kurang frustasi harus kode seperti itu. Kepadatan kode itu penting. Jika Anda dapat melihat semua fungsi pada monitor Anda sekaligus, Anda dapat lebih mudah melakukan semuanya. Saya suka meninggalkan garis kosong antara blok kode yang terpisah di dalam fungsi untuk keterbacaan (untuk pernyataan terkait kelompok), dan dipaksa untuk membuang-buang ruang di tempat lain membuat jeda yang dimaksudkan lebih lemah.{
on-line-nya-sendiri, hanya memasukkannya untuk kelengkapan jawaban. Sedangkan untuk mempercayai makro untuk digunakando{}while(0)
, saya menemukan masalah dengan ini adalah Anda dapat mempercayainya hampir setiap saat. Masalahnya adalah kecelakaan bisa terjadi, kesalahan dapat terjadi dengan ulasan kode ... dan bug dapat diperkenalkan yang tidak akan terjadi sebaliknya.Bertahun-tahun yang lalu, saya dibawa untuk men-debug beberapa kode C. Bug itu sangat sulit ditemukan, tetapi akhirnya ia berubah menjadi pernyataan seperti:
Dan ternyata orang yang menulisnya telah didefinisikan
foo
sebagai makro. Makro dengan dua baris kode di dalamnya. Dan tentu saja, hanya yang pertama dari dua baris yang dikenakanif
. (Jadi baris kedua dieksekusi tanpa syarat.)Ini mungkin benar-benar unik untuk C dan preprosesornya - yang melakukan pergantian sebelum kompilasi - tetapi saya tidak pernah melupakannya. Hal semacam itu meninggalkan bekas pada Anda, dan mengapa tidak bermain aman - terutama jika Anda menggunakan berbagai bahasa dan perkakas dan tidak dapat memastikan bahwa kejahatan seperti itu tidak mungkin terjadi di tempat lain?
Sekarang saya inden dan menggunakan kawat gigi secara berbeda dari orang lain, tampaknya. Untuk satu baris
if
, saya akan lakukan:jadi tidak perlu jalur tambahan untuk memasukkan kawat gigi.
sumber
do { ... } while(0)
lingkaran. Ini tidak hanya memastikan bahwa itu akan selalu diperlakukan dengan benar dengan melampirkanif()
pernyataan, tetapi juga bahwa tanda koma di akhir pernyataan ditelan dengan benar. Siapa pun yang tidak tahu tentang aturan sederhana seperti itu, tidak boleh menulis macro preprocessor. Membela di situs panggilan adalah tempat yang salah untuk mempertahankan."Paman Bob" diizinkan untuk memiliki pendapatnya, Anda diizinkan untuk memiliki pendapat Anda. Tidak perlu menantangnya.
Jika Anda ingin banding ke pihak berwenang, ambil Chris Lattner. Di Swift, jika pernyataan kehilangan tanda kurung, tetapi selalu disertai dengan tanda kurung. Tidak ada diskusi, itu bagian dari bahasa. Jadi jika "Paman Bob" mulai menghapus kawat gigi, kode berhenti mengkompilasi.
Memeriksa kode orang lain dan "menyingkirkan kawat gigi yang tidak berguna" adalah kebiasaan buruk. Hanya menyebabkan kerja ekstra ketika kode perlu ditinjau, dan ketika konflik tidak perlu dibuat. Mungkin "Paman Bob" adalah programmer yang sangat baik sehingga dia tidak perlu ulasan kode? Saya menyia-nyiakan satu minggu dalam hidup saya karena seorang programmer terkemuka mengubah "if (p! = NULL)" menjadi "if (! P)" tanpa ulasan kode, disembunyikan di tempat yang paling buruk.
Ini sebagian besar merupakan perdebatan gaya yang tidak berbahaya. Kawat gigi memiliki keuntungan bahwa Anda dapat menyisipkan baris kode lain tanpa menambahkan kawat gigi. Seperti pernyataan logging, atau komentar (jika diikuti oleh komentar diikuti oleh pernyataan hanya mengerikan). pernyataan pada baris yang sama seolah-olah memiliki kelemahan praktis bahwa Anda memiliki masalah dengan banyak debuggers. Tetapi lakukan apa yang Anda inginkan.
sumber
Alasan saya untuk tidak melepas kawat gigi adalah:
mengurangi keputusasaan keputusan. Jika Anda selalu menggunakan kawat gigi, Anda tidak perlu memutuskan apakah Anda akan membutuhkan kawat gigi atau tidak.
mengurangi hambatan pengembangan: bahkan jika Anda berusaha untuk akhirnya mengekstrak semua baris logika untuk metode, harus mengkonversi gelang jika untuk menguatkan jika untuk menambah logika adalah sedikit hambatan pembangunan yang mengganggu. Jadi ada upaya menghapus kawat gigi, dan upaya menambahkannya lagi ketika Anda membutuhkan lebih banyak kode. Mungil, tapi menyebalkan.
sumber
Seorang rekan kerja muda mengatakan bahwa kawat gigi yang kita lihat mubazir dan tidak berguna sebenarnya berguna baginya. Saya tidak ingat persis mengapa, tetapi jika memungkinkan dia untuk menulis kode yang lebih baik lebih cepat, itu saja alasan untuk mempertahankannya.
Fwiw, kami sepakat pada kompromi yang menempatkan mereka pada satu baris tidak membuat prasyarat singkat seperti itu tidak dapat dibaca / mengganggu saya. Misalnya
Saya juga menunjukkan bahwa prasyarat pengantar ini sering merupakan pernyataan aliran kontrol untuk tubuh (misalnya a
return
) sehingga rasa takut untuk menambahkan pernyataan kedua yang dimaksudkan berada di bawah kondisi yang sama dan lupa untuk menulis kawat gigi sedang diperdebatkan. Pernyataan kedua dalam kondisi ini akan menjadi kode mati dan tidak masuk akal.Saya menduga bahwa kelancaran dalam masalah membaca disebabkan oleh parser otak seseorang yang ditransfer untuk memiliki kawat gigi sebagai bagian dari pernyataan kondisional. Itu bukan representasi akurat dari tata bahasa C ++, tetapi bisa menjadi efek samping dari belajar bahasa lain tertentu terlebih dahulu, di mana itu terjadi.
sumber
Setelah menonton video itu sekarang, saya perhatikan bahwa menghilangkan kawat gigi membuatnya lebih mudah untuk melihat di mana kode masih perlu di refactored. Jika Anda membutuhkan kawat gigi, kode Anda mungkin bisa sedikit lebih bersih.
Karena itu, ketika Anda berada di tim, menghilangkan kawat gigi mungkin akan menyebabkan perilaku yang tidak terduga suatu hari nanti. Saya katakan menjaga mereka, dan Anda akan menyelamatkan diri Anda dari banyak sakit kepala ketika terjadi kesalahan.
sumber
Jika kode Anda diuji unit dengan baik , "bug" semacam ini akan meledak di wajah.
Membersihkan kode dengan menghindari tanda kurung yang tidak berguna dan jelek adalah praktik yang saya ikuti.
sumber