Saya menghadiri acara pengerjaan perangkat lunak beberapa minggu yang lalu dan salah satu komentar yang dibuat adalah "Saya yakin kita semua mengenali kode buruk ketika kita melihatnya" dan semua orang mengangguk dengan bijak tanpa diskusi lebih lanjut.
Hal semacam ini selalu membuat saya khawatir karena ada disangkal bahwa semua orang berpikir mereka adalah pengemudi di atas rata-rata. Meskipun saya pikir saya bisa mengenali kode buruk, saya ingin belajar lebih banyak tentang apa yang orang lain anggap sebagai kode bau karena jarang dibahas secara rinci di blog orang dan hanya di segelintir buku. Khususnya saya pikir akan menarik untuk mendengar tentang apa pun yang merupakan bau kode dalam satu bahasa tetapi bukan yang lain.
Saya akan mulai dengan yang mudah:
Kode dalam kontrol sumber yang memiliki proporsi tinggi kode komentar - mengapa ada di sana? apakah itu dimaksudkan untuk dihapus? Apakah itu pekerjaan setengah jadi? mungkin itu seharusnya tidak dikomentari dan hanya dilakukan ketika seseorang sedang menguji sesuatu? Secara pribadi saya menemukan hal semacam ini sangat mengganggu bahkan jika itu hanya garis aneh di sana-sini, tetapi ketika Anda melihat blok besar diselingi dengan sisa kode itu benar-benar tidak dapat diterima. Ini juga biasanya merupakan indikasi bahwa sisa kode kemungkinan memiliki kualitas yang meragukan juga.
sumber
printf("%c", 7)
biasanya membunyikan bel alarm untuk saya. ;)Jawaban:
Biasanya ditemukan di dalam
try..catch
blok omong kosong , itu cenderung menarik perhatian saya. Hampir sama baiknya/* Not sure what this does, but removing it breaks the build */
.Beberapa hal lagi:
if
pernyataan kompleks bersarangprocess
,data
,change
,rework
,modify
Yang baru saya temukan:
Benar, karena harus memaksa koneksi MySQL Anda adalah cara yang tepat untuk melakukan sesuatu. Ternyata database itu mengalami masalah dengan jumlah koneksi sehingga mereka terus waktu. Alih-alih men-debug ini, mereka hanya mencoba lagi dan lagi sampai berhasil.
sumber
Bendera merah utama bagi saya adalah blok kode duplikat, karena itu menunjukkan bahwa orang tersebut tidak memahami dasar-dasar pemrograman atau terlalu takut untuk membuat perubahan yang tepat ke basis kode yang ada.
Saya dulu juga menghitung kurangnya komentar sebagai bendera merah, tetapi setelah baru-baru ini bekerja pada banyak kode yang sangat baik tanpa komentar saya sudah mereda kembali pada itu.
sumber
Kode yang mencoba menunjukkan betapa pandai programmer adalah, terlepas dari kenyataan bahwa itu tidak menambah nilai nyata:
sumber
swap(x, y);
^_^
20.000 fungsi garis (berlebihan). Setiap fungsi yang membutuhkan lebih dari beberapa layar perlu di-factoring ulang.
Sepanjang baris yang sama, file kelas yang sepertinya berlangsung selamanya. Mungkin ada beberapa konsep yang dapat diabstraksi menjadi kelas-kelas yang akan menjernihkan tujuan dan fungsi kelas asli, dan mungkin di mana ia digunakan, kecuali mereka semua adalah metode internal.
variabel non-deskriptif, non-trivial, atau terlalu banyak variabel non-deskriptif sepele. Ini membuat menyimpulkan apa yang sebenarnya terjadi teka-teki.
sumber
Yang lebih parah adalah itu dari perpustakaan komersial!
sumber
Komentar yang sangat verbose bahwa jika ada kompiler bahasa Inggris, itu akan mengkompilasi dan berjalan dengan sempurna, namun tidak menggambarkan apa pun yang kode tidak.
Juga, komentar pada kode yang bisa dihapuskan seandainya kode tersebut mematuhi beberapa pedoman dasar:
sumber
/
dari yang*/
hilang, sehingga semua kode ke akhir selanjutnya*/
diabaikan. Untungnya, penyorotan sintaksis membuat hal semacam itu jarang terjadi akhir-akhir ini.a
untuk user_age? Benarkah?i = i + 1; //increment i
Kode yang menghasilkan peringatan saat dikompilasi.
sumber
(unsigned int)
daripada mengacaukan daftar peringatan / kesalahan saya dengan peringatan yang tidak berbahaya. Aku benci daftar peringatan menjadi titik buta. Ini juga jauh lebih dari PITA menjelaskan kepada orang lain mengapa Anda mengabaikan peringatan daripada untuk menjelaskan mengapa Anda melakukan cast alamiints
untukunsigned ints
.Berfungsi dengan angka dalam nama alih-alih memiliki nama deskriptif , seperti:
Tolong, buat nama fungsi berarti sesuatu! Jika doSomething dan doSomething2 melakukan hal serupa, gunakan nama fungsi yang membedakan perbedaan. Jika doSomething2 adalah pelarian fungsionalitas dari doSomething, beri nama untuk fungsionalitasnya.
sumber
mshtml
- mataku hancur :(Angka Ajaib atau String Ajaib.
sumber
200
sisi lain ...Mungkin bukan yang terburuk tetapi jelas menunjukkan tingkat pelaksana:
Jika suatu bahasa memiliki for for atau iterator construct, maka menggunakan while sementara juga menunjukkan tingkat pemahaman pelaksana bahasa:
Ejaan / tata bahasa yang buruk dalam dokumentasi / komentar memakan saya hampir sebanyak kode itu sendiri. Alasan untuk ini adalah karena kode dimaksudkan untuk dibaca manusia dan mesin dijalankan. Inilah sebabnya kami menggunakan bahasa tingkat tinggi, jika dokumentasi Anda sulit untuk menembusnya membuat saya lebih dulu membentuk opini negatif tentang basis kode tanpa melihatnya.
sumber
Yang saya perhatikan segera adalah frekuensi blok kode yang sangat bersarang (jika, sementara, dll). Jika kode sering lebih dari dua atau tiga level, itu pertanda masalah desain / logika. Dan jika kedalamannya mencapai 8 sarang, lebih baik ada alasan kuat untuk tidak putus.
sumber
return
pernyataan, tetapi ketika itu menyebabkan tingkat 6 + jika bersarang saya pikir itu melakukan jauh lebih berbahaya daripada yang baik.Saat menilai program siswa, kadang-kadang aku bisa mengatakannya dengan gaya "blink". Ini adalah petunjuk instan:
Jarang kesan pertama saya salah, dan lonceng peringatan ini benar sekitar 95% . Untuk satu pengecualian, seorang siswa baru ke bahasa itu menggunakan gaya dari bahasa pemrograman yang berbeda. Menggali dan membaca ulang gaya mereka dalam idiom bahasa lain menghilangkan bel alarm untuk saya, dan siswa kemudian mendapat pujian penuh. Tetapi pengecualian seperti itu jarang terjadi.
Saat mempertimbangkan kode lebih lanjut, ini adalah peringatan saya yang lain:
Dalam hal gaya, saya biasanya tidak suka melihat:
Ini hanya petunjuk kode yang buruk. Kadang-kadang apa yang tampak seperti kode buruk sebenarnya tidak, karena Anda tidak tahu niat programmer. Misalnya, mungkin ada alasan bagus bahwa sesuatu tampak terlalu rumit - mungkin ada pertimbangan lain yang berperan.
sumber
Favorit pribadi / kesayangan hewan peliharaan: Nama yang dihasilkan IDE yang dapat dikirim. Jika TextBox1 adalah variabel utama dan penting dalam sistem Anda, Anda punya hal lain yang datang ulasan kode.
sumber
Variabel yang sama sekali tidak digunakan , terutama ketika variabel tersebut memiliki nama yang mirip dengan nama variabel yang digunakan.
sumber
Banyak orang menyebutkan:
Sementara saya berharap hal-hal itu dilaksanakan, setidaknya mereka membuat catatan. Yang saya pikir lebih buruk adalah:
Todo tidak berharga dan membingungkan jika Anda tidak pernah repot-repot menghapusnya!
sumber
//TODO
komentar? Luar biasa!// TODO
, gunakan pelacak bug Anda, untuk itulah!Metode yang mengharuskan saya untuk menggulir ke bawah untuk membaca semuanya.
sumber
Konjungsi dalam nama metode:
Klarifikasi: Alasan mengapa alarm berbunyi adalah karena ini mengindikasikan metode yang kemungkinan melanggar prinsip tanggung jawab tunggal .
sumber
addEmployee(); updatePayrate();
), maka saya tidak berpikir itu masalah.Menghubungkan kode sumber yang jelas GPL ke dalam program komersial, sumber tertutup.
Tidak hanya membuat masalah hukum langsung, tetapi dalam pengalaman saya, biasanya menunjukkan baik kecerobohan atau tidak peduli yang tercermin di tempat lain dalam kode juga.
sumber
Bahasa agnostik:
TODO: not implemented
int function(...) { return -1; }
(sama dengan "tidak diterapkan")0
,-1
ataunull
sebagai nilai pengembalian yang luar biasa.Khusus bahasa (C ++):
array new
yang tampaknya tidak aman RAII.printf
.Khusus Microsoft C ++:
Khusus C ++ / OOP:
sumber
Gaya lekukan yang aneh.
Ada beberapa gaya yang sangat populer, dan orang-orang akan membawa perdebatan itu ke kubur. Tetapi kadang-kadang saya melihat seseorang menggunakan gaya lekukan yang benar-benar langka, atau bahkan buatan sendiri. Ini adalah tanda bahwa mereka mungkin belum mengkodekan dengan orang lain selain diri mereka sendiri.
sumber
Menggunakan banyak blok teks daripada enum atau variabel yang didefinisikan secara global.
Tidak baik:
Lebih baik:
Terbaik:
sumber
Parameter yang diketik dengan lemah atau mengembalikan nilai pada metode.
sumber
if...else
blok, itu menjadiif...else if...[...]...else
blok$lesseeloginaccountservice
if
Pernyataan yang terlalu rumit . Contoh dari kode:if (!($lessee_obj instanceof Lessee && $lessee_obj != NULL))
yang saya gunakan untuk chompedif ($lessee_obj == null)
sumber
Kode bau: tidak mengikuti praktik terbaik
Inilah kilasan berita untuk Anda: 50% dari populasi dunia di bawah rata-rata intelijen. Ok, jadi beberapa orang akan memiliki kecerdasan rata-rata, tapi jangan pilih-pilih Juga, salah satu sisi yang mempengaruhi kebodohan adalah Anda tidak bisa mengenali kebodohan Anda sendiri! Hal-hal tidak terlihat begitu baik jika Anda menggabungkan pernyataan ini.
Banyak hal baik telah disebutkan, dan secara umum tampaknya tidak mengikuti praktik terbaik adalah bau kode.
Praktik terbaik biasanya tidak ditemukan secara acak, dan sering ada karena suatu alasan. Sering kali itu bisa subjektif, tetapi dalam pengalaman saya kebanyakan dibenarkan. Mengikuti praktik terbaik seharusnya tidak menjadi masalah, dan jika Anda bertanya-tanya mengapa hal itu terjadi, teliti daripada mengabaikan dan / atau mengeluh tentang hal itu - mungkin itu dibenarkan, mungkin tidak.
Salah satu contoh praktik terbaik mungkin menggunakan ikal dengan setiap blok jika, meskipun hanya berisi satu baris:
Anda mungkin tidak berpikir itu perlu, tetapi saya baru-baru ini membaca bahwa itu adalah sumber utama bug. Selalu menggunakan tanda kurung juga telah dibahas pada Stack Overflow , dan memeriksa bahwa jika pernyataan memiliki tanda kurung juga merupakan aturan dalam PMD , penganalisa kode statis untuk Java.
Ingat: "Karena ini praktik terbaik" tidak pernah merupakan jawaban yang dapat diterima untuk pertanyaan "mengapa Anda melakukan ini?" Jika Anda tidak dapat mengartikulasikan mengapa sesuatu itu praktik terbaik, maka itu bukan praktik terbaik, itu takhayul.
sumber
Komentar yang mengatakan "ini karena desain dari subsistem froz benar-benar borked."
Itu berlangsung lebih dari satu paragraf penuh.
Mereka menjelaskan bahwa refactor berikut perlu terjadi.
Tetapi tidak melakukannya.
Sekarang, mereka mungkin telah diberitahu bahwa mereka tidak dapat mengubahnya oleh bos mereka pada saat itu, karena masalah waktu atau kompetensi, tetapi mungkin itu karena orang-orang yang picik.
Jika seorang penyelia berpikir j.random itu. Programmer tidak dapat melakukan refactoring, maka supervisor harus melakukannya.
Bagaimanapun ini terjadi, saya tahu kode ini ditulis oleh tim yang terbagi, dengan kemungkinan politik kekuasaan, dan mereka tidak memperbaiki desain subsistem yang tidak jelas.
Kisah nyata. Itu bisa saja terjadi padamu.
sumber
Adakah yang bisa memikirkan contoh di mana kode harus secara sah merujuk ke file dengan jalur absolut?
sumber
/dev/null
dan teman baik-baik saja. Tetapi bahkan hal-hal seperti/bin/bash
itu dicurigai - bagaimana jika Anda salah satu sistem kooky yang dimiliki/usr/bin/bash
?/home/tom/dev/randomhacking/thing.wsdl
. Hal ini kriminal gila bahwa ini adalah perilaku default./dev/null
: Saya punya kebiasaan, ketika mengembangkan di windows untuk menjaga aplikasi dan libs di bawahc:\dev
. Entah bagaimana, foldernull
selalu dibuat secara otomatis di dalam folder itu. Aku bersumpah aku tidak tahu siapa yang melakukan itu. (Salah satu bug / fitur favorit saya)Menangkap pengecualian umum:
atau
Wilayah terlalu sering digunakan
Biasanya, menggunakan terlalu banyak daerah menunjukkan kepada saya bahwa kelas Anda terlalu besar. Ini adalah bendera peringatan yang menandakan bahwa saya harus menyelidiki lebih dalam sedikit kode itu.
sumber
Konvensi penamaan kelas yang menunjukkan pemahaman yang buruk tentang abstraksi yang mereka coba ciptakan. Atau itu sama sekali tidak mendefinisikan abstraksi.
Sebuah contoh ekstrem muncul di benak saya di kelas VB yang pernah saya lihat yang diberi judul
Data
dan panjangnya 30.000+ ... di file pertama . Itu adalah sebagian kelas yang dibagi menjadi setidaknya setengah lusin file lainnya. Sebagian besar metode adalah pembungkus di sekitar procs yang disimpan dengan nama sepertiFindXByYWithZ()
.Bahkan dengan contoh-contoh yang kurang dramatis, saya yakin kita semua baru saja 'membuang' logika ke kelas yang kurang dipahami, memberinya gelar yang sepenuhnya generik, dan kemudian menyesalinya.
sumber
Fungsi yang menerapkan kembali fungsionalitas dasar bahasa. Misalnya, jika Anda pernah melihat metode "getStringLength ()" dalam JavaScript alih-alih panggilan ke properti ".length" dari string, Anda tahu Anda dalam masalah.
sumber
Tentu saja tanpa jenis dokumentasi dan bersarang sesekali
#define
ssumber