mboost-dp1
Code that makes you go hmm -leg
- Forside
- ⟨
- Forum
- ⟨
- Programmering
"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])?!
Eller... Hvorfor ikke tage udgangspunkt i arrayens første element (efter man selvfølgelig har checket, at den ikke er tom)?
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;
}
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++.
Det vil også være rart hvis man skrev hvad det er skrevet i. Ovenstående er C++.
Jeg besluttede mig for at kigge lidt rundt på vores SVN, og fandt dette her i database-holdets kode, i vores RepositoryBase.
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.
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.
if (isSendPending == true)
{
return false;
}
C#
Ikke at det er forkert, men det er helle ikke lige frem nådvendigt
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
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
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*
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*
#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.
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.
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..
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.myplacedk (15) skrev:public final static int ONE = 2;
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 ;)
#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.
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.
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.
#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.
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.
#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.
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.
Jeg vil dog påpege at statisk analyse plejer at kræve at det er integreret med det sprog man vil analysere ;-)arne_v (25) skrev:Sikkert. Men det er hverken sprog eller compiler. Men et tool integreret i IDE.
Og det kan det med C#. At man *også* kan med andre sprog, er jeg lidt ligeglad med.
Ok, jeg snyder lidt. Min egen kode lavet bevidst bøvlet
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.
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.
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#!?!?
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.
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.
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)
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.