Kodlara bakarken hangi şeyler anında alarm zili çalar? [kapalı]


98

Birkaç hafta önce bir yazılım işçiliği etkinliğine katıldım ve yaptığım yorumlardan biri "Gördüğümüzde kötü kodları hepimiz tanıdığımızdan eminim" ve herkes daha fazla tartışma yapmadan başını salladı.

Bu tür şeyler her zaman beni endişelendiriyor, çünkü herkesin ortalamanın üstünde bir sürücü olduğunu sandığı gerçekçilik var. Kötü kodları tanıyabileceğimi düşünmeme rağmen, başkalarının kodlarının kokusu olarak gördükleri hakkında daha fazla şey öğrenmeyi çok isterim. Özellikle, bir kodda kod kokusu olan bir şeyden başka bir şey duymamanın ilginç olacağını düşünüyorum.

Kolay bir tane ile başlayacağım:

Kaynak denetiminde yüksek oranda yorumlanmış kod olan kod - neden orada? silinmek mi gerekiyordu? yarım iş bitti mi? belki de yorumlanmamalıydı ve sadece birisi bir şeyi test ederken mi yapılmıştı? Şahsen, buradaki tek garip hat olsa bile, gerçekten sinir bozucu olan bir şey buluyorum, ancak kodun geri kalanıyla serpiştirilmiş büyük bloklar gördüğünüzde bu tamamen kabul edilemez. Ayrıca, genellikle kodun geri kalanının da şüpheli kalitede olacağının bir göstergesidir.


61
Bazen kodu yorumlayan, check-in ve "Gelecekte tekrar ihtiyacım olabilir - şimdi çıkarırsam kaybedeceğim" diyen insanlarla karşılaşıyorum. "Er, ... ama kaynak kontrolü bunun için" dir.
talonx

6
Bazen, özellikle optimizasyon yaparken, eski kodu yorum olarak bırakmak yararlı olur; bu nedenle, gizlenmiş optimizasyon kodunun yerini aldığınızı bilirsiniz. 3 satırlık bir takas yerine geçici olarak takılıyken bir satırlık döndürme taklidi ile değiştirmeyi düşünün. (Ben bir tek satır takas kullanmaya gerek bakınız rağmen - HİÇ program boyutu kritik öneme sahip olmadıkça.)
Chris Cudmore

4
Bazı yararlı şeyleri kodlayan, ancak programcı olmadığını kabul eden mühendislerimizden birinin yazdığı kodu koruyorum / temizliyorum. Bir şeyleri birleştirirken eski kodunu yorumlayacağım ve daha sonra değişiklikleri gözden geçireceğiz ve ona nasıl daha küçük / daha verimli / anlaşılması daha kolay bir şeyle değiştirdiğimi göstereceğim. Daha sonra bu blokları çıkarıyorum, sonra kontrol ediyorum. Eski koda sahip olmanın faydaları var çünkü işlerin nasıl daha kolay yapılabileceğini görüyor ve konuştuğumuzda neden bir şeyleri değiştirdiğimi hatırlayabiliyorum.
Teneke Adam

8
1 işlem için "kullanılabilecek" şeyleri bırakıyorum, sonra işler bozulmazsa veya bir ihtiyaç bulunmazsa, bir sonraki işlemden çıkarılır.
Paul Nathan

24
Hmm. printf("%c", 7)genellikle benim için alarm zilleri çalar. ;)

Yanıtlar:


128
/* Fuck this error */

Genellikle saçma bir try..catchblok içinde bulunur , dikkatimi çekmeye meyillidir. Sadece yaklaşık olarak /* Not sure what this does, but removing it breaks the build */.

Birkaç şey daha:

  • Birden fazla iç içe geçmiş karmaşık ififade
  • Düzenli olarak bir mantık akışını belirlemek için kullanılan try-catch blokları
  • Jenerik isimlerle Fonksiyonlar process, data, change, rework,modify
  • 100 çizgide altı veya yedi farklı bağlantı stili

Bulduğum bir tane:

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

Doğru, çünkü kaba kuvvet vermek zorunda kalmak MySQL bağlantılarınızı doğru şeyler yapmaktır. Veritabanının bağlantı sayısıyla ilgili sorunları olduğu ortaya çıktı, bu yüzden zaman aşımına uğradılar. Bunu hata ayıklamak yerine, çalışana kadar tekrar tekrar denediler.


19
Keşke bunu 6 kez oylayabilseydim! Tüm güzel örnekler. Kibirli / komik yorumları da beğenmedim (özellikle küfretmeyi içeriyorlarsa) - ilk okuduğunuzda biraz eğlenceli olabilir ancak çok çabuk yaşlanır (ve bu yüzden rahatsız edici).
FinnNk

5
Örneğin, ifadeler kaçınılmazsa, belirli bağlamlarda birden fazla iç içe geçmiş olduğunu söyleyebilirim. Çok fazla iş mantığıyla, kod biraz kafa karıştırıcı olabilir, ancak işin kendisiyle başlamak için kafa karıştırıcı olması durumunda, kodu basitleştirmek için süreci daha az doğru şekilde modellemek gerekir. Einstein'ın dediği gibi: "İşler olabildiğince basit olmalı ve biraz daha basit olmamalı."
Morgan Herlocker

2
@Prof Plum - Hangi örneği verebilirsiniz? Genellikle iç içe geçme yönteminin alternatifi, onu (birçok) yönteme ayırmaktır. Küçük geliştiriciler, sanki iflerden daha az arzu edilirmiş gibi kaçınma eğilimindedir; ama genellikle basıldığında "eğer daha az satırda yapılıyorsa" derler. OOP'a güvenerek birisinin adım atması ve onlara daha az satır! = Daha iyi kod olduğunu hatırlatması gerekir.
STW

2
@STW Bu iyi bir nokta, ancak, iç içe geçmenin ne kadar derin olduğuna bağlı olduğunu söyleyebilirim. Üç yuvadan daha derin bir şey olması gerektiğine kesinlikle katılıyorum, çünkü sık sık yeniden ateşlemeye ihtiyaç duyuyor, çünkü oldukça kıllı olacak. Bununla birlikte, sigorta fiyatlandırması çoklu yuvalamanın gerçekte gerçek dünyayı iyi bir şekilde modelleyebildiği iyi bir örnek. Belirli oranlar / primler haricinde, el kitabı, "eğer bu bir mülk ise ve 5.6'nın altında bir asgari orana sahipse ve NC’de ise ve tesislerinde bir tekne varsa" gibi bir şey okuyacaktır. böyle." diğer birçok seçenek ile.
Morgan Herlocker

4
joshosh, eğer "onlar" meslektaşlarsa o zaman neden "biz"

104

Benim için en büyük kırmızı bayrak yinelenen kod blokları çünkü kişinin ya programlama temellerini anlamadığını ya da var olan bir kod tabanında uygun değişiklikler yapmaktan çok korktuğunu gösteriyor.

Aynı zamanda kırmızı bayrak olarak yorum eksikliğini de sayıyordum, ancak kısa süre önce çok iyi bir kod üzerinde çalışmıştım.


1
+1: Kendisini bir linux uzmanı olarak tanıtan meslektaşımdan bazı kodlar gördüm, uzun bir fonksiyon olarak basit bir döngü uygulaması yazan, her şey baştan sona (). Amanın.
KFro

4
@KFro, bu döngü açıyor. Derleyiciler her zaman böyle yapar :) Bu çok verimli!

3
@Thorbjorn: Bazen derleyiciye biraz yardım etmelisin; Sonuçta, sen akıllı bir insansın ve o sadece aptal bir bilgisayar.
yatima2975

3
Gördüğüm bir diğer neden: Danışmana mümkün olduğu kadar çabuk bir şekilde özelliği uygulamak için ödeme yapıldı (bu nedenle testler ve belgeler de elbette eksik). Kopyala / yapıştır, işleri doğru yapmayı düşünmekten daha hızlıdır.
LennyProgrammers

4
Kod çoğaltmasından kaçınmak bir saplantı olabilir. C ++ gibi bir dilde, değişken kısımları hesaba katmak her zaman kolay değildir, ancak yine de sağlam ve verimli bir kod vardır. Bazen, biraz kes ve yapıştır biraz daha pratik bir seçenektir. Ayrıca, optimizasyon prensibi uygulayabilirsiniz - kes-yapıştır size daha sonra planı ayrı bir hızlı ve kolay bir çözüm elde edebilirsiniz eğer gerekli. Daha sonra bakım başağrısını kurtarıyor olabilirsiniz , ancak şu anda gecikmelerden kaçındığınızdan emin olduğunuzu biliyorsunuz.
Steve314

74

Hiçbir gerçek değer katmamasına rağmen, programcının ne kadar akıllı olduğunu göstermeye çalışan kod:

x ^= y ^= x ^= y;

12
Vay, bu çok daha okunaklı soooswap(x, y);
JBRWilkinson

8
x ve y, işaretçiler ise ve bu atama makul bir süre zarfında gerçekleşirse, Boehm GC gibi muhafazakar çöp toplayıcılarını sağlam bir şekilde kırar .
SingleNegationElimination

12
Bu arada, araya giren bir sıra noktası olmayan çoklu değişiklikler nedeniyle bu kod C ve C ++ 'da tanımlanmamıştır.
fredoverflow

9
Buna baktığımızda, aklıma gelen tek şey ifadelerdi:^_^
Darien

62
  • 20.000 (abartı) hat fonksiyonları. Birkaç ekrandan fazlasını alan herhangi bir fonksiyonun yeniden faktoring yapılması gerekir.

  • Aynı satırlar boyunca, sonsuza dek sürecek görünen sınıf dosyaları. Muhtemelen, orjinal sınıfın amacını ve işlevini ve hepsi de içsel yöntemler olmadıkça, muhtemelen kullanıldığı yerlerde, sınıfları soyutlayabilecek birkaç kavram vardır.

  • açıklayıcı olmayan, önemsiz olmayan değişkenler veya çok fazla önemsiz açıklayıcı olmayan değişken. Bunlar aslında bir bilmece olanı çıkarıyor.


9
Mümkün olduğunda işlevleri 1 ekranla sınırlandırma eğilimindeyim.
Matt DiTrolio

20
1 ekran bile bir esnemedir. 10 satırdan sonra kirli hissetmeye başladım.
Bryan Rowe,

54
Tamam, popüler olmayan bir düşüncenin ne olacağını söyleyeceğim. Geliştiricinin bazı "işlevler kısa olmalı" kargo kültürcülüğüne bağlı kaldığından, atomik, tepeden tırnağa, ayrı işlevlere bölünmüş işlevler yazmak için kod kokusu diyorum. İşlevler FUNCTIONAL çizgileri boyunca kesilmelidir, sadece bazı efsanevi "doğru boyutlarda" olmaları gerektiği için değil. Bu yüzden FUNCTIONS olarak adlandırılıyor.
Dan Ray,

7
@Dan, İşlevler kısa olma uğruna kısa olmamalıdır, ancak bir anda kafanızda tutabileceğiniz sadece çok fazla bilgi vardır. Belki de benim için küçük bir beynim var, bu limit bir kaç ekran :). Hataları önlemek için bu sınırın gerekli olduğunu test etmeye başladıklarında fonksiyonları çoklu fonksiyonlara bölmek. Bir yandan kapsülleme sağlar, böylece daha yüksek bir seviyede düşünebilirsiniz, diğer yandan ne olduğunu gizler, böylece işlevin nasıl çalıştığını hesaplamayı zorlaştırır. Okunabilirliğe yardımcı olmak için bazı 'mükemmel uzunluklara' uymamak için parçalama işlevlerinin yapılması gerektiğini düşünüyorum.
Dominique McDonnell

6
@Dominic, @ Péter, sanırım üçümüz aslında aynı şeyi söylüyor. Kodu daha küçük bir fonksiyona dahil etmek için iyi bir neden olduğunda, ben bunun için oluyorum. Ne reddeden ediyorum darlığı olan darlığı uğruna işlevi tasarımında. Bilirsin, olması gerekenden üç kat daha uzun olan bir çağrı yığını, ancak en azından bu işlevler kısa. Birini iyi ve net bir şekilde uzun bir hata ayıklamayı tercih ederim, her biri yalnızca bir öncekinden çağrılan bir düzine zincirleme işlevden yürütme yolunu izlemek yerine.
Dan Ray

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

Daha da kötüsü bu ticari bir kütüphaneden!


32
Bu alarm zillerini çalmaz. Neredeyse bacaklarının arasına seni vurur.
Steven Evers,

15
Kızı bir met bağımlısı. Kimin umrunda, en azından obez olmayacak. :: sigh ::
Evan Plaice

17
Kendimi belada bulduğumda, anne buntu bana geliyor. Bilgelik sözleri konuşarak, sızmasına izin verin. Sızıntı LET .. SAKIN LET. Sızıntıya izin verin. Sızıntıya izin verin. Sadece bir kez sızarsa, bir leaaaaaak değildir. (Bu kadar okursanız, +1). Kafeinsiz olarak düşünmeliyim.
Tim Post

13
"Son tarih hızlı yaklaşırken, LEAKS görebildiğim tek şey, birileri fısıldadı, 'C'ye yaz ...... eeeeee !!!'"
chiurox

9
Bir zamanlar iki işletim sistemi vardı. Biri, 49 günden fazla sürse kaçak yaptı ve çöktü, diğeri mükemmeldi ve sonsuza dek koşacaktı. Biri 1995 yılında büyük bir hayran kitlesine tanıtıldı ve milyonlarca insan tarafından kullanıldı, diğeri ise hiç sevk edilmedi çünkü hala hatasız olduğunu kontrol ediyorlar. Felsefe ve mühendislik arasında bir fark var.
Martin Beckett

53

İngilizce bir derleyici olsaydı mükemmel bir şekilde derlenir ve çalışırdı, ancak kodun yapmadığı hiçbir şeyi tarif etmeyecek kadar ayrıntılı yorumlar.

//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;

Ayrıca, yapılabilecek kodla ilgili yorumlar, bazı temel kurallara uyarlanmıştır:

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

15
Var, onun adı COBOL :-)
Gaius

26
İkinci vaka en kötüsü değil. En kötüsü: / * Kullanıcının yaşını 13 * / a = 18;
PhiLho

4
@PhiLho - hayır, daha da kötüsü zaman olduğu /itibaren */eksik, bu yüzden bir sonraki sonuna tüm kod */göz ardı edilir. Neyse ki, sözdizimi vurgulama bugünlerde bu tür bir şey nadir yapar.
Steve314

3
aUser_age için daha kötüsü ? Gerçekten mi?
glasnt

2
Eskiden bir işverende bir kod standardı dokümanı tutardım, bir kısmı uygun yorum yapıyordu. En sevdiğim örnek MSDN'den:i = i + 1; //increment i
Michael Itzoe 15:12

42

Derlendiğinde uyarı veren kod.


1
Makefile / project'e 'Tüm hatalar' uyarılarla 'derleyici seçeneği eklenecek bir aday var.
JBRWilkinson

3
Sanırım, güvenmediğiniz birden fazla kişiden oluşan bir projedeyseniz, bu seçeneğin belirlendiği bir projeye katılacak olsam bile, başkasının diğerini ne kadar endişelendirebileceğime dair endişelenmesini sağlayacaksa faydalı olabilir. programcılar
Rei Miyasaka,

1
Buna katılmıyorum. Bazı derleyici uyarıları (imzalı ve imzasız olanlar arasındaki karşılaştırma gibi, her iki değerin de imzasız olduğunu bildiğiniz zaman , türler farklı olsa bile), kodları gereksiz yere yayınlamak için tercih edilir. Bir fonksiyonun ancak tamsayı işaretsiz bir değere sahipse değiştirdiği taşınabilir imzalı bir tamsayı kullanarak kodu azaltırsam , bunu yapacağım.
Tim Mesaj

13
(unsigned int)Uyarı / hata listelerimi iyi huylu uyarılarla karıştırmak yerine kodumu neredeyse gereksiz bir kelimeyle karıştırmayı tercih ederim. Uyarı listesinin kör bir nokta haline gelmesinden nefret ediyorum. Aynı zamanda doğal bir döküm yapıyoruz niçin daha bir uyarı görmezden geliyorsunuz neden PİDE diğer insanlara açıklamak çok daha bulunuyor intsiçin unsigned ints.
Rei Miyasaka

Bazen, ne yaparsanız yapın hatalar yayan bir API ile çalışmak zorunda. Klasik örnekler, API'nin tasarımdan kırılan şeyler (örneğin, bazı eski ioctl () sabitleri böyle idi ve bazen işletim sistemi geliştiricileri, başlıklarında yanlış türü kullanmakta ısrar ediyorlar) ya da bir şeyden mahrum kaldıklarında ısrar ediyorlar. iyi bir değişiklik bırakarak (teşekkür ederim, Apple).
Donal Fellows,

36

Açıklayıcı adlara sahip olmak yerine, adda sayılarla işlev görür , örneğin:

void doSomething()
{
}

void doSomething2()
{
}

Lütfen fonksiyon isimlerinin bir anlam ifade etmesini sağlayın! DoSomething ve doSomething2 benzer şeyler yaparsa, farklılıkları ayıran fonksiyon isimleri kullanın. DoSomething2, doSomething uygulamasından bir işlevsellik dağılımıysa, işlevsellik için adlandırın.


Aynı şekilde @Parm for SQL
Dave

2
+1 - Gir mshtml- gözlerimi kırar :(
Kyle Rozendo

3
Bunun istisnası GUI kodu olacaktır. Örneğin, bir salyangoz-posta formunda iki adres varsa; address1 ve address2, adres ve alternatif adreslerden daha makuldür. Yalnızca statik olan sahte etiketler de makul bir istisnadır.
Evan Plaice

@Evan - yeterince adil, ancak işlevsellik konusunda daha fazla ayrım yapıyordum.
Wonko Sane

1
+1 - Bunun sahte sürüm kontrol yöntemi olarak kullanıldığını bile gördüm.
EZ Hart

36

Sihirli Sayılar veya Sihirli Dizeler.

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

   salesPrice *= 0.9;   //apply discount    

   if (invoiceStatus=="Overdue") { reportToCreditAgency(); }

4
İkinci ikisi ile o kadar da kötü değil, en azından indirim açıklandı ve "Gecikme" sezgisel. 200Öte yandan ...
Tarka®

9
@Slokun - Sezgisel, sürdürülebilirlik ve kırılganlık kadar önemli değildir. Örneğin, indirim miktarı değiştiğinde ve 0,9'un altı farklı yerde kodlaması zor olduğunda ne olacağını düşünün. Ayrıca, sabit / enums yerine dizeleri kullanmak, büyük / küçük harfe duyarlı dizelere sahip dillerde sorun istiyor.
JohnFx

+1 Ben sadece 'timeout = 15;' satırının yol açtığı bir sorunu ayıklamak için çok fazla zaman harcadım. bir programa gömülmüş.
aubreyrhodes,

Bence sonuncusu bazen sorun değil, fatura statüsündeki verinin nereden geldiğine bağlı olarak. Sadece kodu çözülmüş olan JSON'u döndüren bir kamu api'sinden gelmişse, kodlanmış bir String sabitine karşı kontrol etmek muhtemelen tamamdır. "200" ve "0.9" un sadece sihirli sabitler olduğu ve bu şekilde kodlanmış olmaması gerektiği konusunda hemfikir olun. Yalnızca bu yerde kullanılsalar bile, mantık koduna serpiştirmek yerine bunları bir yapılandırma bölümünde ayrı ayrı tanımladığınızda bakım daha kolaydır. Ve birden fazla yerde kullanılırlarsa, bakım çok daha kolay hale gelir .
Ben Lee,

36
  • Belki de en kötüsü değil ama uygulayıcıların seviyesini açıkça gösteriyor:

    if(something == true) 
  • Bir dilin for döngüsü veya yineleyici yapısı varsa, bir süre döngüsü kullanmak da uygulayıcılara dili anlama düzeyini gösterir:

    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.
    
  • Dokümantasyonda / yorumlarda kötü yazım / dilbilgisi neredeyse kodun kendimde yer. Bunun nedeni, kodun insanların okuması ve makinelerin çalışması için olmasıydı. Bu nedenle, yüksek seviyeli dilleri kullanıyoruz, belgeleriniz zor olsa bile, beni önlem almadan kod bazının olumsuz bir görüşünü oluşturuyor.


29

Hemen farkettiğim derinden iç içe kod bloklarının sıklığıdır (eğer öyleyse, vb.). Kod sık sık iki ya da üç seviyeden fazla derinleşiyorsa, bu bir tasarım / mantık probleminin işaretidir. Ve eğer 8 yuva derinliğine inerse, ayrılmaması için lanet olası iyi bir neden olsa iyi olur.


6
Bazı insanların her yöntemin yalnızca bir returnifadesi olması gerektiğini öğrendiğini biliyorum , ancak 6+ seviyeye çıkarsa / sonra yuva yapmasına neden olduğunu düşünüyorum, bunun yarardan çok daha fazla zarar verdiğini düşünüyorum.
Darien

28

Bir öğrencinin programını derecelendirirken, bazen "göz kırpma" tarzında bir an söyleyebilirim. Bunlar anlık ipuçları:

  • Zayıf veya tutarsız biçimlendirme
  • Bir satırda ikiden fazla boş satır
  • Standart olmayan veya tutarsız adlandırma kuralları
  • Tekrarlanan kod, tekrarlar ne kadar fazla olursa, uyarı o kadar güçlü olur
  • Basit bir kod parçası ne olmalı, aşırı derecede karmaşıktır (örneğin, ana hatlara kıvrımlı bir şekilde kontrol edilen argümanları kontrol etme)

Nadiren ilk izlenimlerim yanlıştır ve bu uyarı zilleri zamanın yaklaşık % 95'inde doğrudur . Bir istisna için, dilde yeni bir öğrenci, farklı bir programlama diline ait bir stil kullanıyordu. Tarzını kazıp başka bir dilin deyimiyle tarzlarını tekrar okurken benim için alarm zilleri çıkardı ve öğrenci daha sonra tam kredi aldı. Ancak bu istisnalar nadirdir.

Daha gelişmiş kodlar dikkate alındığında, bunlar benim diğer uyarılarımdır:

  • Veri tutmak için yalnızca "yapı" olan birçok Java sınıfının varlığı . Alanların kamuya açık veya özel olması ve alıcı / alıcı kullanması önemli değildir, hala iyi düşünülmüş bir tasarımın parçası değildir.
  • Sadece isim alanı olmak gibi kötü isimleri olan ve kodda gerçek bir uyuşmazlık olmayan sınıflar
  • Kodda kullanılmamış tasarım desenlerine referans
  • Açıklama yapılmayan boş özel durum işleyicileri
  • Kodu Eclipse’e getirdiğimde, çoğunlukla kullanılmayan ithalat veya değişkenler nedeniyle yüzlerce sarı “uyarı”

Stil açısından genelde görmek istemiyorum:

  • Javadoc, yalnızca kodu ekleyen yorumlar

Bunlar sadece hatalı kodun ipucudur . Bazen kötü kod gibi gözüken şeyler aslında değildir, çünkü programcının niyetini bilmiyorsunuzdur. Örneğin, bir şeyin aşırı karmaşık görünmesi için iyi bir neden olabilir - oyunda başka bir konuyla ilgili olabilir.


Stili bir dilden başka bir dilde kullanmanın ağır bir hata olduğunu göremiyorum (girinti başına 2, 4, 8 boşluk ...). Öğrencinin takip edebileceği başka bir stili varsa, kendi kendine tutarlı olmanın yanlış bir tarafı yoktur. Sınıf öğrencisi olarak milyarlarca program görüyorsunuz, bu yüzden bu yelpazenin karşıt ucundasınız, ancak bu tamamen farklı (ama tutarlı) bir tarzı tamamen reddetmek için bir neden değil.
Nick T

18
Yapıları basitçe veri toplayan sınıflarda yanlış bir şey göremiyorum. Veri Aktarım Nesneleri (DTO'lar) budur ve kodu söylenenden daha okunaklı hale getirebilir, örneğin 20 parametreden bir yönteme geçme.
Nemi

1
Yapılar hakkındaki yorumunuz açıktır. Verilerin rawest biçiminde olması iyi ve hiçbir şekilde değiştirilmeyecek. Ancak, zamanın% 95'i, verileri biçimlendirmek / çalıştırmak için sınıfta bazı işlevlere sahip olmalıdır. Temelde bu modeli kullanan ve geliştirilmesi gereken kodumun bir kısmını hatırladım.
DisgruntledGoat

2
Tutarsız stil ve ekstra satır sonları için +1 (rastgele girinti, girinti yok , rastgele ve değişken adlandırma kuralları ve daha fazlasını gördüm - ve bu üretim kodunda!). Bunu düzeltmek için zahmet bile edemiyorsan, o zaman başka ne yapabilirsin?
Dean Harding,

1
Vücuda göre çok fazla girintili olan bir yöntemin bildirim satırını arıyorum. Bu, başkalarının dosyasından kopyalayıp yapıştırdıkları bir işarettir.
Barry Brown

25

Kişisel favori / evcil hayvan peeve: IDE, isimlendirilen isimler üretti. TextBox1 sisteminizde önemli ve önemli bir değişkense, kod incelemesi için gelecek başka bir şey daha var.


25

Tamamen kullanılmayan değişkenler , özellikle değişken kullanılan değişken adlarına benzer bir ada sahip olduğunda.


21

Birçok insan bahsetti:

//TODO: [something not implemented]

Bu şeylerin uygulanmasını diliyorum, en azından bir not aldılar. Daha kötüsü düşündüğüm şey:

//TODO: [something that is already implemented]

Todo'ları çıkarmak için hiç uğraşmazsanız değersiz ve kafa karıştırıcı!


1
Sadece piyasaya sürülen ürünümüzdeki tüm TODO'ların bir raporunu hazırlama zorunluluğunu ve bunları elden çıkarma planını inceledim. Neredeyse yarısı eski olduğu ortaya çıktı.
AShelly

1
-1 TODO yorumları, MS Visual Studio'da, hala çalışmaya ihtiyaç duyan projenin bölümlerini izlemek için kullanılır. IE, IDE TODO'ları izleyen bir liste tutar, böylece kolayca tıklayabilir ve doğrudan TODO'nun bulunduğu hatta getirebilirsiniz. Hangi işlerin yapılması gerektiğini görmek için açıkça TODO'ların yerleştirilmesini görmeyi tercih ederim. Bkz dotnetperls.com/todo .
Evan Plaice

3
@Evan Plaice: Vay, VS IDE'nin bir şeyi uyguladığınızda tanıdığı ve //TODOyorumu kaldırdığı anlamına mı geliyorsunuz ? Korku veren!
JBRWilkinson

4
@Prof Plum Neden sadece bir TODO'dan sorumlu kişinin ismini yorumda bıraktığı bir politika yaratmıyorsunuz? Bu şekilde, bazı artıklar varsa
Evan Plaice 2

3
Daha iyi bir plan yap // TODO , böcek izleyicini kullan, işte bunun için!
SingleNegationElimination

20

Tümünü okumak için aşağı kaydırmamı gerektiren bir yöntem.


14
Hmm .. bu, neyin uygulandığına bağlı. Bazı karmaşık algoritmalar uygulanırken, bunun nasıl tanımlandıkları gibi, bunun gerçekleşmesi mantıklı olmaz. Tabii ki, eğer yöntemlerin çoğu bu şekilde ise, bu bir kırmızı bayrak.
Billy ONeal

9
Bir battaniye ifadesi olarak, o zaman hemfikir değilim, sürekli yeniden ateşleme yapmakla zaman harcıyorum, böylece her şey bu tür empoze edilen kurallara uyuyor, aslında projenin genel maliyetini arttırıyor.
Anonim Tip

1
Bu kuralın bir projenin genel maliyetini artırabileceğini kabul etmiyorum, ancak bunun öznel olduğunu çünkü geliştiricilere / projelere bağlı olacağını düşünüyorum. Eğer gelişirken “kaygıların ayrılması” genel prensibine uyursanız, o zaman yeniden faktoring yapmak isterse daha az bir görev olacaktır. Dikkate alınması gereken bir şey, orijinal projeyi kodlamayan geliştiricilerin 300'den fazla kod satırı içeren bir sürü yöntemi düzeltmeyi denemeleri durumunda, hattın üç yılını ne kadar tutacağıdır? Bu ne kadar?
BradB

18
Sağa kaydırmada, aşağı kaydırma yerine daha fazla sinirleniyorum. Boşluk "özgür".
Wonko The Sane

4
Kodun ne yaptığını anlamak için dosyanın (veya birden fazla dosyanın) her yerine atlamak yerine kaydırma yapmayı tercih ederim.
TMN

20

Metod isimlerinde bağlaçlar:

public void addEmployeeAndUpdatePayrate(...) 


public int getSalaryOrHourlyPay(int Employee) ....

Açıklama: Bunun alarm zillerinin çalmasının nedeni, tek bir sorumluluk ilkesini ihlal eden yöntemin muhtemel olduğunu göstermesi .


Hmmm ... eğer fonksiyon ismi fonksiyonun ne yaptığını doğru bir şekilde tanımlarsa, o zaman aynı fikirde değilim. Yöntem ayırmak için daha iyi olan iki ayrı şey yaparsa , içeriğe bağlı olarak aynı fikirdeyim.
Wonko The Sane,

2
Mesele bu. Bağlaç, birden fazla şey yapması muhtemel olduğunu ima ediyor. Her soruya göre, yanlış bir şey olabileceğinin farkındalığımı artıran bir şey var.
JohnFx

3
Şimdi bir çalışan eklemek ve maaşlarını birkaç yerde güncellemek zorunda kalırsanız ne olur? Bu yöntem iki yöntem çağrısı ( addEmployee(); updatePayrate();) içeriyorsa , bunun bir sorun olduğunu sanmıyorum.
Matt Grande

13

Açıkçası GPL'nin kaynak kodunu ticari, kapalı kaynaklı bir programa bağlamak.

Sadece acil bir yasal sorun oluşturmakla kalmaz, aynı zamanda deneyimlerime göre, kodda başka bir yere de yansıyan ya dikkatsizliği ya da kayıtsızlığı gösterir.


6
Amacınız mükemmel olsa da tonunuz gereksiz.
JBRWilkinson

@JBRWilkinson: Teşekkürler, haklısın. Özür dilerim herkese.
Bob Murphy

Sanırım başlığının yeniden yazılması gerekiyor. Hem statik hem de dinamik olarak GPL'd kaynak koduna bağlanmak GPL'nin ihlalidir ...
Gavin Coates

Güzel nokta. Mesajın tamamını yeniden yazdım. Herkese teşekkürler.
Bob Murphy,

9

Dilde agnostik:

  • TODO: not implemented
  • int function(...) { return -1; } ("uygulanmadı" ile aynı)
  • İstisnai olmayan bir nedenden dolayı bir istisna atma.
  • Kötüye veya tutarsız kullanımı 0, -1veya nullistisnai dönüş değerleri.
  • Asla başarısız olmamasını söyleyen ikna edici bir yorum içermeyen iddialar.

Dile özgü (C ++):

  • Küçük harflerle C ++ Makroları.
  • Statik veya Global C ++ değişkenleri.
  • Başlatılmamış veya kullanılmamış değişkenler.
  • Herhangi array newgörünüşte RAII-güvenli olmadığını.
  • Dizinin veya işaretçinin, görünüşte sınırlanmayan herhangi bir kullanımı. Bu içerir printf.
  • Bir dizinin başlatılmamış kısmının herhangi bir kullanımı.

Microsoft C ++ 'a özgü:

  • Microsoft SDK başlık dosyalarından herhangi biri tarafından zaten tanımlanmış olan bir makroyla çakışan tanımlayıcı adları.
  • Genel olarak, Win32 API'nin herhangi bir kullanımı büyük bir alarm zil kaynağıdır. Her zaman MSDN’yi açın ve şüpheniz olduğunda bağımsız değişkenleri / dönüş değeri tanımlarını arayın. (Edited)

C ++ / OOP’a özgü:

  • Sanal sınıfın hem sanal hem de sanal olmayan yöntemlere sahip olduğu (sanal sınıf) sanal olanın ne olması gerektiği / neyin olmaması gerektiğine dair net bir ayrım olmadan uygulama (somut sınıf) mirası.

18
// TODO: Bu yanıta yorum yap
johnc

8
Sanırım "dil agnostik" şimdi "C / C ++ / Java" anlamına mı geliyor?
Inaimathi

+1 "İstisnai olmayan bir nedenden dolayı bir istisna atma" daha fazla kabul edemedi!
billy.bob

2
@Inaimathi - TODO yorumları, işlev saplamaları, istisna kötüye kullanımı, sıfır / boş / boş anlambilim karmaşası ve anlamsız akıl yürütme kontrolleri tüm zorunlu / OOP dilleri ve genel olarak tüm programlama dilleri için doğaldır.
Rei Miyasaka

C önişlemci makrolarının küçük harfli olduklarına inanıyorum , ancak argümanlarını yalnızca bir kez değerlendirirlerse ve yalnızca tek bir ifadeyle sonuçlanırlarsa.
Joe D

8

Tuhaf girinti stili.

Birkaç popüler stil var ve insanlar bu tartışmayı mezara götürecek. Ama bazen çok nadir, hatta evde yetişen bir girinti stili kullanan birini görüyorum. Bu, muhtemelen kendileri dışında kimseyle kodlanmadıklarının bir işaretidir.


2
ya da sadece “homojenleştirilmiş kodlama uygulamaları ağında" en iyi uygulamalarla "hiç alakası olmayan, yakalanmayan, çok değerli bir kişisel yetenek olduğuna dair bir işaret.
Anonim Tip

1
Umarım alaycısın. Birisi alışılmadık bir şekilde kodlama yapıyorsa, bu alarm zillerini çaldırmalıdır. İstedikleri kadar sanatsal olabilirler, ama yine de ... alarm zilleri.
Ken

2
Haskell / ML / F # 'nın dışında çok nadir görülmesine rağmen, oldukça nadir görülen bir tarz (Utrecht tarzı olarak adlandırıldığını düşünüyorum) var. "Modül Şekilleri" aşağı kaydırın: learnyouahaskell.com/making-our-own-types-and-typeclasses . Bu stildeki hoş şey, sık sık yapmayı unuttuğum yeni bir tane eklemek için sınırlayıcıyı önceki satırda değiştirmek zorunda kalmamanızdır.
Rei Miyasaka

@ReiMiyasaka Yedi yıl gecikti, ama ... Utrecht tarzı gerçekten beni rahatsız ediyor. Haskell belirtiminde, dikey olarak düzenlenmiş listelerde başka bir "düzen kuralı" uygulamamanın bir hata olduğuna inanıyorum. Bu şekilde ayrıştırıcı, girintiyi kontrol ederek yeni bir liste girişi algılayabilir; bu şekilde herkes listelerini zaten düzenler.
Ryan Reich,

@RyanReich Garip, yedi yıl sonra ve ben hala hoşuma gitti. Yine de katılıyorum; Tüm sözdizimsel sıkıntıları ve başarısızlıkları için F #, aynı zamanda düzenli kod için yapılan yeni satır ve girintilerle (çoğu durumda) öğelerin sınırlandırılmasını sağlar.
Rei Miyasaka

8

Enums veya global olarak tanımlanmış değişkenler yerine çok sayıda metin bloğu kullanma.

İyi değil:

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

Daha iyi:

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

En iyi:

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

Ya da en iyisi: Polimorfizm kullanın.
Lstor

8

Zayıf yazılan parametreler veya yöntemlerde dönüş değerleri.

public DataTable GetEmployees() {...}

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

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

2
+1: Net bir sözdizimsel hata olan şeylerden geçtiğinizde bile her şeyi sözde HTML tabloları olarak döndüren bazı “REST” web servisleriyle çalışmak zorundayım. Yetkili değil? Giriş tamamlandı mı? Sunucu kapasitesi fazla mı? 200 (artı bir sütunda, bir satırlık tabloda korkunç biçimde bir mesaj). AAaaaaaaaargh!
Donal Fellows,

7
  • Birden fazla üçlü operatör bir araya geldi, bu yüzden bir if...elsebloğa benzemek yerine bir bloğa if...else if...[...]...elsedönüştü
  • Alt çizgi veya camelCasing içermeyen uzun değişken isimleri. Çektiğim bazı kodlardan örnekler:$lesseeloginaccountservice
  • Bir dosyada yüzlerce kod satırı, çok az veya hiç yorum yok ve kod çok açık değil
  • Aşırı karmaşık ififadeler. if (!($lessee_obj instanceof Lessee && $lessee_obj != NULL))Koddan örnek: aşağıya indirdiğimif ($lessee_obj == null)

7

Kod kokusu: en iyi uygulamaları izlememek

Bu tür şeyler her zaman beni endişelendiriyor, çünkü herkesin ortalamanın üstünde bir sürücü olduğunu sandığı gerçekçilik var.

İşte sizin için bir haber flaşı: Dünya nüfusunun% 50'si ortalama zekanın altında. Tamam, yani bazı insanlar tam olarak ortalama bir zekaya sahip olacaklar, ama seçici olamayalım. Ayrıca, aptallığın yan etkilerinden biri, kendi aptallığınızı tanıyamayacağınızdır! Bu ifadeleri birleştirirseniz işler pek iyi görünmez.

Kodlara bakarken hangi şeyler anında alarm zili çalar?

Pek çok güzel şeyden bahsedilmiştir ve genel olarak en iyi uygulamaları takip etmemek kod kokusu gibi görünmektedir .

En iyi uygulamalar genellikle rastgele icat edilmez ve genellikle bir sebepten dolayı vardır. Çoğu zaman öznel olabilir, ancak deneyimlerime göre çoğunlukla haklılar. En iyi uygulamaları takip etmek sorun olmamalı ve neden oldukları gibi olduklarını merak ediyorsanız, görmezden gelmekten ve / veya şikayet etmekten çok araştırın - belki de haklı, belki de değil.

En iyi uygulamanın bir örneği, yalnızca bir satır olsa bile, her if-block ile birlikte kıvrıklıklar kullanmak olabilir:

if (something) {
    // whatever
}

Gerekli olduğunu düşünmeyebilirsiniz, ancak son zamanlarda bunun büyük bir hata kaynağı olduğunu okudum . Her zaman parantez kullanmak Yığın Taşması üzerinde de tartışılmıştır ve ifadelerin parantez içinde olup olmadığının kontrolü, Java için statik bir kod analizörü olan PMD'de de bir kuraldır .

Unutmayın: "Çünkü bu en iyi uygulama", "neden bunu yapıyorsunuz?" Sorusuna asla kabul edilebilir bir cevap değildir. Bir şeyin neden en iyi uygulama olduğunu açıkça söyleyemiyorsanız, o zaman en iyi uygulama değildir, bu bir batıl inançtır.


2
Bu bilgiçlik edici olabilir, ancak bence hangi ortalamadan seçim yaptığınız önemli. Anladığım kadarıyla dünya nüfusunun% 50'si ortanca zekanın altında (tanım gereği); ancak diğer ortalamalar aynı şekilde çalışmaz. Örneğin, aritmetik ortalaması 2 olan popülasyonu (1, 1, 1, 5) alın.
flamingpenguin

ummm, bir kullanıcının kaynak bulunmayan kıvrık parantezler hakkında cesur bir ifade verdiği "batıl inançları yapanlar" yazısını yayınladınız. Bunu en iyi uygulama örnekleri olarak görmüyorum.
Evan Plaice

@Evan: evet, haklısın. Bunun hakkında biraz daha ekledim, umarım bu yardımcı olur.
Vetle

4
Bunun sırrı, bir şeyin neden "en iyi uygulama" olduğu konusunda herhangi bir eleştirel düşünceye kapılmadan "en iyi uygulamaları" slavice takip eden insanlar. Bu yüzden "en iyi uygulama" terimini şiddetle beğenmedim, çünkü bazı insanlar için sürüyü düşünmeyi bırakıp takip etmek bir bahane. "En iyi uygulama" olduğu için, "neden bunu yapıyorsun?" Sorusuna asla kabul edilebilir bir cevap değildir. Bir şeyin neden en iyi uygulama olduğunu açıkça söyleyemiyorsanız, o zaman en iyi uygulama değildir, bu bir batıl inançtır.
Dan Dyer

Çok iyi bir yorum, Dan! Son iki satırı cevaba ekledim.
Vetle

6

“Bunun nedeni, froz alt sisteminin tasarımının tamamen etkilenmiş olmasıdır”.

Bu paragrafın tamamı boyunca devam ediyor.

Aşağıdaki refraktörün olması gerektiğini açıklarlar.

Ama yapmadı.

Şimdi, zaman veya yetkinlik sorunları nedeniyle o zaman patronları tarafından değiştirilemeyecekleri söylenebilirdi, ama belki de insanların küçük olması yüzünden.

Bir danışman bu j.randomu düşünüyorsa. programcı yeniden düzenleme işlemini yapamaz, daha sonra denetleyici bunu yapmalıdır.

Her neyse, bu durumun, kodun olası güç politikaları olan bölünmüş bir ekip tarafından yazıldığını ve alt sistem tasarımlarını yeniden canlandırmadıklarını biliyorum.

Gerçek hikaye. Senin başına gelebilirdi.


6

Kodun meşru olarak bir dosyaya mutlak yolla başvurması gerektiği bir örnek düşünebilir mi?


1
XML şemaları sayılır?
Nick T

1
Sistem konfigürasyon dosyaları. Genellikle ./configure tarafından ayarlanmalıdır, ancak bu bile bir yerde varsayılan bir değere ihtiyaç duyar.
eswald

4
/dev/nullve arkadaşlar iyi. Ama gibi şeyler bile /bin/bashşüphelidir - peki ya çok tuhaf bir sistem varsa /usr/bin/bash?
Tom Anderson

1
JAX-WS araçları tarafından üretilen Web hizmeti istemcisi kodu (en azından JBossWS ve Metro), WSDL dosyasına giden kesin bir mutlak yol içerir (iki kez!). Hangi muhtemelen çılgınca uygunsuz bir şey /home/tom/dev/randomhacking/thing.wsdl. Bu varsayılan davranış olduğu suç olarak delilik .
Tom Anderson

4
about /dev/null: Alışkanlık edindim, uygulamaları ve lib'leri altında tutmak için pencereleri geliştirirken c:\dev. Her nasılsa, bir klasör nullher zaman bu klasörün içinde otomatik olarak oluşturulur. Yemin ederim, bunu yapan hiçbir fikrim yok. (En sevdiğim böcek / özelliklerden biri)
Sean Patrick Floyd

6

Genel istisnaları yakalamak:

try {

 ...

} catch {
}

veya

try {

 ...

} catch (Exception ex) {
}

Bölge aşırı kullanımı

Genelde, çok fazla bölge kullanmak bana sınıflarınızın çok büyük olduğunu gösterir. Bu kod parçasını daha fazla araştırmam gerektiğini bildiren bir uyarı bayrağı.


Genel istisnaları yakalamak, yalnızca bir şey yapmadan yeniden düzenlemek durumunda bir sorundur. Gerçekten, bir istisna sınıfının yeterli olacağı çoğu şey için yeterli. Runtime_error kullanma eğilimindedir.
CashCow

'İstisna yakala ve at' örneği için +1 örneği. İstisna ile bir şey yapmıyorsanız, onu yakalamayın. En azından giriş yapın. En azından, tüm istisnaları yakalamanın ve kodun bu noktasında devam etmenin neden tamam olduğunu açıklayan bir yorumda bulunun.
EZ Hart

5

Oluşturmaya çalıştıkları soyutlamanın kötü bir şekilde anlaşıldığını gösteren sınıf adlandırma kuralları. Ya da bu bir soyutlamayı hiç tanımlamaz.

İlk dosyada bir kez gördüğüm bir VB sınıfında akla geliyor Datave ilk 30.000'den fazla satır vardı . En az yarım düzine diğer dosyaya bölünmüş, kısmi bir sınıftır. Yöntemlerin çoğu, isimleri gibi saklanan işlemlerin etrafındaki sarmalayıcılardı .FindXByYWithZ()

Daha az dramatik örneklerle bile, hepimizin, tamamen genel bir ünvan verilmiş olarak, zayıf bir tasavvuflu sınıfa 'tamamen attığımız' ve emin olduğumdan eminim.


5

Dilin temel işlevselliğini yeniden düzenleyen işlevler. Örneğin, bir dizenin ".length" özelliğine bir çağrı yapmak yerine JavaScript'te "getStringLength ()" yöntemini görürseniz, başınızın dertte olduğunu bilirsiniz.


5
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...
#define ...

Tabii belgelerin her türlü ve ara sıra iç içe olmadan #defines


Dün tam olarak bu "kalıbı" gördüm ... üretim kodunda ... ve daha da kötüsü ... C ++ üretim kodunda: - /
Oliver Weiler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.