mboost-dp1

Code that makes you go hmm -leg


Gå til bund
Gravatar #1 - Daniel-Dane
31. okt. 2010 21:09
"Legen" er simpel:
I er ved at læse/ordne kode, som er skrevet af en eller anden, som nok skulle have taget et kurses eller to til. Forklar endelig fejl og hvordan, skidtet skal skrives.

Tillad mig at komme med et par stykker for at demonstrere:

Hvorfor ikke bare returne !empty($a[q])?!
function tjekkage() {
global $a;
if(!empty($a[q])) {
return true;
} else {
return false;
}
}


Eller... Hvorfor ikke tage udgangspunkt i arrayens første element (efter man selvfølgelig har checket, at den ikke er tom)?
function findMAX($number_array)
{
$max = null;
foreach ($number_array as $value)
{
if ($max == null){$max = $value;}
if ($max < $value){$max = $value;}
}
return $max;
}
Gravatar #2 - onetreehell
31. okt. 2010 21:35
At putte en irc-klient i en spilmotor. Genialt! :P

Det vil også være rart hvis man skrev hvad det er skrevet i. Ovenstående er C++.
Gravatar #3 - Daniel-Dane
31. okt. 2010 21:59
Det er PHP, men okay.
Gravatar #4 - Windcape
31. okt. 2010 23:12
Jeg besluttede mig for at kigge lidt rundt på vores SVN, og fandt dette her i database-holdets kode, i vores RepositoryBase.


public void DeleteAll()
{
context.ExecuteStoreCommand("delete from Commands");
context.ExecuteStoreCommand("delete from ItemClassifications");
context.ExecuteStoreCommand("delete from MeasuredItems");
context.ExecuteStoreCommand("delete from Users");
context.ExecuteStoreCommand("delete from Logs");
context.ExecuteStoreCommand("delete from LogLevels");
context.ExecuteStoreCommand("delete from Tasks");
context.ExecuteStoreCommand("delete from Positions");
}


a) Det virker ikke
b) DeleteAll() er ikke defineret som en del af vores kontrakt (IRepository)
c) Vi bruger Entity Framework (LINQ), så hvorfor i helvede de har skrevet det der, fatter jeg bare ikke.

Men så ved jeg da hvad vi skal snakke om på morgendagens scrum møde :p

De tilhørende unit tests var også lidt WTF? at læse.
Gravatar #5 - arne_v
1. nov. 2010 03:27
#1

Der er masser af eksempler på:
http://thedailywtf.com/
Gravatar #6 - Emilm
1. nov. 2010 11:32
Generelt folk der deler deres kode-"struktur" op med 20-30 linieskift
Gravatar #7 - mazing
1. nov. 2010 13:56
Min egen kode for ½+ år siden. Min kode jeg skriver nu, om ½+ år, osv...
Gravatar #8 - Jonasee
1. nov. 2010 14:58
if (isSendPending == true)
{
return false;
}

C#

Ikke at det er forkert, men det er helle ikke lige frem nådvendigt
Gravatar #9 - Windcape
1. nov. 2010 15:37
#8

Det afhænger om isSendPending er bool? (ie. Nullable<Bool>), da man i så fald skal lave et explicit check.
Gravatar #10 - Jonasee
1. nov. 2010 18:08
#9

isSendPending er en bool, intet fansit der.
Gravatar #11 - onetreehell
13. nov. 2010 00:42
En funktion destroy_economy i en eller anden simulator (hvor der indgår økonomi, sjovt nok). Det er vist for at deallokkere alle objekterne i hukommelsen.

double penetration. En double som hedder penetration. Jeg kan ikke huske hvad den skulle bruges til, men meget sjovt :P

--
Jeg syntes lige at jeg ville genoplive tråden
Gravatar #12 - fjols
25. nov. 2010 09:57
if(p_var->AllIsSelected == 1)
c_SelectedForInstall = "1";

if(c_SelectedForInstall == "1")
{
...
}


og


...
else
{
int i;
i = 3;
}


SUP?
Gravatar #13 - arne_v
30. nov. 2010 01:04
#12

shit happens

Ofte er den slags kode et resultat af at der engang har været noget mere kode, som så siden er blevet slettet.
Gravatar #14 - fjols
30. nov. 2010 06:37
Ja, det er jeg klar over. Jeg synes bare det er lidt sjusket ikke at fjerne det, men sådan er det generelt i det program dette kommer fra.
Gravatar #15 - myplacedk
30. nov. 2010 09:18
Sjusket, ja. Men det er i det mindste tydeligt nok hvad der foregår, og du kan nemt rette koden til.

Ting som den slags her kan få mig op at ringe:

public final static int ONE = 2;

I første omgang må nogen have vist at selv om de skulle bruge tallet "1", kunne det ske at ændre sig. Det må være derfor de bruger en (konstant) variabel. Men hvorfor så kalde den "ONE", i stedet for noget som indikerer hvad den er til?
Og hvorfor helvede ikke i det mindste skrive en kommentar om hvad fa'n der foregår. *rage* Arrrrgh! *hoste* *hoste* *stønne* *falder-sammen-på-stolen* *tager-en-slurk-kaffe*
Gravatar #16 - Adagio
30. nov. 2010 10:41
Jeg faldt her for nogle år siden over en meget interessant tabel i en database:

Tabellen havde to kolonner: Tekst og Id
Navnet på tabellen var: JaEllerNej
Indholdet af tabellen:

Tekst (id)
Ja (1)
Nej (0)

:)
Gravatar #17 - Windcape
30. nov. 2010 12:08
myplacedk (15) skrev:
Ting som den slags her kan få mig op at ringe:
Ah, et klassisk eksempel på kode fra sprog der har en mangelfuld enumeration implementation :p
Gravatar #18 - myplacedk
30. nov. 2010 12:34
#17
Det har intet med enumeration at gøre. Pointen er dårlig navngivning. Kender du et brugbart sprog, hvor man ikke kan navngive variabler, metoder osv. dumt?
Gravatar #19 - Vandborg
30. nov. 2010 15:05
#18
Kunne være et fedt sprog med en awesome analytisk compiler :D

Den skulle give dig foreslag til meget bedre variable navne, dog stadig køre, bare give warnings like

Warning:char:2:line:12; FuckdSomethingName, try to find a more suited name for this variable like, MotherName.
Gravatar #20 - Windcape
30. nov. 2010 16:01
Vandborg1 (19) skrev:
Kunne være et fedt sprog med en awesome analytisk compiler :D
C# ? :-)

Jeg kan slå det til, så den sammen med min statisk analyse, også checker for dårlig navngivning, og manglede/mangelfuld dokumentation.
Gravatar #21 - tazimn
30. nov. 2010 19:07
Windcape (20) skrev:
C# ? :-)

Jeg kan slå det til, så den sammen med min statisk analyse, også checker for dårlig navngivning, og manglede/mangelfuld dokumentation.


Og du er sikker på at det ikke er din IDE som checker for det..?

Ellers må du meget gerne sende et link.. Kan ikke selv finde noget..
Gravatar #22 - Saxov
30. nov. 2010 20:12
myplacedk (15) skrev:
public final static int ONE = 2;
Tja, jeg har set en del af den slags i noget kode nogle indere har leveret, og tja, lad og sige det på den her måde - Der er ingen på denne side af Ural-bjergene der gerne vil velligeholde det kode de efterlod.

Grunden til de lavede ovenstående var at de havde fået besked på de ikke måtte hardcode magic numbers i koden. Så løser man det naturligtvis ved at lave nogle konstanter for alle de magic numbers man skal bruge, og så hardcode værdierne til de konstanter.

Men så igen, de efterlod også deres egen "variant" af AJAX, synkront javascript der bruger XLST templates til at præsentere data - så de var da næsten på sporet ;)
Gravatar #23 - myplacedk
30. nov. 2010 20:32
#22
Det passer meget godt med min erfaring med inder-kode. De har fanget nogle regler, som de så følger. Men måske har de misforstået reglen, eller også har de ikke forstået formålet. Men ofte ville det faktisk have været bedre hvis de ikke havde hørt om den regel.

Men en del af problemet er nok at man ikke har holdt nok øje med dem. Jeg forstår ikke helt hvordan man kan gennemføre et projekt, med gennemført dårlig kode. Hvorfor har nogen ikke reviewet det første kode, og reageret på den elendige kvalitet helt i starten af projektet?

Nå, men hvad ved jeg. Jeg har ikke selv haft noget med det at gøre, jeg har bare set resultatet. Og jeg har ikke lyst til at røre ved det.
Gravatar #24 - Ildhesten
30. nov. 2010 21:45
tazimn (21) skrev:
Windcape (20) skrev:
C# ? :-)

Jeg kan slå det til, så den sammen med min statisk analyse, også checker for dårlig navngivning, og manglede/mangelfuld dokumentation.


Og du er sikker på at det ikke er din IDE som checker for det..?

Ellers må du meget gerne sende et link.. Kan ikke selv finde noget..


Tror det Windcape mener med C#, er Visual Studio 2010 Premium eller Ultimate, som bl.a. kommer med en statisk analyse som udfører en række naming checks. Det kan også være at han kører med ReSharper som ligeledes indeholder diverse naming checks.

Gravatar #25 - arne_v
30. nov. 2010 22:06
#24

Sikkert. Men det er hverken sprog eller compiler. Men et tool integreret i IDE.

Og da den famøse linie meget ligner Java, så skal man lige bemærke at den slags tools integreret i IDE har været anvendt i Java verdenen i en 8-9 år.
Gravatar #26 - Ildhesten
30. nov. 2010 22:20
#25 Korrekt. Har heller aldrig påstået andet, forsøger blot at rette op på en andens sløsede sprogbrug :)

Vil da også anbefale de fleste Javaudviklere at smide fx. CheckStyle og FindBugs ind, fås både til Eclipse og IntelliJ. De er ganske gratis og hurtige at køre, og checker hhv. for om man overholder code conventions og heuristikker på buggy code.
Gravatar #27 - arne_v
30. nov. 2010 23:11
#26

Ah ja. Gode gamle checkstyle. Jeg har rettet meget kode til p.g.a. den!
Gravatar #28 - Ildhesten
1. dec. 2010 07:35
#27 Nu er der jo den finurlighed ved tools af den type som der er med stort set alt andet værktøj. Bruger man det med omtanke kan man skabe store ting. Gør man ikke kan man ødelægge endnu større ting. Men giver dig gerne ret, CheckStyle kan godt gå hen og blive ret fascistisk.

FindBugs kan også gå hen og blive farlig fordi nogle programmører netop tæver løs på deres kode med en hammer fordi en analyse pointerer et potentielt problem (som da lige hurtigt skal hotfixes), i stedet for at sætte sig ned og analysere problemet, og se om det har hold på sig. Sådan en tilgang kan også medføre at koden man skriver ender op i en tråd som denne.

Jeg pointerer på ingen måde at de 2 værktøjer er silver bullets til softwareudvikling, blot nyttige at have.
Gravatar #29 - Windcape
1. dec. 2010 14:55
arne_v (25) skrev:
Sikkert. Men det er hverken sprog eller compiler. Men et tool integreret i IDE.
Jeg vil dog påpege at statisk analyse plejer at kræve at det er integreret med det sprog man vil analysere ;-)

Og det kan det med C#. At man *også* kan med andre sprog, er jeg lidt ligeglad med.
Gravatar #30 - Vandborg
1. dec. 2010 17:12
OMG Windcape played the "I don't care-card"! How will arne_v get out of this mess?! Watch it in the next episode of "Code that makes you go hmm leg"! Stay tuned!
Gravatar #31 - Daniel-Dane
1. dec. 2010 19:44
Vandborg1 (30) skrev:
How will arne_v get out of this mess?!
arne_v does not care as well?
Gravatar #32 - Pally
1. dec. 2010 20:16
Ok, jeg snyder lidt. Min egen kode lavet bevidst bøvlet

using System;

namespace Obfusk
{
class Program
{
enum __ {_,__,}
enum ___ {_,__,___,____,_____,______,
_______,________,_________,}
enum xXx{xxxxx,xxxxX,xxxXx,xxxXX,xxXxx,xxXxX,xxXXx,xxXXX,
xXxxx,xXxxX,xXxXx,xXxXX,xXXxx,xXXxX,xXXXx,xXXXX,
Xxxxx,XxxxX,XxxXx,XxxXX,XxXxx,XxXxX,XxXXx,XxXXX,}
enum XxX{xxxxx,xxxxX,xxxXx,xxxXX,xxXxx,xxXxX,xxXXx,xxXXX,
xXxxx,xXxxX,xXxXx,xXxXX,xXXxx,xXXxX,xXXXx,xXXXX,
Xxxxx,XxxxX,XxxXx,XxxXX,XxXxx,XxXxX,XxXXx,XxXXX,}
private struct XxXxX { public xXx xxx; public XxX XXX;
public XxXxX(xXx XXx, XxX Xxx)
{xxx = XXx;XXX = Xxx;}};

static void Main(string[] args)
{
xXxXx(_(DateTime.Now) == __._ ?
XxX.xxXXX :
XxX.XxXXx,
xXx.xxxxx,
__.__, ___._);
Console.ReadLine();
}

private static __ _ (DateTime ____)
{
return (((____.Month % (int)___._________)
% (int)___.________)
% (int)___._______)
== 0
? __._
: __.__;
}

private static XxXxX xXxXx(XxX Xxx, xXx xxX,
__ _____, ___ ______)
{
Console.Write(
_____ == __.__ ?
Xxx != XxX.xxxxx ?
(char)((int)('A') - 1 + (int)Xxx) :
(char)((int)('a') - 1 + (int)xxX) :
______ == ___._ ?
' ' : ______ == ___.__ ?
' ' : ______ == ___.___ ?
' ' : ______ == ___.____ ?
'!' : '.');
return
Xxx == XxX.xxXXX ?
xXxXx(XxX.xxxxx, xXx.xXXXX, __.__, ___._) :
Xxx == XxX.XxXXx ?
xXxXx(XxX.xxxxx, xXx.xXxxX, __.__, ___._) :
xxX == xXx.xXXXX ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xxXxx, __.__, ___._) :
xXxXx(XxX.xxxxx, xXx.xXXxX, __.__, ___._) :
xxX == xXx.xxXxx ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___._) :
xXxXx(XxX.xxxxx, xXx.xXxxX, __.__, ___.__) :
xxX == xXx.XxxXX ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xXXXX, __.__, ___.__) :
xXxXx(XxX.xxxxx, xXx.XxXxx, __.__, ___.__) :
xxX == xXx.xXXxX ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xXXxX, __.__, ___.__) :
xXxXx(XxX.xxxxx, xXx.xxXxX, __.__, ___._) :
xxX == xXx.xxXxX ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.XxxXx, __.__, ___._) :
______ == ___.__ ?
xXxXx(XxX.xxxxx, xXx.xXXXx, __.__, ___._) :
xXxXx(XxX.xxxxx, xXx.XxxXx, __.__, ___.__) :
xxX == xXx.XxxXx ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___.____) :
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___.___) :
xxX == xXx.xXxxX ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___.__) :
xXxXx(XxX.xxxxx, xXx.xxXXX, __.__, ___._) :
xxX == xXx.XxXXx ?
xXxXx(XxX.xxxxx, xXx.xxXxX, __.__, ___.__) :
xxX == xXx.xXXXx ?
xXxXx(XxX.xxxxx, xXx.XxXxx, __.__, ___._) :
xxX == xXx.XxXxx ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.xxXxX, __.__, ___.___) :
xXxXx(XxX.xxxxx, xXx.xxxxX, __.__, ___._) :
xxX == xXx.xxxxX ?
xXxXx(XxX.xxxxx, xXx.xxXxx, __.__, ___.__) :
xxX == xXx.xxXXX ?
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___._____) :
_____ == __._ ?
______ == ___._ ?
xXxXx(XxX.xxxxx, xXx.XxxXX, __.__, ___._) :
______ == ___.__ ?
xXxXx(XxX.xxxxx, xXx.XxXXx, __.__, ___._) :
______ == ___.___ ?
xXxXx(XxX.xxxxx, xXx.XxxXX, __.__, ___.__) :
______ == ___.____ ?
new XxXxX(xXx.xxxxx, XxX.xxxxx) :
______ == ___._____ ?
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___.______) :
______ == ___.______ ?
xXxXx(XxX.xxxxx, xXx.xxxxx, __._, ___._______) :
______ == ___._______ ?
new XxXxX(xXx.xxxxx, XxX.xxxxx) :
new XxXxX(xXx.xxxxx, XxX.xxxxx) :
new XxXxX(xXx.xxxxx, XxX.xxxxx);
}
}
}


Edit: Øv. Code-feltet skulle ha' været lidt bredere, så er det langt lettere at læse...

Et styk positiv rating til den første der kan gennemskue hvad der sker.
Gravatar #33 - arne_v
2. dec. 2010 18:12
#28

Jeg er stor tilhænger af den slags værktøjer.

Og langt det meste af Java coding convention passer mig fint.

Men en ting har jeg meget svært ved at huske: mellemrummet i
(foo) bar
Gravatar #34 - arne_v
2. dec. 2010 18:15
Windcape (29) skrev:
Jeg vil dog påpege at statisk analyse plejer at kræve at det er integreret med det sprog man vil analysere


Jeg vil ikke kalde det integerret, men værktøjet skal naturligvis kende sproget.

Windcape (29) skrev:
Og det kan det med C#. At man *også* kan med andre sprog, er jeg lidt ligeglad med.


Jo. Men det er vel begrænset relevans at bringe C# på banen, når eksemplet er i et andet sprog, hvor muligheden har været tilgængelig i ca. 8 år længere end i C#!?!?
Gravatar #35 - arne_v
2. dec. 2010 18:23
Saxov (22) skrev:
Tja, jeg har set en del af den slags i noget kode nogle indere har leveret,


myplacedk (23) skrev:
Det passer meget godt med min erfaring med inder-kode.


Der findes vel ca. 1-2 mio. indiske software udviklere.

I skal ikke regne med at *alle* af dem er dårlige til at kode.

Indiske udviklere er meget ligesom alle andre udviklere: nogle få meget dygtige, en hel del gode, rigtigt mange middel, en hel del dårlig og nogle få totalt håbløse.

Der er ikke noget som forhindrer indere i at være dygtige.

Jeg vil gætte på at andelen af dårlige er lidt højere for indere end for danskere fordi en dansker der ikke har lyst til IT bare vælger at være arbejdsløs cand.mag. i middelalder italiensk eller arbejdsløs antropolog mens indere foretrækker at tage en IT uddannelse de ikke gide fremfor at sulte som gade tigger.

PS: undskyld til cand.mag.er i middelalder italiensk og antropologer for at bruge dem som eksempel.
Gravatar #36 - JesperZ
2. dec. 2010 19:25
Arne_v > Windcape
Gravatar #37 - myplacedk
3. dec. 2010 10:48
arne_v (35) skrev:
Der findes vel ca. 1-2 mio. indiske software udviklere.

I skal ikke regne med at *alle* af dem er dårlige til at kode.

Helt enig. Men det kræver en bevidst indsats, når stort set alle man taler med har lignende erfaring.

Som jeg var inde på kan det lige så godt skyldes en dårlig (dansk) kunde, som en dårlig (indisk) udvikler. Vores indere havde i hvert fald langt fra lige så gode arbejdsbetingelser som vores danske udviklere. Fx. var mange af vores standarder og øvrige dokumenter på dansk eller dårligt engelsk, vores support havde lukket mens de arbejdede osv.
Gravatar #38 - mazing
3. dec. 2010 14:35
#32 Pally
Koden tjekker om der er ferie ;)
Jeg snød lidt og kørte programmet, men så vidt jeg kan regne ud så er XxX og xXx en form for alfabet-tabel encoded/krypteret som diff fra (int)a - 1 og så ellers deropad.
Gravatar #39 - Pally
3. dec. 2010 14:47
mazing (38) skrev:
#32 Pally
Koden tjekker om der er ferie ;)
Jeg snød lidt og kørte programmet, men så vidt jeg kan regne ud så er XxX og xXx en form for alfabet-tabel encoded/krypteret som diff fra (int)a - 1 og så ellers deropad.

Ding Ding Ding.

Det er rimelig tæt på. Strenges skrives ud via en primitiv state-machine (lavet som en enorm one-liner aritmetisk-if)
Gravatar #40 - arne_v
8. dec. 2010 02:59
myplacedk (37) skrev:

når stort set alle man taler med har lignende erfaring.


Jeg kender en del indere som er gode.

Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login