Anti-pola terburuk yang pernah Anda temui [ditutup]


9

Apa anti-pola terburuk yang Anda temui dalam karier Anda sebagai seorang programmer?

Saya sebagian besar terlibat dalam java, meskipun mungkin bahasa-independen.

Saya pikir yang terburuk adalah apa yang saya sebut anti-pola utama . Ini berarti program yang terdiri dari kelas tunggal, sangat besar (terkadang disertai dengan sepasang kelas kecil) yang berisi semua logika. Biasanya dengan loop besar di mana semua logika bisnis terkandung, kadang-kadang memiliki puluhan ribu baris kode.

Jawaban:


38

Kode yang dikomentari. Bloknya, mungkin ratusan garis. Teorinya adalah, hei dikomentari, tidak ada salahnya dan mungkin kita akan membutuhkannya di masa depan.


7
Yah setidaknya Anda bisa menghapusnya dengan aman. Tidak seperti seseorang yang pernah bekerja sama dengan saya, yang sering mengganti nama prosedur dan membiarkan kode mati diakses. Blech.
Jay

@ Cirena, Anda bekerja dengan Eric juga?!?
CaffGeek

Saya punya banyak kode yang pernah menggunakan #ifdef COMMENT untuk mengunci semuanya. Bekerja dengan baik sampai seseorang mendefinisikan KOMENTAR.
Michael Kohne

9
Ini adalah kasus lain di mana menggunakan kontrol versi terbayar. Anda dapat menghapus kode tanpa harus bertanya apakah Anda mungkin memerlukannya di masa mendatang karena dapat diambil kembali dengan beberapa penekanan tombol.
Jason B

5
Saya pikir kode commented-out memiliki tempat, jika Anda awalan dengan komentar yang menjelaskan mengapa ada di sana. Kadang-kadang saya akan meninggalkan blok komentar yang mewakili jalan potensial yang saya pikirkan untuk diambil, dan meninggalkannya dengan komentar tentang mengapa saya tidak melakukannya. @ Alasan, saya pasti mendengar Anda tentang ini menjadi peran kontrol versi, tetapi kode yang dihapus dalam kontrol versi tidak terlalu mudah ditemukan.
nlawalker

19

Saya akan menemukan satu lagi yang jelas dengan "copy-paste". Menyalin kode yang hampir identik dengan apa yang Anda inginkan, kemudian mengubah beberapa hal (alih-alih mengekstraksi menjadi metode).

Ini sangat lazim dalam beberapa kode uji fungsional dan API dari akhir 90-an: Secara harfiah ratusan (atau bahkan ribuan) kasus uji yang hampir identik yang dapat dipecah menjadi beberapa fungsi yang mengambil 3 atau 4 parameter - atau, bahkan lebih baik , sesuatu yang digerakkan oleh data. Pekerjaan pertama saya di luar perguruan tinggi adalah 8 bulan menulis ulang dan refactoring ribuan baris pasta yang menggunakan metode yang sudah usang. Pada saat saya selesai, file tes kurang dari sepersepuluh dari ukuran aslinya dan jauh lebih mudah dikelola (dan dapat dibaca!).


16

Saya pikir saya bisa menulis banyak tentang Pattern Mania dan solusi yang bisa diselesaikan dengan usaha yang jauh lebih sedikit, tetapi saya lebih suka menunjuk ke artikel bagus yang baru saja saya baca dengan contoh fantastis tentang bagaimana solusi sederhana dapat terlalu rumit .

Bagaimana (tidak) menulis faktorial di Jawa atau jadi kami menempatkan pabrik ke dalam algoritma Anda


3
Luar biasa! Sekarang di mana FactorialWebService? : P
FrustratedWithFormsDesigner

1
Saya menyebutnya Pattern Fever ... semua orang mendapatkannya pada satu titik dalam karir mereka. Semakin baik di antara kita tumbuh melampaui itu. Saya melakukan wawancara di mana pria itu bertanya kepada saya kapan saya harus memikirkan pola. Saya mengatakan kepadanya bahwa saya membiarkan mereka berevolusi menjadi sistem. Dia berkata, "Tidak, Anda harus menggunakan pola sejak awal."
Michael Brown

FactoryFactories hanyalah gejala keinginan untuk menunda pilihan yang sebenarnya sebanyak mungkin, tetapi itu tetap berakhir di hardcoding atau memetakan nilai string eksternal ke sepotong kode. Ketergantungan Injeksi adalah solusi yang lebih baik.

Pola adalah artefak dari desain yang baik - mereka harus diperlakukan seperti itu. Saya suka menggambarkannya sebagai definisi daripada solusi. Mereka berguna saat berkomunikasi, tetapi tidak harus dalam mendesain.
Michael K

Terima kasih untuk itu, selamat membaca.
Syg


14

Daerah

Dalam C # Anda dapat menentukan wilayah kode yang dapat diciutkan dalam IDE, sehingga menyembunyikannya kecuali jika Anda ingin berurusan dengan kode itu. Saya telah (sekarang sedang) proyek di mana daerah membentang ratusan baris (berharap saya melebih-lebihkan) dan ada beberapa daerah dalam fungsi seribu baris (sekali lagi saya berharap saya bercanda).

Sisi baiknya, pengembang yang membuat wilayah melakukan pekerjaan yang sangat baik dalam mengidentifikasi fungsi-fungsi spesifik dalam suatu wilayah. Sedemikian rupa sehingga saya dapat melakukan metode ekstrak di wilayah tersebut dan melanjutkan.

Wilayah mendorong pengembang untuk "menyembunyikan" omong kosong mereka di depan mata.


15
+1 untuk Kawasan mendorong pengembang untuk "menyembunyikan" omong kosong mereka di depan mata. Namun, ketika digunakan dengan benar, saya menemukan bahwa daerah membantu secara logis mengelompokkan kode bersama dan dengan mudah menemukan di lain waktu.
Darren Young

Ini sudah lama menjadi masalah dengan editor lipat. Saya dulu melakukan hal yang sama ketika saya terakhir kali diprogram dalam OCCAM.
Michael Kohne

2
Saya suka daerah ... tetapi hanya untuk organisasi ... tidak menyembunyikan rim kode digital.
IAbstract

3
+1. Itu juga mengapa menggunakan wilayah melanggar aturan StyleCop SA1124 DoNotUseRegions.
Arseni Mourzenko

1
Saya punya proyek yang bekerja dengan sejumlah besar bidang dalam SQL, dan kode yang memperbarui / membuat banyak baris. Suatu daerah #region SQL Updatemembuatnya dapat dilipat sehingga lebih sedikit pengguliran yang diperlukan.
JYelton


9

Bukan metode kelebihan beban:

// Do something
public int doSomething(Data d);

// Do same thing, but with some other data
public int doSomething2(SomeOtherData d);

Jelas menunjukkan bahwa programmer tidak mengerti kelebihan beban.



5

Soft coding , yaitu ketika programmer keluar dari jalan mereka untuk menghindari hard-coding dan berakhir di sisi lain skala - dependensi "hard coded".


4

Pertahankan status klien.

Pernah bekerja dengan aplikasi web di mana semua negara disimpan di browser. (Untuk memastikan skalabilitas bebas masalah, semua pengecualian diabaikan).


Bisakah Anda jelaskan? Imho, untuk aplikasi Web, tidak masalah jika satu-satunya keadaan adalah di Browser (yaitu, cookie), dan server 'tidak berbagi apa pun'. Atau maksud Anda 'nyatakan' seperti pada 'database aplikasi'?
keppla

Negara: Seperti pada data aktual untuk beroperasi.

OO, Anda memiliki simpati terdalam saya.
keppla

4

Checkin besar-besaran

Saya benci ketika saya melihat pengembang belum melakukan check-in lebih dari seminggu. Ini berarti dia entah macet dan belum mencari bantuan, atau dia menggabungkan banyak fitur menjadi satu check-in besar. (Aku meninggalkan skenario terburuk, dia hanya tidak melakukan apa-apa. Itu mudah untuk diselesaikan ... dua kata terdengar seperti kamu disewa.)

Jika Anda melakukan check-in besar, Anda kehilangan banyak manfaat SCM, seperti bisa menautkan perubahan set ke fitur tertentu. Anda juga mungkin memiliki banyak merger untuk dilakukan dan itu tidak selalu mudah untuk diperbaiki.


1
Tidak melakukan apa pun tidak selalu merupakan skenario terburuk. Kadang-kadang lebih baik harus menulis dari awal daripada memiliki kode untuk menulis ulang ...
Maleakhi

4

Saat ini, saya sedang bekerja dengan sepotong kode warisan dan saya suka cara pembuat kode sebelumnya mendapatkan elemen pertama dari daftar:

String result;
for(int i = 0; i < someList.size(); i++) {
    result = someList.get(i);
    break;
}

Tapi imho terburuk yang pernah saya lihat dalam kode ini adalah mendefinisikan kelas halaman JSP inline, menulis semua HTML, CSS dan Javascript menggunakan scriptlet dan out.println :-(


4

Salah satu pola anti perilaku terburuk yang saya lihat adalah toko yang hanya mengizinkan kode untuk diperiksa ke kontrol versi setelah itu dalam produksi. Ditambah dengan checkout eksklusif di VSS, hal ini menyebabkan proses berbelit-belit membatalkan checkout jika cacat produksi perlu diperbaiki sebelum rilis berikutnya, apalagi lebih dari satu orang perlu mengubah file yang diberikan untuk rilis mendatang.

Fakta bahwa ini adalah kebijakan departemen membuatnya bahkan lebih buruk daripada kasus pengembang tunggal berperilaku seperti ini.


3

Mengunci String secara literal

synchronized("one") { /* block one A*/ }

synchronized("one") { /* block one B*/ }

Nama kelas yang sangat panjang. (di JRE)

com.sun.java.swing.plaf.nimbus.
InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState

Struktur pewarisan yang buruk

com.sun.corba.se.internal.Interceptors.PIORB extends
com.sun.corba.se.internal.POA.POAORB extends
com.sun.corba.se.internal.iiop.ORB extends
com.sun.corba.se.impl.orb.ORBImpl extends
com.sun.corba.se.spi.orb.ORB extends
com.sun.corba.se.org.omg.CORBA.ORB extends 
org.omg.CORBA_2_3.ORB extends
org.omg.CORBA.ORB

Suatu Pengecualian yang bukan.

public interface FlavorException { }

Penanganan kesalahan sia-sia dan samar

if (properties.size() > 10000)
   System.exit(0);

Pembuatan objek yang tidak perlu

Class clazz = new Integer(0).getClass();
int num = new Integer(text).intValue();

Melempar pengecualian untuk tujuan lain

try {
    Integer i = null;
    Integer j = i.intValue();
} catch (NullPointerException e) {
    System.out.println("Entering "+e.getStackTrace()[0]);
}

Menggunakan objek instan untuk metode statis.

Thread.currentThread().sleep(100);

Sinkronisasi pada bidang non-final

synchronized(list) {
   list = new ArrayList();
}

Salinan tak berguna dari String konstan

String s = new String("Hello world");

Panggilan tak berguna ke String.toString ()

String s = "Hello";
String t = s.toString() + " World";

Panggilan ke System.gc () untuk membebaskan sebagian memori

Mengatur variabel lokal ke nol untuk membebaskan sebagian memori

    // list is out of scope anyway.
    list = null;
}

Menggunakan ++ i daripada i ++ untuk alasan kinerja (atau mikro-mikro-optimasi lainnya)


Ini tidak harus anti-pola, hanya coding yang buruk.
Gary Willoughby

@Gary, atau pola pengembangan yang buruk saya lihat berulang kali. Mungkin tidak dalam definisi ketat dari pola-anti.
Peter Lawrey

1
@ Peter: "Panggilan ke System.gc () untuk membebaskan memori", saya telah melihat satu kesempatan di mana .NET akan meledak dengan pengecualian OutOfMemory kecuali GC disebut secara eksplisit. Tentu saja itu lebih merupakan pengecualian daripada aturan.
Coder

3

Kode ditaburi dengan:

// TODO: 

atau

// TODO: implement feature 

tanpa informasi tambahan.


2

Iterator untuk boneka:

Iterator iCollection = collection.iterator();
for(int i = 0 ; i < collection.size() ; i++ ){
    if(collection.get(i) == something){
       iCollection.remove();
    }
 }

Singletono-Factory:

public class SomeObject{
   private SomeObject() {}
   public static SomeObject getInstance(){
       return new SomeObject();
   }
}

if-else driven development (juga disebut prinsip buka tutup - buka untuk modifikasi tutup untuk pengertian):

if (sth1){
...  
}else if(sth2){
..
}
...
..
else if(sth1000000000000){
...
}

StringPattern (juga disebut StringObject):

a) sendercode
if(sth1)
   str+="#a";
if(sth2)
   str+="#b";
...
if(sth1000)
   str+="#n";

b) receiver
   regexp testing if str contains #a, #b, ... #n

Namun, else ifsering kali itu satu-satunya cara untuk menyelesaikan sesuatu. Saya sedang memikirkan string; tidak bisa menggunakan sakelar. Kondisinya harus sama agar bermanfaat.
Michael K

Setiap IMHO jika / orang lain dapat diganti dengan pemetaan sederhana atau pola pengunjung. Dalam hal string yaitu Anda mungkin memiliki file properti seperti: someString1 = some.package.ObjectToHandleSomeString1
Marcin Michalski

2
Singleton adalah sebuah pabrik . Tidak ada yang salah dengan kode itu. Satu-satunya hal yang bisa salah adalah bahwa kode luar membuat asumsi, bahwa setiap panggilan untuk getInstancemengembalikan instance yang sama. Asumsi semacam itu akan memecah enkapsulasi dan sebenarnya merupakan salah satu dari anti-pola yang paling umum.
back2dos

tepatnya itulah mengapa ini sangat membingungkan :) jika metode ini disebut create () atau itu akan mengembalikan contoh yang sama setiap kali semuanya akan baik
Marcin Michalski

2

Ini bukan begitu banyak pola pengkodean tetapi pola perilaku, itu cukup buruk: memodifikasi sesuatu dalam kode (katakanlah persyaratan berubah), kemudian mengubah semua tes unit sampai kode melewatinya. Tweak atau hanya menghapus semua kode uji dari metode pengujian, tetapi meninggalkan metode di sana.

Ini terkait dengan yang lebih umum, pola That'll Do , inilah baris kode yang representatif untuknya:

int num = new Integer( stringParam ).parseInt( stringParam );

Lagipula itu berhasil.


2

Saya benar-benar membenci inversi abstraksi , atau menciptakan kembali primitif tingkat rendah di atas primitif tingkat tinggi. Namun, kadang-kadang, ini disebabkan oleh perancang bahasa yang buruk, bukan programmer yang buruk. Contoh:

  1. Menggunakan kelas metode tunggal tanpa variabel anggota dan antarmuka yang sesuai, (diimplementasikan dalam bentuk tabel pointer fungsi), bukan penunjuk fungsi. Perhatikan bahwa dalam bahasa seperti Java, Anda mungkin tidak punya pilihan.

  2. Dalam MATLAB dan R, desakan bahwa semuanya adalah vektor / matriks daripada primitif.

  3. Saat kita menghancurkan MATLAB, bagaimana dengan fakta bahwa ia tidak memiliki integer, jadi ketika Anda membutuhkan integer Anda harus menggunakan double.

  4. Bahasa murni fungsional di mana Anda harus menggunakan panggilan fungsi untuk menulis loop.


1

Pasti akan copy / paste, saya telah melihat banyak kode buruk yang diselesaikan karena itu, itu dan pengkodean koboi dan segala sesuatu yang berasal dari itu. (Kelas God, metode ekstra besar, algoritma yang dipikirkan dengan buruk, dll.)

Dan jika pola desain diizinkan, saya akan mengatakan: Melakukan proyek sebagai serangkaian tindakan dari rencana, tanpa melakukan desain atau analisis domain apa pun.


1

Kacang java multi guna -

Kacang java dengan banyak variabel, digunakan dalam beberapa jenis operasi. Setiap operasi menggunakan beberapa subset variabel kacang yang berubah-ubah, dan mengabaikan yang lainnya. Beberapa variabel untuk kondisi gui, beberapa variabel dilemparkan untuk melewati di antara komponen, beberapa yang bahkan mungkin tidak digunakan lagi. Contoh-contoh terbaik tidak memiliki dokumentasi, yang akan menghalangi apresiasi terhadap pola.

Juga, tidak bisa melupakan kekasih

try{ 
   ... //many lines of likely dangerous operations
}
catch(Exception e){}

IMHO, pengecualian bau. Mereka terlalu sulit untuk memperbaikinya, dan mereka menambahkan rasa aman yang salah.
Coder

Apa pun pendapat Anda tentang bau pengecualian, diam-diam menelan seseorang harus lebih berbau.
Steve B.

1

Seorang mantan rekan kerja memiliki kebiasaan menggunakan kembali objek dengan menimpa properti mereka, daripada hanya membuat yang baru. Saya tidak pernah bisa membayangkan jumlah masalah yang disebabkan ini ketika mengimplementasikan fitur-fitur baru.


1

Sesuatu yang menyebabkan saya sangat berduka adalah pola "Peta besar di langit". Melempar peta bukannya menggunakan benda yang tepat. Anda tidak tahu apa yang "variabel" di dalamnya tanpa debugging, dan Anda tidak tahu apa yang mungkin ada di dalamnya tanpa melacak kode ke belakang. Biasanya memetakan Strings to Objects, atau Strings to Strings, yang berpotensi Anda parsing menjadi primitif.


Kedengarannya seperti mengandalkan Sesi dan ViewState di ASP.NET untuk mengirimkan sekumpulan data antar halaman, yang sayangnya sering diperlukan ...
Wayne Molina

1

Salah satu pola anti pengembangan favorit saya adalah penggunaan "desain" basis data yang mengharuskan terus menambahkan kolom tambahan ke satu atau lebih tabel secara terprogram . Ini adalah sepupu dari "desain" yang membuat tabel baru untuk setiap instance dari entitas. Keduanya pasti mengenai keterbatasan server database, tetapi biasanya tidak sampai sistem telah berproduksi untuk beberapa waktu.


0

Saya pikir salah satu anti-pola terburuk yang saya lihat melibatkan menggunakan tabel Database sebagai penyimpanan sementara alih-alih menggunakan memori komputer.

Domain masalah adalah hak milik yang melarang saya menjelaskannya, tetapi tidak perlu memahami masalah dasarnya. Ini adalah aplikasi GUI yang ditulis di Jawa dengan Database backend. Itu untuk mengambil input data tertentu, memanipulasinya dan kemudian mengkomit data yang diolah ke database.

Proyek kami memiliki algoritma yang cukup rumit yang menyimpan nilai menengah untuk diproses nanti. Alih-alih merangkum objek sementara di ... objek, tabel database dibuat seperti "t_object". Setiap kali nilai dihitung, itu ditambahkan ke tabel ini. Setelah algoritme selesai, ia akan memilih semua nilai antara dan memproses semuanya dalam satu objek Peta besar. Setelah semua pemrosesan selesai, nilai yang tersisa yang ditandai untuk disimpan akan ditambahkan ke skema basis data nyata dan entri sementara di tabel "t_object" akan dibuang.

Tabel itu juga digunakan seperti daftar unik, data hanya bisa ada satu kali. Ini mungkin fitur yang layak dari desain seandainya kita menerapkan Kendala di atas meja, tetapi akhirnya kita mengulangi seluruh tabel untuk melihat apakah data ada atau tidak. (Tidak, kami bahkan tidak menggunakan kueri yang digunakan di mana klausa dengan WADAH)

Beberapa masalah yang kami hadapi karena desain ini adalah debugging khusus. Aplikasi ini dibangun untuk menyalurkan data sehingga akan ada beberapa GUI yang akan melakukan pra-proses data sebelum tiba pada algoritma ini. Proses debugging adalah untuk memproses test case dan kemudian berhenti sesaat setelah menyelesaikan bagian di atas. Kemudian kami akan meminta database untuk melihat data apa yang terkandung dalam tabel ini.

Masalah lain yang kami temukan adalah bahwa data tidak dihapus dengan benar dari tabel sementara ini, yang akan mengganggu proses di masa mendatang. Kami menemukan ini karena Pengecualian tidak ditangani dengan benar dan oleh karena itu aplikasi tidak keluar dengan benar dan tidak menghapus data dalam tabel yang dikendalikannya.

Jika kami telah menggunakan Desain Berorientasi Objek Dasar dan menyimpan semuanya dalam Memori, masalah di atas tidak akan pernah terjadi. Pertama, debugging akan menjadi sederhana karena kita dapat dengan mudah mengatur break point dalam aplikasi dan kemudian memeriksa memori di stack dan heap. Kedua, setelah keluar abnormal dari aplikasi, memori java akan dibersihkan secara alami tanpa harus khawatir menghapusnya dari database.

CATATAN: Saya tidak mengatakan pola ini pada dasarnya buruk, tetapi dalam contoh ini saya merasa tidak perlu ketika prinsip-prinsip OO dasar sudah mencukupi.

Saya tidak yakin nama untuk anti-pola ini karena ini adalah pertama kalinya saya melihat hal seperti ini dilakukan. Adakah nama baik yang kalian pikirkan untuk pola ini?


Saya tidak akan menyebut ini masalah selimut. Itu akan tergantung pada berapa banyak data sementara sedang disimpan dan apa yang sedang dilakukan dengannya.
GrandmasterB

Saya harus menambahkan lebih ke posting tetapi masalah utama adalah bahwa alih-alih memodifikasi objek dan mengakses data dari memori, data dimanipulasi dengan kode sql hack. Hal ini menyebabkan meningkatnya kompleksitas dan masalah kinerja yang parah.
jluzwick

2
Anda tidak menyebutkan domain masalah Anda, tetapi tidak selalu hal yang buruk, menjaga status di tempat lain seperti ini dapat memungkinkan proses untuk skala dan untuk introspeksi selama jangka waktu yang lama, juga untuk membantu dalam debugging. Apakah akses DB menyebabkan masalah kinerja atau masalah?
Jé Queue

Saya telah mengedit artikel untuk lebih mencerminkan bagaimana ini digunakan dalam proyek kami, tetapi kami memiliki banyak masalah ketika debugging, khususnya karena kami harus meminta database untuk melihat variabel sementara. Kami juga memiliki masalah besar terkait kinerja karena database terus-menerus ditanyai untuk data dan memeriksa apakah data baru sudah ada.
jluzwick

0

Troli-Sebelum-Kuda - alias YouMightNeedIt

Sebagai contoh:

  • Membuat skema RDMBs dengan konsep abstrak, referensi silang - pada dasarnya sebuah kubus data yang terlalu digeneralisasi ... DAN KEMUDIAN fitur penulisan di sekitar model do -everything.

Itu akan menjadi saudara kembar jahat YAGNI, kan?
Wayne Molina

0

IMO anti-pola terburuk yang pernah saya lihat adalah "Kami tidak memerlukan pola busuk" Anti-Pola: Gagasan bahwa pola desain adalah pemborosan waktu dan Anda dapat menulis kode lebih cepat dengan hanya mengaitkannya dan menyalin / menempelkan sesuai kebutuhan.

Disebutkan terhormat memiliki kode yang memuat objek dari database menggunakan gaya VB6 lama:

Foobar oFoo = new Foobar();
oFoo.FooID = 42;
if (oFoo.Load()) { 
    // do something with oFoo
}

tidak benar-benar anti-pola, tetapi juga menunjukkan kurangnya mengambil keuntungan dari arsitektur yang tepat dan pemisahan masalah.

Juga, hal-hal seperti ini:

// this name is misleading, we may not always want to stand in fire,
// we may want to stand in slime or voidzones or ice patches...
public Foobar StandInFire() { }

// why is this here???
public string BeatWithNerfBat(string whom) { }

// ????
public int GivePony(string to) { }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.