it-swarm-id.com

Hal-hal mana yang langsung membunyikan bel alarm ketika melihat kode?

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 dapat 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? apakah itu dimaksudkan untuk dihapus? Apakah ini pekerjaan setengah jadi? mungkin itu seharusnya tidak dikomentari dan hanya dilakukan ketika seseorang sedang menguji sesuatu? Secara pribadi saya menemukan hal semacam ini benar-benar menjengkelkan bahkan jika itu hanya garis aneh di sana-sini, tetapi ketika Anda melihat blok besar diselingi dengan sisa kode itu sama sekali tidak dapat diterima. Ini juga biasanya merupakan indikasi bahwa sisa kode kemungkinan memiliki kualitas yang meragukan juga.

98
FinnNk
/* Fuck this error */

Biasanya ditemukan di dalam omong kosong try..catch blok, itu cenderung menarik perhatianku. Hampir juga /* Not sure what this does, but removing it breaks the build */.

Beberapa hal lagi:

  • Berbagai pernyataan if kompleks yang bersarang
  • Blok coba-tangkap yang digunakan untuk menentukan aliran logika secara teratur
  • Fungsi dengan nama generik process, data, change, rework, modify
  • Enam atau tujuh gaya penahan yang berbeda dalam 100 baris

Yang baru saya temukan:

/* Stupid database */
$conn = null;
while(!$conn) {
    $conn = mysql_connect("localhost", "root", "[pass removed]");
}
/* Finally! */
echo("Connected successfully.");

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.

128
Josh K

Bendera merah utama bagi saya adalah blok kode duplikat, karena itu menunjukkan bahwa orang tersebut tidak mengerti 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 telah mereda kembali pada itu.

104
Ben Hughes

Kode yang mencoba menunjukkan betapa pandai programmer adalah, terlepas dari kenyataan bahwa itu tidak menambah nilai nyata:

x ^= y ^= x ^= y;
74
Rei Miyasaka
  • 20.000 (garis besar) fungsi garis. Setiap fungsi yang membutuhkan lebih dari beberapa layar perlu di-factoring ulang.

  • Sepanjang baris yang sama, file kelas yang tampaknya 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.

62
{ Let it Leak, people have good enough computers to cope these days }

Apa yang lebih buruk adalah itu dari perpustakaan komersial!

61
Reallyethical

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.

//Copy the value of y to temp.
temp = y;
//Copy the value of x to y.
y = x;
//Copy the value of temp to x.
x = temp;

Juga, komentar pada kode yang bisa dihapuskan seandainya kode dipatuhi beberapa pedoman dasar:

//Set the age of the user to 13.
a = 13;
53
Rei Miyasaka

Kode yang menghasilkan peringatan saat dikompilasi.

42
Rei Miyasaka

Fungsi dengan angka dalam nama alih-alih memiliki nama deskriptif, seperti:

void doSomething()
{
}

void doSomething2()
{
}

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.

36
Wonko the Sane

Angka Ajaib atau String Ajaib.

   if (accountBalance>200) { sendInvoice(...); }

   salesPrice *= 0.9;   //apply discount    

   if (invoiceStatus=="Overdue") { reportToCreditAgency(); }
36
JohnFx
  • Mungkin bukan yang terburuk tetapi jelas menunjukkan tingkat pelaksana:

    if(something == true) 
    
  • Jika suatu bahasa memiliki for for atau iterator construct, maka menggunakan while sementara juga menunjukkan tingkat pemahaman pelaksana bahasa:

    count = 0; 
    while(count < items.size()){
       do stuff
       count ++; 
    }
    
    for(i = 0; i < items.size(); i++){
      do stuff 
    }
    //Sure this is not terrible but use the language the way it was meant to be used.
    
  • 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.

36
Chris

Yang saya perhatikan segera adalah frekuensi blok kode sangat bersarang (if's, while's, dll). Jika kode sering masuk lebih dari dua atau tiga level, itulah pertanda masalah desain/logika. Dan jika kedalamannya seperti 8 sarang, lebih baik ada alasan bagus untuk tidak putus.

29
GrandmasterB

Saat menilai program siswa, kadang-kadang aku bisa mengatakannya dengan gaya "blink". Ini adalah petunjuk instan:

  • Pemformatan buruk atau tidak konsisten
  • Lebih dari dua baris kosong berturut-turut
  • Konvensi pemberian nama yang tidak standar atau tidak konsisten
  • Kode berulang, semakin kata demi kata berulang, semakin kuat peringatan
  • Apa yang seharusnya menjadi potongan kode sederhana terlalu rumit (misalnya, memeriksa argumen yang diteruskan ke utama dengan cara yang berbelit-belit)

Jarang kesan pertama saya salah, dan lonceng peringatan ini benar --- 95% dari wakt. Untuk satu pengecualian, seorang siswa baru ke bahasa itu menggunakan gaya dari bahasa pemrograman yang berbeda. Menggali dan membaca kembali 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:

  • Kehadiran banyak Java kelas yang hanya "struct" untuk menyimpan data. Tidak masalah jika bidang bersifat publik atau pribadi dan menggunakan getter/setter, itu masih mungkin bukan bagian dari desain yang dipikirkan dengan matang.
  • Kelas yang memiliki nama yang buruk, seperti hanya menjadi namespace dan tidak ada kohesi yang nyata dalam kode
  • Referensi pola desain yang bahkan tidak digunakan dalam kode
  • Penangan pengecualian kosong tanpa penjelasan
  • Ketika saya menarik kode di Eclipse, ratusan "peringatan" garis kuning kode, sebagian besar karena impor yang tidak terpakai atau variabel

Dalam hal gaya, saya biasanya tidak suka melihat:

  • Komentar Javadoc yang hanya mengulangi kode

Ini adalah hanya petunjuk ke 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.

28
Macneil

Personal peeve favorit/peliharaan: IDE nama-nama yang dihasilkan dikomit. Jika TextBox1 adalah variabel utama dan penting dalam sistem Anda, Anda akan mendapat ulasan kode kode yang akan datang.

25
Wyatt Barnett

Variabel yang sama sekali tidak digunakan, terutama ketika variabel memiliki nama yang mirip dengan nama variabel yang digunakan.

25
C. Ross

Banyak orang menyebutkan:

//TODO: [something not implemented]

Sementara saya berharap hal itu diterapkan, setidaknya mereka membuat catatan. Yang saya pikir lebih buruk adalah:

//TODO: [something that is already implemented]

Todo tidak berharga dan membingungkan jika Anda tidak pernah repot-repot menghapusnya!

21
Morgan Herlocker

Konjungsi dalam nama metode:

public void addEmployeeAndUpdatePayrate(...) 


public int getSalaryOrHourlyPay(int Employee) ....

Klarifikasi: Alasan mengapa alarm berbunyi adalah karena ini mengindikasikan metode yang kemungkinan melanggar prinsip tanggung jawab tunggal .

20
JohnFx

Metode yang mengharuskan saya untuk menggulir ke bawah untuk membaca semuanya.

20
BradB

Menghubungkan kode sumber GPL dengan 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.

13
Bob Murphy

Bahasa agnostik:

  • TODO: not implemented
  • int function(...) { return -1; } (sama dengan "tidak diterapkan")
  • Melempar pengecualian karena alasan yang tidak biasa.
  • Penyalahgunaan atau penggunaan 0 Yang tidak konsisten, -1 Atau null sebagai nilai pengembalian yang luar biasa.
  • Pernyataan tanpa komentar meyakinkan yang mengatakan mengapa itu tidak boleh gagal.

Khusus bahasa (C++):

  • C++ Macro dalam huruf kecil.
  • Variabel C++ Statis atau Global.
  • Variabel tidak diinisialisasi atau tidak digunakan.
  • Setiap array new Yang tampaknya tidak aman untuk RAII.
  • Setiap penggunaan array atau pointer yang tampaknya tidak aman-batas. Ini termasuk printf.
  • Setiap penggunaan bagian array yang tidak diinisialisasi.

khusus Microsoft C++:

  • Setiap nama pengidentifikasi yang berbenturan dengan makro sudah ditentukan oleh salah satu file header Microsoft SDK.
  • Secara umum, setiap penggunaan Win32 API adalah sumber besar lonceng alarm. Selalu minta MSDN terbuka, dan cari argumen/definisi kembali nilai setiap kali ragu. (Diedit)

khusus C++/OOP:

  • Warisan implementasi (kelas konkret) di mana kelas induk memiliki metode virtual dan non-virtual, tanpa perbedaan konseptual yang jelas antara apa yang seharusnya/tidak boleh virtual.
9
rwong

Menggunakan banyak blok teks daripada enum atau variabel yang didefinisikan secara global.

Tidak baik:

if (itemType == "Student") { ... }

Lebih baik:

private enum itemTypeEnum {
  Student,
  Teacher
}
if (itemType == itemTypeEnum.Student.ToString()) { ... }

Terbaik:

private itemTypeEnum itemType;
...
if (itemType == itemTypeEnum.Student) { ... }
8
Yaakov Ellis

gaya indentasi yang aneh.

Ada beberapa gaya yang sangat populer, dan orang-orang akan membawa debat itu ke Makam. 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.

8
Ken

Parameter yang diketik dengan lemah atau mengembalikan nilai pada metode.

public DataTable GetEmployees() {...}

public DateTime getHireDate(DataTable EmployeeInfo) {...}

public void FireEmployee(Object EmployeeObjectOrEmployeeID) {...}
8
JohnFx

Kode bau: tidak mengikuti praktik terbaik

Hal semacam ini selalu membuat saya khawatir karena ada disangkal bahwa semua orang berpikir mereka adalah pengemudi di atas rata-rata.

Inilah kilasan berita untuk Anda: 50% 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.

Hal-hal mana yang langsung membunyikan bel alarm ketika melihat kode?

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 mereka seperti itu, 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, bahkan jika hanya berisi satu baris:

if (something) {
    // whatever
}

Anda mungkin tidak berpikir itu perlu, tetapi saya baru-baru ini baca bahwa itu adalah sumber utama bug. Selalu menggunakan tanda kurung juga telah dibahas di Stack Overflow , dan memeriksa apakah-pernyataan memiliki tanda kurung juga --- aturan di 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.

7
Vetle
  • Beberapa operator ternary dirangkai, jadi alih-alih menyerupai blok if...else, Itu menjadi blok if...else if...[...]...else
  • Nama variabel panjang tanpa garis bawah atau CamelCasing. Contoh dari beberapa kode yang saya ambil: $lesseeloginaccountservice
  • Ratusan baris kode dalam file, dengan sedikit atau tidak ada komentar, dan kode menjadi sangat tidak jelas
  • Pernyataan if terlalu rumit. Contoh dari kode: if (!($lessee_obj instanceof Lessee && $lessee_obj != NULL)) yang saya chomped ke if ($lessee_obj == null)
7
Tarka

Menangkap pengecualian umum:

try {

 ...

} catch {
}

atau

try {

 ...

} catch (Exception ex) {
}

Penggunaan berlebihan wilayah

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.

6
Erik van Brakel

Adakah yang bisa memikirkan contoh di mana kode harus secara sah merujuk ke file dengan jalur absolut?

6
Rei Miyasaka

Komentar yang mengatakan "ini karena desain 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 itu 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.

6
Tim Williscroft
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...

Tentu saja tanpa jenis dokumentasi dan sesekali #defines

5
Sven

Kode C++ dengan pernyataan hapus yang eksplisit (kecuali saya sedang melihat jeroan implementasi smart pointer). 'delete' adalah 'goto' manajemen memori IMHO .

Terkait erat dengan ini, kode seperti:

// Caller must take ownership
Thing* Foo::Bar()

(Dan anggaplah diri Anda beruntung jika ada komentar!). Ini tidak seperti petunjuk pintar adalah ilmu roket. std::auto_ptr dibuat untuk hal semacam ini (mendokumentasikan dan menegakkan maksud yang diungkapkan dalam komentar) dan menjadi bagian dari standar = untuk usia sekarang.

Bersama-sama teriakan kode warisan yang tidak dicintai ini, atau pengelola dengan pola pikir yang terjebak di suatu tempat di awal tahun 90-an.

5
timday

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.

5
Ant

Konvensi penamaan kelas yang menunjukkan pemahaman yang buruk tentang abstraksi yang mereka coba ciptakan. Atau itu tidak mendefinisikan abstraksi sama sekali.

Contoh ekstrem muncul di kelas VB saya pernah melihat yang berjudul Data dan panjangnya 30.000+ baris ... di pertama Ini adalah kelas parsial dibagi menjadi setidaknya setengah lusin file lainnya. Sebagian besar metode adalah pembungkus procs disimpan dengan nama-nama seperti FindXByYWithZ().

Bahkan dengan contoh-contoh yang kurang dramatis, saya yakin kita semua baru saja 'membuang' logika ke kelas yang kurang dipahami, memberinya judul yang sepenuhnya generik, dan kemudian menyesalinya.

5
Bryan M.
ON ERROR RESUME NEXT

Harus mempertahankan Classic ASP aplikasi sayangnya suatu keharusan bagi sebagian besar pengembang ASP.NET, tetapi membuka file include umum dan melihat bahwa pada baris pertama menghancurkan jiwa.

4
richeym

Ketika tidak ada komentar atau dokumentasi apa pun yang dilakukan atau seharusnya dilakukan kode (mis. "Kode adalah dokumentasi").

Metode atau variabel dengan angka sebagai suffix (mis. Login2 ()).

4
leson
try
{
//do something
}
catch{}
3
Tom Squires

Kode yang tidak pernah bisa, secara logis memasuki jalur eksekusi.

var product = repository.FindProduct(id);

log.Info("Found product " + product.Name);

if (product != null)
{
    // This will always happen
}
else
{
    // **This won't ever happen**
}

atau

if (messages.Count > 0)
{
    // Do stuff with messages
}
else if (messages.Count == 1)
{
    // **I hope this code isn't important...**
}
3
rmac
  • Menempatkan setiap variabel lokal di baris feew pertama dari blok metode. Terutama dalam hubungannya dengan metode panjang.
  • Menggunakan variabel boolean untuk keluar dari loop/melewati iterasi bukan hanya menggunakan break/melanjutkan
3
Oliver Weiler

Dari perspektif Java-centric saya:

  • Gaya pengkodean non-standar.
  • Variabel non-pribadi.
  • Tidak ada final pada bidang.
  • Tidak ada gunanya atau terlalu sering menggunakan warisan.
  • Kelas besar atau blok kode.
  • Terlalu banyak komentar (mereka mungkin hanya angan-angan saja).
  • Logging tidak terstruktur.
  • Getters and setters (antarmuka harus tentang perilaku).
  • Data duplikat.
  • Ketergantungan yang aneh.
  • Statika, termasuk thread-global.
  • Untuk kode multi-utas, bagian dari kelas yang sama yang diharapkan dijalankan di utas berbeda (terutama kode GUI).
  • Kode mati.
  • Manipulasi string bercampur dengan kode lain.
  • Umumnya mencampur lapisan (hal-hal tingkat yang lebih tinggi, dikombinasikan dengan iterasi pada array primitif atau penanganan benang, katakanlah).
  • Setiap penggunaan refleksi.
  • catch blok tanpa kode yang berguna (buruk: komentar, printf, masuk atau hanya kosong).
3

Menggunakan objek tersembunyi di antarmuka pengguna (mis., Kotak teks) untuk menyimpan nilai alih-alih mendefinisikan variabel dengan cakupan yang tepat dan -typed.

2
MartW

Setiap kali saya membaca yang berikut ini:

//Don't put in negative numbers or it will crash the program.

Atau yang serupa. Jika itu yang terjadi, maka nyatakan! Biarkan debugger tahu bahwa selama run-time Anda tidak ingin nilai-nilai itu dan pastikan kode merinci kontrak dengan pemanggil.

2
wheaties

Jenis kode ini:

        if (pflayerdef.DefinitionExpression == "NM_FIELD = '  '" || One.Two.nmEA == "" || 
            One.Two.nmEA == " " || One.Two.nmEA == null ||
            One.Two.nmEA == "  ")
        {                
            MessageBox.Show("BAD CODE");
            return;
        }

Ini dari basis kode produksi langsung nyata!

2
George Silva

Adapun angka ajaib: mereka buruk jika digunakan di tempat yang berbeda dan mengubahnya mengharuskan Anda untuk menyinkronkannya di beberapa tempat. Tetapi satu angka di satu tempat tidak lebih buruk daripada memiliki satu konstanta untuk menunjukkan satu angka yang masih digunakan di satu tempat.

Selain itu, konstanta mungkin tidak memiliki banyak tempat dalam aplikasi Anda. Di banyak aplikasi basis data, hal-hal itu harus disimpan dalam basis data sesuai aplikasi atau per pengaturan pengguna. Dan untuk menyelesaikan implementasi mereka melibatkan pengaturan ini dan tempat di ui dan catatan dalam dokumentasi pengguna akhir ... yang semuanya adalah semacam rekayasa dan pemborosan sumber daya jika semua orang benar-benar bahagia ketika jumlahnya 5 ( dan 5 itu.)

Saya pikir Anda dapat meninggalkan angka dan string di tempatnya sampai ada kebutuhan untuk menggunakan nomor ini di luar tempat itu. Maka sudah saatnya untuk memperbaiki hal-hal untuk desain yang lebih fleksibel.

Adapun string ... Saya tahu argumen, tapi ini adalah satu tempat lagi tidak ada gunanya melakukan konversi satu-string-ke-satu-konstan. Terutama jika string di tempat berasal dari implementasi yang konstan pula (misalnya, impor yang dihasilkan dari aplikasi luar, dan memiliki status-string yang pendek dan dapat dikenali, seperti 'Terlambat'.) Hanya saja tidak ada banyak gunanya mengonversi 'Tunggakan' ke STATUS_OVERDUE saat digunakan di satu tempat saja.

Saya sangat ingin tidak menambah kerumitan jika itu tidak benar-benar membuat manfaat yang diperlukan pada fleksibilitas, penggunaan kembali atau pengecekan kesalahan. Ketika Anda membutuhkan fleksibilitas, kode itu dengan benar (refactor thingy). Tetapi jika itu tidak diperlukan ...

2
Inca

Kode yang digabungkan secara ketat. Terutama ketika Anda melihat banyak hal yang dikodekan (nama printer jaringan, alamat ip, dll.) Di tengah kode. Ini harus dalam file konfigurasi atau bahkan konstanta, tetapi berikut ini hanya akan menyebabkan masalah pada akhirnya:

if (Host_ip == '192.168.1.5'){
   printer = '192.168.1.123';
} else
  printer = 'prntrBob';

Suatu hari, Bob akan berhenti dan printernya akan diganti namanya. Suatu hari printer akan mendapatkan alamat IP baru. Suatu hari 192.168.1.5 akan ingin mencetak pada printer Bob.

mantra favorit saya: selalu menulis kode seperti psikopat pembunuh yang tahu di mana Anda tinggal harus mempertahankannya!

2
davidhaskins

Kode yang menunjukkan bahwa programmer tidak pernah beradaptasi, bertahun-tahun yang lalu, untuk Java 5:

  • Gunakan Iterator alih-alih “untuk masing-masing”
  • Tidak menggunakan generik dalam koleksi, dan casting objek yang diambil ke tipe yang diharapkan
  • Menggunakan kelas kuno seperti Vector dan Hashtable

Tidak tahu cara multithreaded modern.

2
Dave Briccetti

Untuk SQL:

Indikator besar pertama adalah penggunaan gabungan tersirat.

Berikutnya adalah penggunaan gabungan kiri di tableB dikombinasikan dengan klausa WHERE seperti:

WHERE TableB.myField = 'test'

Jika Anda tidak tahu itu akan memberikan hasil yang salah maka saya tidak bisa percaya bahwa setiap kueri yang Anda tulis akan memberikan hasil yang benar.

2
HLGEM

Kode VB6 lawas kami, Anda dapat membuka halaman Modul atau formulir apa saja dan menemukan layar yang penuh dengan variabel Publik atau Global # & @ ! Yang dideklarasikan di atas, direferensikan dari seluruh @ &!! (*! # program. ARGH !!!!

(Wah, aku harus mengeluarkannya :-))

2
HardCode

Sesuatu seperti ini

x.y.z.a[b].c

Baunya seperti bio-hazard. Referensi anggota sebanyak ini tidak pernah merupakan pertanda baik. Dan ya ini adalah ungkapan khas dalam kode yang saya gunakan.

2
Gaurav

apapun dengan sesuatu seperti ini

// TODO: anything could be here!

Edit: Saya harus memenuhi syarat bahwa saya maksudkan ini dalam kode produksi. Tetapi bahkan dalam kode yang berkomitmen untuk kontrol sumber ini masih tidak baik. Tapi, itu bisa menjadi hal pribadi karena saya ingin menyelesaikan hari libur setelah mengikat semua tujuan saya :)

Sunting 2: Saya harus lebih lanjut memenuhi syarat yang saya maksud ketika saya melihat ini dalam kode yang ditetapkan. Seperti sesuatu yang berumur beberapa tahun dan saya memperbaiki bug itu. Saya melihat TODO dan saat itulah alarm berbunyi. TODO (bagi saya) menyiratkan bahwa kode tidak pernah selesai karena suatu alasan.

2
Antony Scott

Penggunaan kata kunci synchronized di Jawa.

Bukan berarti ada yang salah dengan menggunakan synchronized saat digunakan dengan benar. Tetapi dalam kode yang saya gunakan, sepertinya setiap kali seseorang mencoba menulis kode threadsafe, mereka salah. Jadi saya tahu bahwa jika saya melihat kata kunci ini, saya harus ekstra hati-hati tentang sisa kode ...

1
Guillaume

Optimalisasi lubang pada kode yang dapat dioptimalkan dengan struktur yang lebih baik, mis. pencarian linier diimplementasikan dalam Majelis inline ketika pencarian biner di C/C++/Java/C # biasa akan sesuai (dan lebih cepat).

Entah orang tersebut kehilangan beberapa konsep dasar, atau tidak memiliki rasa prioritas. Yang terakhir jauh lebih mengkhawatirkan.

1
Rei Miyasaka

@FinnNk, saya setuju dengan Anda tentang kode komentar. Yang benar-benar menggangguku adalah hal-hal seperti ini:

for (var i = 0; i < num; i++) {
    //alert(i);
}

atau apa pun yang ada di sana untuk pengujian atau debugging, dan dikomentari dan kemudian dilakukan. Jika ini hanya sesekali, itu bukan masalah besar, tetapi jika ada di mana-mana, itu mengacaukan kode dan membuatnya sulit untuk melihat apa yang sedang terjadi.

1
Elias Zamaria
  • $ data - Ini seperti mengiklankan "Objek fisik, sekarang dengan harga yang sangat rendah 100 per 5!"
  • Item TODO dalam kode - Gunakan pelacak bug/tiket/masalah sehingga orang tahu apa yang dibutuhkan pada tingkat produk daripada tingkat file.
  • Kode masuk kerja - Itulah gunanya kontrol versi.
1
l0b0

Apa pun yang melanggar prinsip yang penting. Misalnya, beberapa anti-pola telah disarankan (angka ajaib - lihat http://en.wikipedia.org/wiki/Anti-pattern ). Anti-pola disebut itu karena mereka menyebabkan masalah (juga sudah disebutkan - kerapuhan, mimpi buruk pemeliharaan, dll). Selain itu, perhatikan pelanggaran prinsip SOLID - lihat http://en.wikipedia.org/wiki/Solid_ (object-oriented_design) Juga, Kode yang tidak dapat mempertimbangkan pemisahan tingkatan (hal-hal akses data di dalam UI, dll). Memiliki standar pengkodean dan ulasan kode membantu untuk mengatasi hal ini.

1
Tim Claason

Sebagian besar dari ini berasal dari Java pengalaman:

  • Mengetik string. Hanya ... tidak.
  • Typecasting akan sering mengarah ke bau kode di Jawa modern.
  • Pokemon Exception anti-pola (saat Anda harus menangkapnya semua).
  • Cargo-cult mencoba pemrograman fungsional yang tidak sesuai.
  • Tidak menggunakan konstruksi seperti fungsional (Callable, Function dll) di mana itu akan sesuai.
  • Gagal memanfaatkan polimorfisme.
1
Ben Hardy

Ketika kode terlihat seperti berantakan: Komentar dengan "todo" dan "note to self" dan lelucon konyol. Kode yang jelas digunakan di beberapa titik semata-mata untuk keperluan debugging, tetapi kemudian tidak dihapus. Variabel atau fungsi dengan nama yang menunjukkan bahwa penulis tidak menganggap bahwa siapa pun akan membacanya nanti. Seringkali nama-nama ini akan sangat panjang dan sulit.

Juga: Jika kode tidak memiliki ritme. Fungsi panjang yang sangat berbeda. Fungsi yang tidak mematuhi skema penamaan yang sama.

Sedikit terkait: Itu selalu membuat saya gugup jika seorang programmer memiliki tulisan tangan yang jorok. Atau apakah mereka penulis yang buruk atau komunikator yang buruk.

1
KaptajnKold

Saya pernah bekerja pada sebuah proyek di mana kontraktor telah menentukan setiap tipe data standar dari int ke string termasuk pointer ke nama yang tidak jelas. Pendekatannya membuat memahami kode sangat sulit. Gaya lain yang memperingatkan saya adalah fleksibilitas prematur; produk yang pernah saya kerjakan memiliki kode lengkap dalam DLL yang dimuat tanpa urutan yang dapat diprediksi. Semua ini untuk mengakomodasi evolusi di masa depan. Beberapa DLL menggunakan pembungkus ulir untuk portabilitas. Itu adalah mimpi buruk untuk men-debug program atau memprediksi aliran dengan membaca kode sumber. Definisi tersebar di file header. Tidak mengherankan bahwa kode tidak bertahan melampaui versi kedua.

1
VKs

Kadang-kadang saya melihat bagian dari metode yang memberikan semua input yang mungkin, itu masih TIDAK PERNAH berjalan, jadi seharusnya tidak ada orang membingungkan di tempat pertama. Contohnya adalah ...
Jika metode ini hanya dapat dipanggil di dalam konteks pengguna super Admin dan saya melihat sesuatu memeriksa apakah pengguna yang diminta bukan pengguna super Admin ...: /

1
chiurox

Komentar yang tidak puas menunjukkan kurangnya pengekangan:

//I CAN'T GET THIS F^#*&^ING PIECE OF S$^* TO COMPILE ON M$VC

Entah mereka pemarah atau mereka tidak cukup berpengalaman untuk belajar bahwa kemunduran tidak bisa dihindari dalam pemrograman.

Saya tidak ingin bekerja dengan orang-orang seperti itu.

1
Rei Miyasaka

Ini adalah gejala yang agak kecil dibandingkan dengan hal-hal lain yang telah terdaftar, tetapi saya adalah seorang programmer Python dan saya sering melihat ini di basis kode kami:

try:
    do_something()
except:
    pass

Yang biasanya memberi sinyal kepada saya bahwa programmer tidak benar-benar tahu (atau peduli) mengapa do_something mungkin gagal (atau apa fungsinya) - dia hanya terus "mengutak-atik" hingga kode tidak lagi mogok.


Bagi mereka yang datang dari latar belakang Java-esque yang lebih, blok itu adalah Python setara dengan

try {
    doSomething();
} catch (Exception e) {
    // Don't do anything. Don't even log the error.
}

Masalahnya adalah, Python menggunakan pengecualian untuk kode "tidak luar biasa", seperti keyboard menginterupsi atau keluar dari loop for.

1
mipadi

getter di semua tempat membuatku panik.

dan satu hal khusus: getter mendelegasikan ke getter lain.

ini buruk karena itu berarti orang yang menulis yang tidak memahami dasar berorientasi objek, yang merupakan enkapsulasi, yang berarti di mana data berada, metode yang bertindak pada data itu seharusnya.

delegasi adalah untuk satu metode tidak semua pengambil. prinsipnya adalah "katakan, jangan tanya"; katakan satu hal kepada suatu objek untuk dilakukan, jangan minta seribu hal dan lakukan sendiri.

getter membuatku takut, karena itu berarti prinsip oop lainnya akan dilanggar inti keras.

0
Belun

Informasi jenis tidak ada.

Lihatlah tanda tangan metode ini:

  1. public List<Invoice> GetInvoices(Customer c, Date d1, Date d2)

  2. public GetInvoices(c, d1, d2)

Dalam (1) ada kejelasan. Anda tahu persis parameter apa yang perlu Anda panggil fungsi dan jelas apa fungsi kembali.

Dalam (2) hanya ada ketidakpastian. Anda tidak tahu parameter apa yang digunakan dan Anda tidak tahu apa fungsi mengembalikan jika sesuatu sama sekali. Anda secara efektif dipaksa untuk menggunakan pendekatan coba-coba yang tidak efisien untuk pemrograman.

0
ThomasX