[alg] Slechtste programmeervoorbeelden deel 5 Vorige deel Overzicht

Pagina: 1 ... 4 ... 20 Laatste
Acties:

Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Verwijderd schreef op dinsdag 18 februari 2014 @ 09:58:
ik denk dat het nog beter is om jezelf Parallel.For aan te leren.
Nee, dat is het niet!

Niet alleen is het afhankelijk van de grootte van je workload of de overhead van het opzetten van N threads de moeite waard is.

Met name zijn dit soort uitspraken gevaarlijk omdat je, bij het gebruik van andere variabelen dan het huidige element in de collectie, al snel synchronisatiemiddelen in moet gaan zetten.
Voor Windows applicaties moet ook nog rekening gehouden worden met het feit dat je UI elementen alleen van de UI thread mag benaderen.

Het is fijn dat .NET multi thread programmeren makkelijker maakt, maar dat betekent nog niet dat het makkelijk is :)

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

Verwijderd

Markieman schreef op dinsdag 18 februari 2014 @ 12:40:
[...]


Nee, dat is het niet!

Niet alleen is het afhankelijk van de grootte van je workload of de overhead van het opzetten van N threads de moeite waard is.

Met name zijn dit soort uitspraken gevaarlijk omdat je, bij het gebruik van andere variabelen dan het huidige element in de collectie, al snel synchronisatiemiddelen in moet gaan zetten.
Voor Windows applicaties moet ook nog rekening gehouden worden met het feit dat je UI elementen alleen van de UI thread mag benaderen.

Het is fijn dat .NET multi thread programmeren makkelijker maakt, maar dat betekent nog niet dat het makkelijk is :)
Dat doet een programmeur toch al standaard om alles te programmeren zodat alle grafische wijzigingen naar de UI thread worden gestuurd i.p.v. rechtstreeks de UI aan te spreken?

Makkelijk is het zeker niet, maar mij ervaring is dat als je er eenmaal aan gewend bent en inderdaad alle valkuilen weet te omzeilen dat het heerlijk programmeren is (nogmaals mijn ervaring) :)

[ Voor 0% gewijzigd door Verwijderd op 18-02-2014 13:27 . Reden: spelvauten ]


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 13-09 10:55

Nick_S

++?????++ Out of Cheese Error

Martijn.C.V schreef op dinsdag 18 februari 2014 @ 10:50:
Iemand met wie ik had gewerkt had een periode wat minder concentratie, wat resulteerde in stukjes code als deze:
PHP:
1
2
3
4
5
$foo = true; // Nooit! anders dan true of false.

    if( $foo==true){ /* ... */;}
elseif( $foo==false){ /* ... */;}
else{ /* ... */ }


Mag iemand mij vertellen wanneer de else iets doet :D Zoveel van dit soort dingetjes, grappig om ze tegen te komen
Dat is voor de FileNotFound value van boolean.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Nee, dat doen programmeurs niet standaard. Heel vaak hoeft dat ook niet.

Mijn punt was dat je een advies geeft, waar een bijsluiter bij geleverd had moeten worden.

Er zijn genoeg ervaren programmeurs die in de praktijk weinig multi threaded hebben hoeven werken. Ook zijn er juniors die hier mee lezen en dit soort adviezen overnemen met alle risico's van dien.

Ter aanvulling: Potential Pitfalls in Data and Task Parallelism

[ Voor 16% gewijzigd door Markieman op 18-02-2014 12:58 ]

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Verwijderd schreef op dinsdag 18 februari 2014 @ 12:30:
[...]


O nee, dat doe ik (nog) niet mijn stelling verder af te zwakken, maar ik ga nu wel meer twijfelen over het performance verschil tussen een for en foreach loop. Laat ik het zo zeggen, als ik niet met "tegenbewijs" kan komen hebben jullie gelijk, afgesproken?
Ik zou altijd voor leesbare code gaan in plaats van dit soort micro-optimalisaties.
Daarom ga ik altijd voor foreach-loopjes tenzij ik een echt goede reden heb om de index te gebruiken.

En je zou ook niet vanwege performance voor class danwel een struct moeten kiezen.
Een struct kun je zien als iets fysieks en als je het als parameter meegeeft aan een methode, dan geef je ook iets fysieks mee (by value), terwijl een class een verwijzing naar iets is. Een struct kun je zien als een primitief type, maar dan net iets complexer, zoals een punt in een aantal dimensies.

DateTime is ook een struct, het is immers een punt in de tijd. :9

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Bij een class geef je de reference by value mee :P

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 07:49
Wat me wel opvalt. Vaak zijn artikelen van Indiërs vrij nietszeggend. Het lijkt erop dat ze plaatsen om het te plaatsen. Waarschijnlijk is dat goed voor hun cv, maar vaak zie je gewoon basis tutorial uitgeschreven.
Al was de performance tips iets uitgebreider dan het standaard stukje wat je vaak tegenkomt.

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Russel88 schreef op dinsdag 18 februari 2014 @ 16:29:
Wat me wel opvalt. Vaak zijn artikelen van Indiërs vrij nietszeggend. Het lijkt erop dat ze plaatsen om het te plaatsen. Waarschijnlijk is dat goed voor hun cv, maar vaak zie je gewoon basis tutorial uitgeschreven.
Al was de performance tips iets uitgebreider dan het standaard stukje wat je vaak tegenkomt.
Ja, ze worden afgerekend op hoeveel ze op SO bijdragen en hoeveel ze schrijven. Dus zie je veel artikelen / antwoorden op dat niveau.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 11:01
-Sander1981- schreef op maandag 17 februari 2014 @ 22:46:
C#:
1
2
3
4
for (int index = 0; index <= list.Count - 1; index++)
{
    // Doe iets met list[index]
}
Bij een vak waarbij de studenten een mergesort-variant moeten implementeren (ook C#) komt deze geweldige manier van een lijst doorlopen wel eens (te vaak) langs:

C#:
1
2
3
4
5
List<iets> mijnLijst; // java-mensen: in tegenstelling tot in Java, is een List in C# een ArrayList en geen LinkedList
while(mijnList.Count > 0) {
     // Doe iets met mijnLijst[0];
     mijnLijst.RemoveAt(0);
}

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

Verwijderd schreef op dinsdag 18 februari 2014 @ 10:10:
[...]
Dat kan ja, ligt eraan hoe groot de arrays zijn, maar het heeft zin als je meerdere cores tot je beschikking hebt, dan kan het aanzienlijk schelen in de performance.
Het ligt er ook aan hoeveel werk je te doen hebt voor elk van de items. Als dat veel is, dan kan multithreaden eerder uit dan als je alleen maar een enkele simpele bewerking te doen hebt.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Tom-Z schreef op dinsdag 18 februari 2014 @ 17:32:
[...]


Bij een vak waarbij de studenten een mergesort-variant moeten implementeren (ook C#) komt deze geweldige manier van een lijst doorlopen wel eens (te vaak) langs:

C#:
1
2
3
4
5
List<iets> mijnLijst; // java-mensen: in tegenstelling tot in Java, is een List in C# een ArrayList en geen LinkedList
while(mijnList.Count > 0) {
     // Doe iets met mijnLijst\[0];
     mijnLijst.RemoveAt(0);
}
Geweldig, je hebt zojuist een O(n log n) algoritme met een runtime van O(n*n) geimplementeerd... Waarom leer je ze dat soort low-level algoritmes trouwens niet in een low-level taal programmeren? Dat soort oefeningen in C# doen, waarbij de optimale implementatie al in de library (list.sort(myOrderingFunction)) zit, vind ik nogal doelloos. Of dwing af dat er met low-level arrays wordt gewerkt.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op dinsdag 18 februari 2014 @ 12:30:
[...]


O nee, dat doe ik (nog) niet mijn stelling verder af te zwakken, maar ik ga nu wel meer twijfelen over het performance verschil tussen een for en foreach loop. Laat ik het zo zeggen, als ik niet met "tegenbewijs" kan komen hebben jullie gelijk, afgesproken?
Tja, laat ik het zo zeggen : Je enige "tegenbewijs" doet gewoon iets anders in de for dan in de foreach.

Het hele probleem met dit soort dingen is dat het micro-optimalisaties zijn die juist de compiler 100x beter kan doen dan een vaste regel.

Die micro-optimalisaties zijn enkel maar van toepassing op de basis-elementen waarop een compiler zich helemaal kan uitleven qua optimalisaties en zijn totaal irrelevant bij bijv eigen list-implementaties (als ze niet al verdwijnen doordat je een hele zware count functie hebt).

Zeker op gebieden waar big-data gaat spelen wil je juist weer geen for .. count loop hebben omdat niet alle data al aanwezig hoeft te zijn waarbij je foreach rustig al kan lopen terwijl je for...count loop moet wachten totdat alle data gearriveerd is

Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Tom-Z schreef op dinsdag 18 februari 2014 @ 17:32:
[...]


Bij een vak waarbij de studenten een mergesort-variant moeten implementeren (ook C#) komt deze geweldige manier van een lijst doorlopen wel eens (te vaak) langs:

C#:
1
2
3
4
5
List<iets> mijnLijst; // java-mensen: in tegenstelling tot in Java, is een List in C# een ArrayList en geen LinkedList
while(mijnList.Count > 0) {
     // Doe iets met mijnLijst\[0];
     mijnLijst.RemoveAt(0);
}
Een List in Java is een Interface en kan dus net zo goed een ArrayList als een LinkedList zijn.

Acties:
  • 0 Henk 'm!

  • ObiTewodros
  • Registratie: April 2011
  • Laatst online: 05-04 22:22
Wat ik zelf altijd smerig vind is overvloed aan if-constructies. Men kan veel beter polymorfisme gebruiken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NeutraleGast schreef op woensdag 19 februari 2014 @ 00:44:
Wat ik zelf altijd smerig vind is overvloed aan if-constructies. Men kan veel beter polymorfisme gebruiken.
Reageer je nu ergens specifiek op?* Komt dit uit de lucht vallen? Waar komt deze opmerking vandaan? Want als we zo gaan beginnen en dat bedoel ik niet met een ondertoontje staat dit topic morgen nokkievol met dingen die "men" smerig vindt. Er is zo veel smerig. Het zou wel fijn zijn als je een concreet voorbeeld aanhaalt o.i.d.

* Je opmerking "overload aan if-constructies => polymorfisme gebruiken" is namelijk nogal... kort door de bocht en lang niet in alle gevallen van toepassing om 't maar even zacht uit te drukken.

[ Voor 16% gewijzigd door RobIII op 19-02-2014 01:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Hertog6
  • Registratie: April 2011
  • Laatst online: 02-09 08:57
Een stukje code dat ik zelf geschreven heb om van getalen zoals 3.4 3.40 van te maken en van 7 7.00 te maken.. Ik ben er zelf eigenlijk niet zo trots op maar om 4 uur snachts na wat glaasjes bier ben ik iig minder kritisch ;)

code:
1
2
3
4
5
6
7
8
9
10
11
$pieces = explode(".", $input);
if (count($pieces) > 1) {
    if (strlen($pieces[1]) == 1 || count($pieces) > 1) {
        $pieces[1] = $pieces[1] . "0";
    } elseif (strlen($pieces[1]) == 0 || count($pieces) == 0) {
        $pieces[1] = "00";
    }
} else {
    $pieces[1] = "00";
}
return $pieces[0] . "." . $pieces[1] ;

MacBook Pro Mid 2012 16Gb RAM | Xiaomi Mi2S 32 Gb


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hertog6 schreef op woensdag 19 februari 2014 @ 01:10:
maar om 4 uur snachts na wat glaasjes bier ben ik iig minder kritisch ;)
HOLY ... :D
Zélfs straalbezopen met een week slaaponthouding moet je toch na anderhalve regel toch denken... "dat moet toch anders, makkelijker en beter kunnen"? :X

[ Voor 5% gewijzigd door RobIII op 19-02-2014 01:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Hertog6
  • Registratie: April 2011
  • Laatst online: 02-09 08:57
RobIII schreef op woensdag 19 februari 2014 @ 01:29:
[...]

HOLY ... :D
Zélfs straalbezopen met een week slaaponthouding moet je toch na anderhalve regel toch denken... "dat moet toch anders, makkelijker en beter kunnen"? :X
Ja klopt ;) Maar ik had de nacht er voor ook al niet geslapen.. dus tegen de tijd dat mijn gedachte gang "Hee doet moet anders kunnen" was, lag ik al te slapen op mijn toetsenbord ;)

MacBook Pro Mid 2012 16Gb RAM | Xiaomi Mi2S 32 Gb


Acties:
  • 0 Henk 'm!

  • Oyster
  • Registratie: Januari 2003
  • Niet online

Oyster

Prince

Zo heftig. Wel waardering voor je doorzettingsvermogen. :p

code:
1
2
3
4
5
$number = 7;

echo sprintf('%0.2f', $number);    // --> 7.00

echo number_format((float)$number, 2, '.', '');    // --> 7.00

Acties:
  • 0 Henk 'm!

  • Hertog6
  • Registratie: April 2011
  • Laatst online: 02-09 08:57
Oyster schreef op woensdag 19 februari 2014 @ 01:56:
Zo heftig. Wel waardering voor je doorzettingsvermogen. :p

code:
1
2
3
4
5
$number = 7;

echo sprintf('%0.2f', $number);    // --> 7.00

echo number_format((float)$number, 2, '.', '');    // --> 7.00
Thx :) Ik ben op dit moment bezig om de code netter te maken.

In de categorie nog meer pareltjes uit Hertog6 zijn geschiedenis ;) Voor een schoolproject moesten wij een webshop achtig iets maken voor een online catering bedrijf. In de database stonden ook de ingredienten van een bepaald gerecht (ook wel menu genoemd) en moesten dus uit de voorraad afgetrokken worden. Dus stel we hebben een menu met een biefstukje, 300 gram dopewrten en 3 aardappelen, dan moest dat uit de tabel met voorraad worden afgetrokken, zodat op de website nog te zien was hoeveel menu's besteld konden worden. Dit was de code die dat laatste stukje regelde en de order in de order tabel plaatste ;) En dit was geschreven na 36 uur geen slaap, 0 alchohol en een deadline de volgende ochtend om kwart over 9 ;)

http://pastebin.com/gCiXLy1M

[ Voor 0% gewijzigd door Hertog6 op 19-02-2014 02:05 . Reden: Tikfoutje ]

MacBook Pro Mid 2012 16Gb RAM | Xiaomi Mi2S 32 Gb


Acties:
  • 0 Henk 'm!

  • diondokter
  • Registratie: Augustus 2011
  • Laatst online: 18:17

diondokter

Dum spiro, spero

Cool, dit heb ik zowaar in mijn nieuwste project zitten XD

C#:
180
181
182
183
184
185
186
187
188
189
190
191
192
SignalClass Signal = new SignalClass(MainForm);
lock (Locker)
{
    if (Signals.Count > 0)
    {
        Signal = Signals[0];
        Signals.RemoveAt(0);
    }
    else
    {
        Signal = null;
    }
} 


:F

Acties:
  • 0 Henk 'm!

  • Hertog6
  • Registratie: April 2011
  • Laatst online: 02-09 08:57
diondokter schreef op woensdag 19 februari 2014 @ 21:12:
Cool, dit heb ik zowaar in mijn nieuwste project zitten XD

C#:
180
181
182
183
184
185
186
187
188
189
190
191
192
SignalClass Signal = new SignalClass(MainForm);
lock (Locker)
{
    if (Signals.Count > 0)
    {
        Signal = Signals[0];
        Signals.RemoveAt(0);
    }
    else
    {
        Signal = null;
    }
} 


:F
Gezien ik zelf nooit in C# programmeer (behalve eens een keer een blauwe maandag), is mijn enige reactie..

Afbeeldingslocatie: https://i.chzbgr.com/maxW500/6206776320/h8C8C6CC4/

MacBook Pro Mid 2012 16Gb RAM | Xiaomi Mi2S 32 Gb


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

NeutraleGast schreef op woensdag 19 februari 2014 @ 00:44:
Wat ik zelf altijd smerig vind is overvloed aan if-constructies. Men kan veel beter polymorfisme gebruiken.
polymorfisme :/ the root of all evil

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 17:42
Zoijar schreef op donderdag 20 februari 2014 @ 08:31:
[...]
polymorfisme :/ the root of all evil
On a different note: wie heeft dit nou weer geschreven :X Wikipedia: Composition over inheritance

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 09-09 17:48
Ik had al ergens plaintext passwords in de database zien staan, maar nu vis ik dit uit een "edit user" formulier:
PHP:
1
2
3
                print("<input type=password size=16 maxlength=15 ");
                print("name=password value='$password'");
                print(">");


't is dat ik op een stoel zit, anders was mijn broek afgezakt.

[ Voor 10% gewijzigd door mcDavid op 20-02-2014 14:13 ]


  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 12-09 09:04

Acid_Burn

uhuh

Daar wordt een mens triest van :|

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:26

Dido

heforshe

Ach, passwords....

Alweer bijna een jaar geleden, ik ben er bijna overheen, maar het was moeilijk te verwerken.

User authentication via een 3rd party service. Ok, prima, mooi, hoeven wij daar niet teveel over na te denken.

Door 3rd party aangeboden functionaliteit was prima. Neuwe user aanmaken, user wiujzigen, en natuurlijk, user valideren.

Password wijzigen kon ook.

Daar hadden ze goed over nagedacht.

Als je het user-id opstuurde, dan kreeg je het password terug. Zodoende kon je dan controleren of een user niet hetzelfde password als nieuwe password instelde, geloof ik, 8)7

Wat betekent mijn avatar?


  • dbakker
  • Registratie: September 2002
  • Laatst online: 14-06-2024
In het kader van leesbaarheid kwam ik dit fijne stukje code tegen:

C:
1
2
3
4
// ergens binnen een functie....
// uint8_t* x

++(*x) ? (*x) : ++(*x);

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:28
Al die haakjes zijn overbodig...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zat me nog even af te vragen of dat geen UB is maar volgens mij niet.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 19:45

RayNbow

Kirika <3

.oisyn schreef op donderdag 20 februari 2014 @ 21:06:
Zat me nog even af te vragen of dat geen UB is maar volgens mij niet.
Je doelt op sequence points?
2. Between the evaluation of the first operand of the ternary "question-mark" operator and the second or third operand. For example, in the expression a = (*p++) ? (*p++) : 0 there is a sequence point after the first *p++, meaning it has already been incremented by the time the second instance is executed.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:28
Trouwens, in C++ kun je die expressie mooi implementeren als: ++(*x %= 255). In C mag dat niet, want het resultaat van een assignment is geen lvalue. Dan wordt het (*x %= 255, ++%x).

Daarmee wordt niet veel duidelijker wat de code nu precies doet. Ik zou er dus een regel commentaar bij zetten: get next byte value, skipping zero.

Wat me meevalt is dat dat nog vrij efficiënte (branchless!) assembly code oplevert ook:
GAS:
1
2
3
4
5
movzb   (%edx), %eax
cmp     $255, %al
setae   %cl
lea     1(%eax,%ecx), %eax
mov     %al, (%edx)

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Tsja, die jump wordt ook gewoon weggeoptimaliseerd (g++ met -O2 in ieder geval) als je

C:
1
2
(*x)++;
if (*x == 0) (*x)++;


doet, en dan snapt de casual reader wél wat je nu eigenlijk aan het doen bent.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:28
Voor zover ik kan zien niet, hoor. Niet dat die ene branch verder veel uit maakt...

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Heuj, typisch. Ik had het volgende gedaan:

lange link

En daar wordt gebruik gemaakt van cmove om tussen de +1 en de +2-variant te kiezen maar ik ben stiekem niet zo goed thuis in assembly, dus misschien lees ik het helemaal verkeerd... en er is dus vast ook een obvious reden dat deze variant en de in-een-functie-variant niet hetzelfde zijn

Overigens geeft mijn if-variant dezelfde assembly als de ternary operator. Deze variant is wel jumpless:

C:
1
2
3
4
5
6
int baq(uint8_t *x)
{
    *x++;
    *x += (*x == 0);
    return *x;
}

[ Voor 10% gewijzigd door ValHallASW op 21-02-2014 00:30 ]


Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 07:49
Verwijderd schreef op dinsdag 18 februari 2014 @ 12:30:
[...]


O nee, dat doe ik (nog) niet mijn stelling verder af te zwakken, maar ik ga nu wel meer twijfelen over het performance verschil tussen een for en foreach loop. Laat ik het zo zeggen, als ik niet met "tegenbewijs" kan komen hebben jullie gelijk, afgesproken?
Puur uit nieuwsgierigheid. Heb je al een scenario gevonden waarbij de for loop significant sneller is?

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Wat is daar mis mee dan? Ik mis denk ik iets. Compositie (of private inheritance in bepaalde gevallen) is idd bijna atijd beter dan public inheritance.

[ Voor 13% gewijzigd door Zoijar op 21-02-2014 08:32 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Uit de tekst van het wikipedia-artikel wordt me niks duidelijk, dat is er waarschijnlijk mis mee...

[ Voor 20% gewijzigd door MBV op 21-02-2014 09:02 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Hoe oud is iemand op een bepaalde datum:

C#:
1
2
3
4
5
6
7
8
9
10
public static int ConvertToAge(this DateTime value, DateTime referenceDate)
{
    int lReferenceDate = int.Parse(referenceDate.ToString("yyyyMMdd"));
    int lOriginalDate = int.Parse(value.ToString("yyyyMMdd"));
    string lDifference = (lReferenceDate - lOriginalDate).ToString();
    string lAge = "0";
    if (lDifference.Length > 4)
        lAge = lDifference.Substring(0, lDifference.Length - 4);
    return int.Parse(lAge);
}


|:(

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 07:49
Grijze Vos schreef op vrijdag 21 februari 2014 @ 09:09:
Hoe oud is iemand op een bepaalde datum:

C#:
1
2
3
4
5
6
7
8
9
10
public static int ConvertToAge(this DateTime value, DateTime referenceDate)
{
    int lReferenceDate = int.Parse(referenceDate.ToString("yyyyMMdd"));
    int lOriginalDate = int.Parse(value.ToString("yyyyMMdd"));
    string lDifference = (lReferenceDate - lOriginalDate).ToString();
    string lAge = "0";
    if (lDifference.Length > 4)
        lAge = lDifference.Substring(0, lDifference.Length - 4);
    return int.Parse(lAge);
}


|:(
Mooie code man.
Iemand van de oude school die omgeschoold is naar C#.

Wat doet eigenlijk dat woordje this in de input param? Foutje, of iets wat ik niet ken?

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Dat maakt van ConvertToAge een extension method.

Dus:
C#:
1
2
3
DateTime foo = new DateTime(1980, 3, 5);

var result = foo.ConvertToAge(DateTime.Now);

[ Voor 31% gewijzigd door kenneth op 21-02-2014 09:26 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 07:49
kenneth schreef op vrijdag 21 februari 2014 @ 09:25:
Dat maakt van ConvertToAge een extension method.

Dus:
C#:
1
2
3
DateTime foo = new DateTime(1980, 3, 5);

var result = foo.ConvertToAge(DateTime.Now);
Wow. Gaaf.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik ontving laatst de volgende e-mail (naam is gewijzigd om de persoon te beschermen):



From: Ben

I have added *.ben as cgi-script handler on Apache in the control panel.
Ad the same time http://PRODUCTIEOMGEVING got an 500 Iternal Server Error.
It was ment to to try a PERL script.

Please do contact me as soon as possible

Regards
Ben Prutser

Acties:
  • 0 Henk 'm!

  • Tarabass
  • Registratie: Februari 2008
  • Laatst online: 09-04 17:02

Tarabass

Webmaster

Russel88 schreef op vrijdag 21 februari 2014 @ 09:24:
[...]


Mooie code man.
Iemand van de oude school die omgeschoold is naar C#.

Wat doet eigenlijk dat woordje this in de input param? Foutje, of iets wat ik niet ken?
En hoe vaak heb je hem zelf al als 'gewone' static mehod aangeroepen? :P

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 17:42
Zoijar schreef op vrijdag 21 februari 2014 @ 08:30:
[...]
Wat is daar mis mee dan? Ik mis denk ik iets. Compositie (of private inheritance in bepaalde gevallen) is idd bijna atijd beter dan public inheritance.
MBV schreef op vrijdag 21 februari 2014 @ 09:02:
Uit de tekst van het wikipedia-artikel wordt me niks duidelijk, dat is er waarschijnlijk mis mee...
Dat dus. De Talk sectie spreekt ook boekdelen: Wikipedia: Talk:Composition over inheritance
Ik weet wat Composite Reuse Principle inhoud, maar dat artikel is zo slecht geschreven dat het mensen alleen op het verkeerde been kan zetten. Beter zetten ze er een verwijzing in naar een fatsoenlijk boek, dat helpt nog meer dan deze inhoud.

Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 07:49
Tarabass schreef op vrijdag 21 februari 2014 @ 13:08:
[...]

En hoe vaak heb je hem zelf al als 'gewone' static mehod aangeroepen? :P
Geen een keer. Heb serieus nog nooit eerder extensions gezien. Heb het vanochtend aan een collega laten zien. Zijn bureau stond opeens scheef bij wijze van spreken.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Tip: nu je deze nieuwe gave kennis hebt gedaan, denk heel goed na voordat je extension methods gaat toevoegen aan je eigen codebase. ;) Zeker als je je eigen classes gaat extenden.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Russel88
  • Registratie: Juli 2009
  • Laatst online: 07:49
Grijze Vos schreef op vrijdag 21 februari 2014 @ 15:14:
Tip: nu je deze nieuwe gave kennis hebt gedaan, denk heel goed na voordat je extension methods gaat toevoegen aan je eigen codebase. ;) Zeker als je je eigen classes gaat extenden.
Lol. Had meteen een static hulp functie gewijzigd in een extentie. Leuk spul.
Was het eigenlijk alleen van plan om standaard types van .Net te extenden zoals datum, strings e.d. Spul wat je vroeger in een helper class stopt.

Zie zo 1,2,3 niet wat de voordelen zijn van eigen klasse extenden, eerder nadelen.Neem aan dat je bedoelt dat je dit moet vermijden.

Acties:
  • 0 Henk 'm!

  • Tarabass
  • Registratie: Februari 2008
  • Laatst online: 09-04 17:02

Tarabass

Webmaster

Russel88 schreef op vrijdag 21 februari 2014 @ 15:00:
[...]


Geen een keer. Heb serieus nog nooit eerder extensions gezien. Heb het vanochtend aan een collega laten zien. Zijn bureau stond opeens scheef bij wijze van spreken.
Bij mijn vorige baan gaf ik bij mijn oud-collega aan dat een bepaalde extensie totaal niet deed daar waar hij voor bedoeld was. Hij had het 'geschreven', maar wist niet toch wat een extensie was. Deze werd alleen maar als static functie gebruikt. Leuk gejat van internet dus..

Het was overigens een enum-extension die de description-tag uitlas (een tag die wij nergens gebruikte) en als deze tag niet gevonden werd gaf hij enum.ToString("G') terug. Ze hadden dus gewoon overal ToString("G') kunnen gebruiken. :P

Ik vind extensions erg fijn, maar je moet wel opletten dat het geen wildgroei van extensions wordt. Ze komen er allemaal bij te staan in intellisense..

Acties:
  • 0 Henk 'm!

  • Xudonax
  • Registratie: November 2010
  • Laatst online: 02-09 13:25
Laatst tegengekomen in de code van een stagiair van ons... En dit is slechts één van de vele voorbeelden waarbij de ORM van Django half overgeslagen word. Ik ben toch maar eens even gaan praten of hij wist wat de ORM was, deed en kon :P

Daarna mocht 'ie wel gezellig zelf op zoek naar alle plekken waar 'ie dit deed om het te fixen :+

Python:
1
2
3
4
5
6
7
company = request.user.get_profile().company
vacancies = Vacancy.objects.filter(company=company).all()
vacancy_list = list()

for vacancy in vacancies:
    if vacancy.status = Vacancy.STATUS_ONLINE:
        vacancy_list.append(vacancy)


Als 'ie er nou nog zoiets van gemaakt had:
Python:
1
2
3
4
company = request.user.get_profile().company
vacancies = Vacancy.objects.filter(company=company)

vacancy_list = filter(lambda x: x.status == Vacancy.STATUS_ONLINE, vacancies)


Dan had ik 'em tenminste nog bonuspunten kunnen geven voor het gebruik van (semi) functionele trucjes in Python :P

De meest efficiente manier is natuurlijk:

Python:
1
2
company = request.user.get_profile().company
vacancies = Vacancy.objects.filter(company=company, status=Vacancy.STATUS_ONLINE)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op donderdag 20 februari 2014 @ 22:58:
Trouwens, in C++ kun je die expressie mooi implementeren als: ++(*x %= 255). In C mag dat niet, want het resultaat van een assignment is geen lvalue. Dan wordt het (*x %= 255, ++%x).

Daarmee wordt niet veel duidelijker wat de code nu precies doet. Ik zou er dus een regel commentaar bij zetten: get next byte value, skipping zero.

Wat me meevalt is dat dat nog vrij efficiënte (branchless!) assembly code oplevert ook:
GAS:
1
2
3
4
5
movzb   (%edx), %eax
cmp     $255, %al
setae   %cl
lea     1(%eax,%ecx), %eax
mov     %al, (%edx)
Grappig dat je loopt te kunstelen met modulo terwijl de compiler er in feite weer de originele conditional van maakt :D

(sort of, er staat *x = *x + 1 + (*x == 255))

[ Voor 3% gewijzigd door .oisyn op 23-02-2014 13:14 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Xudonax schreef op vrijdag 21 februari 2014 @ 19:43:
Laatst tegengekomen in de code van een stagiair van ons... En dit is slechts één van de vele voorbeelden waarbij de ORM van Django half overgeslagen word. Ik ben toch maar eens even gaan praten of hij wist wat de ORM was, deed en kon :P
:D Dat is zoiets als studenten numpy aan proberen te leren. Als je één keer vergeet expliciet te zeggen 'je mag geen for gebruiken' dan komen ze vrolijk weer met

Python:
1
2
3
4
5
6
throws = random.choice([0,1], [10000,3])

counter = 0
for set in throws:
    if set[0] + set[1] + set[3] == 3:
        counter += 1


in plaats van
code:
1
2
nheads = sum(throws, axis=1)
counter = sum(nheads == 3, axis=0)

Acties:
  • 0 Henk 'm!

  • Xudonax
  • Registratie: November 2010
  • Laatst online: 02-09 13:25
Ach ja, stagiaires hebben zo hun eigen manieren om het werk leuk te houden :D Komen ook vaak zat oplossingen uit waarbij ik zoiets heb van "ok... dat kan ook ja". Ik moet wel zeggen dat het een leuke manier is om (van andermans fouten) te leren.

Acties:
  • 0 Henk 'm!

Verwijderd

Russel88 schreef op vrijdag 21 februari 2014 @ 08:12:
[...]


Puur uit nieuwsgierigheid. Heb je al een scenario gevonden waarbij de for loop significant sneller is?
Yep,

Ik zal dat deze week posten, ik heb ook scenarios gevonden waarbij de foreach loop sneller is. 8)7

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Wat is daarbij jouw drempel voor 'significant'? Voor mij is dat niet statistisch significant (gewoon een miljoen keer draaien tot je het verschil ziet), maar iets van 10%. Bij een lager verschil zal ik altijd voor de beter leesbare variant kiezen.

Acties:
  • 0 Henk 'm!

Verwijderd

MBV schreef op zondag 23 februari 2014 @ 12:10:
Wat is daarbij jouw drempel voor 'significant'? Voor mij is dat niet statistisch significant (gewoon een miljoen keer draaien tot je het verschil ziet), maar iets van 10%. Bij een lager verschil zal ik altijd voor de beter leesbare variant kiezen.
10% tot 50% sneller....

Edit: Even duidelijk zijn, geldt ook voor één specifiek voorbeeld voor de foreach loop.

[ Voor 10% gewijzigd door Verwijderd op 23-02-2014 12:19 ]


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

MBV schreef op zondag 23 februari 2014 @ 12:10:
Wat is daarbij jouw drempel voor 'significant'? Voor mij is dat niet statistisch significant (gewoon een miljoen keer draaien tot je het verschil ziet), maar iets van 10%. Bij een lager verschil zal ik altijd voor de beter leesbare variant kiezen.
Ligt er erg aan waar natuurlijk. In een hot path zou ik voor 1% een moeilijk leesbare variant gebruiken. In reactie eenmalige events zou ik rustig iets gebruiken dat tien keer zo traag is als het beter leesbaar is. Klassieke verhaal van optimizen waar het belangrijk is.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 13-09 00:05
Minder dan 10 procent geeft een vrij grote zekerheid dat een real life scenario precies het tegenovergestelde doet van wat je verwacht, zeker in interpreted languages.

Acties:
  • 0 Henk 'm!

  • ObiTewodros
  • Registratie: April 2011
  • Laatst online: 05-04 22:22
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public static void main(String[] args) {
        Random iljdf = new Random();
        final int krhvn = 1000000;
        final int lovfety[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0};
        for (int yfde = 0; yfde < krhvn; yfde++) {
            int htsdoh = iljdf.nextInt(21);
            lovfety[htsdoh] += 1;

        }

        for (int jbr = 0; jbr < lovfety.length; jbr++) {
            double a = (((double)lovfety[jbr] / (double)krhvn)*100);
            double jsfdnf = (Math.round(a*100.0)/100.0);
            System.out.println(jbr + " kwam " + lovfety[jbr] + " voor " + jsfdnf + " % van totaal");
        }
    }


Variabele namen bepaal je door op je toetsenbord te ramen.

[ Voor 4% gewijzigd door ObiTewodros op 24-02-2014 21:56 ]


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ziet er uit als obfuscated.

Acties:
  • 0 Henk 'm!

Verwijderd

Dat lijkt er inderdaad op dat iemand een homemade obfuscation heeft gebruikt. De gebruikte lettercombinaties zijn namelijk niet heel logisch als je naar een QWERTY-toetsenbord kijkt om at random even te kiezen.

Acties:
  • 0 Henk 'm!

Verwijderd

kenneth schreef op vrijdag 21 februari 2014 @ 09:25:
Dat maakt van ConvertToAge een extension method.

Dus:
C#:
1
2
3
DateTime foo = new DateTime(1980, 3, 5);

var result = foo.ConvertToAge(DateTime.Now);
De extension method (buiten de code) is zelf eigenlijk ook wel een voorbeeldje van een slecht voorbeeld. De age zegt immers iets over de person en niet over de date. Je zou nu immers de ConvertToAge method kunnen gebruiken op een datetime variabele die helemaal niets met leeftijden te maken heeft, maar gewoon een timestamp is. :P

Acties:
  • 0 Henk 'm!

  • Down
  • Registratie: Februari 2005
  • Laatst online: 13:06
Verwijderd schreef op dinsdag 25 februari 2014 @ 09:50:
[...]


De extension method (buiten de code) is zelf eigenlijk ook wel een voorbeeldje van een slecht voorbeeld. De age zegt immers iets over de person en niet over de date. Je zou nu immers de ConvertToAge method kunnen gebruiken op een datetime variabele die helemaal niets met leeftijden te maken heeft, maar gewoon een timestamp is. :P
Lijkt me niet juist. Niet alleen personen zijn gebonden aan een leeftijd, maar in principe alles wat op een bepaalde datum tot stand is gekomen.

Mother north, how can they sleep while their beds are burning?


Acties:
  • 0 Henk 'm!

Verwijderd

Down schreef op dinsdag 25 februari 2014 @ 09:56:
[...]


Lijkt me niet juist. Niet alleen personen zijn gebonden aan een leeftijd, maar in principe alles wat op een bepaalde datum tot stand is gekomen.
Ja, ik noemde heel specifiek een persoon. Dat is wel een heel specifiek voorbeeld, Je hebt wel een punt hier.

Ik vind dit meer business logica (Omdat hij daarom zeer waarschijnlijk voor ingebouwd is) en dat soort dingen horen naar mijn mening niet in extension methods, maar dat maakt het dan natuurlijk niet direct een slecht voorbeeld :).

Acties:
  • 0 Henk 'm!

  • Down
  • Registratie: Februari 2005
  • Laatst online: 13:06
Verwijderd schreef op dinsdag 25 februari 2014 @ 11:04:
[...]


Ja, ik noemde heel specifiek een persoon. Dat is wel een heel specifiek voorbeeld, Je hebt wel een punt hier.

Ik vind dit meer business logica (Omdat hij daarom zeer waarschijnlijk voor ingebouwd is) en dat soort dingen horen naar mijn mening niet in extension methods, maar dat maakt het dan natuurlijk niet direct een slecht voorbeeld :).
Een extension method is niks anders dan syntactische suiker voor een static method. Waarom zou business logica niet in een static method kunnen staan?

Mother north, how can they sleep while their beds are burning?


Acties:
  • 0 Henk 'm!

Verwijderd

Down schreef op dinsdag 25 februari 2014 @ 14:04:
[...]


Een extension method is niks anders dan syntactische suiker voor een static method. Waarom zou business logica niet in een static method kunnen staan?
Zullen we die discussie op een andere plek anders voeren dan dit topic :)(Als jij hem interessant vindt)? Die hoort zeker niet in dit topic over slechte programmeervoorbeelden thuis.

Persoonlijk hoef ik hem echter niet te voeren, want naar mijn mening is dat iets wat heel persoonlijks is en daardoor kun je daar niet echt een goede discussie overvoeren, hooguit standpunten weergeven en in oneindige ja-nee's terecht komen.

Acties:
  • 0 Henk 'm!

  • Down
  • Registratie: Februari 2005
  • Laatst online: 13:06
Verwijderd schreef op dinsdag 25 februari 2014 @ 14:44:
[...]


Zullen we die discussie op een andere plek anders voeren dan dit topic :)(Als jij hem interessant vindt)? Die hoort zeker niet in dit topic over slechte programmeervoorbeelden thuis.
Jij vindt het een slecht programmeervoorbeeld, dus dit lijkt me dan het topic bij uitstek om de discussie te voeren?
Persoonlijk hoef ik hem echter niet te voeren, want naar mijn mening is dat iets wat heel persoonlijks is en daardoor kun je daar niet echt een goede discussie overvoeren, hooguit standpunten weergeven en in oneindige ja-nee's terecht komen.
Lijkt me een vreemde opmerking. Zo kun je elk discussieonderwerp wel afdoen als zijnde 'persoonlijk'. Prima als jij vindt dat iets is zoals het is, maar dan wil ook wel argumenten horen. Ik ben nog steeds benieuwd naar waarom business logica niet in een static method zou kunnen staan.

Mother north, how can they sleep while their beds are burning?


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik verklaar MtGox tot slechtste programmeervoorbeeld ooit.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • M.l.
  • Registratie: April 2011
  • Laatst online: 06-05 18:04
.oisyn schreef op dinsdag 25 februari 2014 @ 14:57:
Ik verklaar MtGox tot slechtste programmeervoorbeeld ooit.
Ze hebben een bug niet verholpen die al bekend was, dat was waarschijnlijk dus niet hun eigen code.
Ik weet niet of ze een soort van verzekering hebben tegen fraude die hiermee te plegen is, maar hoe dan ook hebben ze veel te veel invloed gehad op de digitale valuta en ik verdenk ze ervan dat ze er zelf misbruik van hebben gemaakt.

Bitcoins verduisteren wat er toe leid dat de koers even flink daalt, daarna goedkoop Bitcoins inslaan om gedupeerden te "vergoeden".

Nu is er ook een document online wat van MT.Gox afkomstig lijkt, maar dat is niet te verifieren. Ik denk dat het wel van hun is, maar dat ze de mogelijkheid openhouden om te kunnen zeggen "Dat is niet van ons.", terwijl ze toch weer wat vertrouwen willen wekken.

Ontopic:

Op mijn studie elektrotechniek moeten we uiteraard ook aan de slag met programmeren. We programmeren een microcontroller (atXmega128a4u) in C.
Een klasgenoot wilde een array van 8 bytes op de volgende manier manipuleren: voor iedere byte, als er iets in zit word het getal 2i (i is de iste), als het nul is blijft het nul.

Dit was ongeveer de code die ik tegenkwam:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
uint8_t byte_array[8];

...

for(int i = 0; i < 8; i++){
    if(byte_array[i] == 0){
        byte_array[i] = 0;
    } else {
        switch(i){
            case 0:
                byte_array[i] = 0b00000001;
                break;
            case 1:
                byte_array[i] = 0b00000011;
                break;
            case 2:
                byte_array[i] = 0b00000111;
                break;
            case 3:
                byte_array[i] = 0b00001111;
                break;
            case 4:
                byte_array[i] = 0b00011111;
                break;
            case 5:
                byte_array[i] = 0b00111111;
                break;
            case 6:
                byte_array[i] = 0b01111111;
                break;
            case 7:
                byte_array[i] = 0b11111111;
                break;
        }
    }
}


Zelf kwam ik hier op:

code:
1
2
3
4
5
6
7
uint8_t byte_array[8];

...

for(int i = 0; i < 8; i++)
    if(byte_array[i])
        byte_array[i] = ~((uint8_t)0xff << i);


Scheelt een behoorlijk stuk werk, ruimte op je scherm en ook wat programmeerbaar geheugen op een microcontroller.

edit: typo en een ander foutje

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

M.l. schreef op dinsdag 25 februari 2014 @ 15:26:
[...]


Ze hebben een bug niet verholpen die al bekend was, dat was waarschijnlijk dus niet hun eigen code.
Dit plaatje is zojuist op reddit gepost. Geeft een beetje de strekking van mijn reactie weer.

Afbeeldingslocatie: http://i.imgur.com/xMeW43a.jpg

[ Voor 15% gewijzigd door .oisyn op 25-02-2014 18:00 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Loller1
  • Registratie: April 2011
  • Laatst online: 20-08 12:18
Zat enkele dagen geleden te kijken in de code van een project waar ik aan meewerkte toen ik een lijntje "required_once" tegenkwam. Het php document waar het naar verwees zag er zo uit:
HTML:
1
2
3
4
5
6
7
8
9
10
<html>
    <body>
        <head>
            <!doctype html="5.0">
            <meta charset="utf-8">
            <title>.</title>
        </head>
        .
    </body>
</html>

Vaagste HTML die ik ooit heb gezien, en sinds het bestand, behalve dit, helemaal leeg was, vraag ik me ook af waarom het opgeroepen werd. Heb echter nooit gevonden wie dit er in had gezet.

Acties:
  • 0 Henk 'm!

Verwijderd

Down schreef op dinsdag 25 februari 2014 @ 14:52:
[...]


Jij vindt het een slecht programmeervoorbeeld, dus dit lijkt me dan het topic bij uitstek om de discussie te voeren?


[...]


Lijkt me een vreemde opmerking. Zo kun je elk discussieonderwerp wel afdoen als zijnde 'persoonlijk'. Prima als jij vindt dat iets is zoals het is, maar dan wil ook wel argumenten horen. Ik ben nog steeds benieuwd naar waarom business logica niet in een static method zou kunnen staan.
Ik waag er nog 1 bericht in dit topic aan, om mijn standpunt te verduidelijken. Ja, persoonlijk vind ik het een niet al te best voorbeeld van goede code, maar jij had wel degelijk een punt met je commentaar op mijn reactie.

Het gebruik van business logica en bepaalde soorten acties in extension methods is al een behoorlijk onderwerp van discussie, waarbij er geen correct antwoord is. Er is nog niet genoeg informatie/data over verzameld om een best practise te definieren en tot op dat punt kunnen we er best over discusseren, maar niet in een topic dat puur over slechte programmeervoorbeelden gaat. Daarnaast moeten we waken om niet in een welles-nietus discussie te belanden en overtuigen zal weinig tot geen nut hebben, daarom zie ik er momenteel geen verdere meerwaarden qua discussie in.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op dinsdag 25 februari 2014 @ 09:50:
[...]


De extension method (buiten de code) is zelf eigenlijk ook wel een voorbeeldje van een slecht voorbeeld. De age zegt immers iets over de person en niet over de date. Je zou nu immers de ConvertToAge method kunnen gebruiken op een datetime variabele die helemaal niets met leeftijden te maken heeft, maar gewoon een timestamp is. :P
Dat is debateerbaar. ;) Ben het niet per se met je oneens. Maar goed, bigger fish to fry here. De spaghetti is niet te harden. Gelukkig is dit niet net nieuwe code ofzo. |:(

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Anthirian
  • Registratie: April 2009
  • Laatst online: 19:34

Anthirian

In Trance We Trust

.oisyn schreef op dinsdag 25 februari 2014 @ 18:00:
[...]


Dit plaatje is zojuist op reddit gepost. Geeft een beetje de strekking van mijn reactie weer.

[afbeelding]
Netjes hoor. Zo hanteer ik ook altijd passwords 8)7

Mijn Films en TV Series, Games en Muziek.


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Wat doe je als je code niet meer werkt wanneer iemand anders bedenkt dat de compiler opties weer eens goed gezet (O3) moeten worden?

A: Bedenken dat je dan waarschijnlijk een fout in je code hebt en die oplossen, of B: bij het problematische stukje code het volgende zetten:

C:
1
2
3
4
5
6
7
#if defined(__CC_ARM) // Keil/MDK-ARM
#pragma O0
#pragma Ospace
#elif defined(__IAR_SYSTEMS_ICC__) // IAR/EWARM
#pragma optimize=low
#endif
 


Probleem was overigens variabelen die niet als volatile gedeclareerd waren en dat wel moesten zijn.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12-09 15:22

.oisyn

Moderator Devschuur®

Demotivational Speaker

.oisyn schreef op dinsdag 25 februari 2014 @ 18:00:
[...]


Dit plaatje is zojuist op reddit gepost. Geeft een beetje de strekking van mijn reactie weer.

[afbeelding]
Kwam zojuist deze thread tegen op reddit. Mind will be blown, bricks will be shat.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Mwah je zult nog staan te kijken hoe vaak het voorkomt dat er geen dev/test/accept omgeving is. Zelfs wanneer het een paar keer goed fout gaat leren mensen het gewoon niet.

Niet echt mind blown of bricks shat dus.

Wat wel mind blown voor mij is de hele situatie zelf, grootste WTF evar! Maar dat kan aan mij liggen.

[ Voor 19% gewijzigd door Verwijderd op 27-02-2014 19:38 ]


Acties:
  • 0 Henk 'm!

  • TommieW
  • Registratie: December 2010
  • Laatst online: 18:22

TommieW

Numa numa.

Dit had makkelijker gekund: :')
PHP:
1
2
3
4
5
6
7
8
9
if(empty($_SESSION['user'])) 
{ 
} 
else
{
        //User has been logged in already.
        header("Location: otherpage.php"); 
        die("Redirecting to otherpage.php"); 
}

1700X@3,9GHZ - Asus Crosshair VI Hero - 32GB Corsair LPX - GTX 1070Ti
iPhone 13 Pro Max - Macbook Pro 16" M1 Pro


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 09-09 17:16
TommieW schreef op zondag 02 maart 2014 @ 13:31:
Dit had makkelijker gekund: :')
PHP:
1
2
3
4
5
6
7
8
9
if(empty($_SESSION['user'])) 
{ 
} 
else
{
        //User has been logged in already.
        header("Location: otherpage.php"); 
        die("Redirecting to otherpage.php"); 
}
Dit soort constructies zie je vaak bij mensen die heel lang achter elkaar gecode hebben. Ik heb soms ook wel eens dat ik een ingewikkeld stukje heb gedaan en dan bij iets simpels moeilijk blijf nadenken ofzo. Als ik dan de volgende dag terugkijk denk ik soms echt van WTF.

Nouja, dit is dan misschien net niet het goede voorbeeld

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Loller1 schreef op dinsdag 25 februari 2014 @ 20:00:
Zat enkele dagen geleden te kijken in de code van een project waar ik aan meewerkte toen ik een lijntje "required_once" tegenkwam. Het php document waar het naar verwees zag er zo uit:
HTML:
1
2
3
4
5
6
7
8
9
10
<html>
    <body>
        <head>
            <!doctype html="5.0">
            <meta charset="utf-8">
            <title>.</title>
        </head>
        .
    </body>
</html>

Vaagste HTML die ik ooit heb gezien, en sinds het bestand, behalve dit, helemaal leeg was, vraag ik me ook af waarom het opgeroepen werd. Heb echter nooit gevonden wie dit er in had gezet.
Denk dat die . gewoon een placeholder value is. Zo'n waarde die je bijna nooit gebruikt.

iOS developer


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
BikkelZ schreef op dinsdag 04 maart 2014 @ 02:46:
[...]


Denk dat die . gewoon een placeholder value is. Zo'n waarde die je bijna nooit gebruikt.
Ik denk dat het meer gaat om de <head> binnen de <body> en de rare plaatsing van het doctype.

Acties:
  • 0 Henk 'm!

  • maussie95
  • Registratie: Februari 2011
  • Laatst online: 19-01-2022
HuHu schreef op dinsdag 04 maart 2014 @ 08:12:
[...]

Ik denk dat het meer gaat om de <head> binnen de <body> en de rare plaatsing van het doctype.
Dat is inderdaad wel vreemd. Ik dacht eerst dat er header stond, maar er staat echt head 8)7

To the dwarf, the cripple and the mother of madness!


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Grijze Vos schreef op vrijdag 21 februari 2014 @ 09:09:
Hoe oud is iemand op een bepaalde datum:

C#:
1
2
3
4
5
6
7
8
9
10
public static int ConvertToAge(this DateTime value, DateTime referenceDate)
{
    int lReferenceDate = int.Parse(referenceDate.ToString("yyyyMMdd"));
    int lOriginalDate = int.Parse(value.ToString("yyyyMMdd"));
    string lDifference = (lReferenceDate - lOriginalDate).ToString();
    string lAge = "0";
    if (lDifference.Length > 4)
        lAge = lDifference.Substring(0, lDifference.Length - 4);
    return int.Parse(lAge);
}


|:(
Ik blijf het een briljantbrillant stukje code vinden.

Ik zweer dat als ik ooit interviews af moet gaan nemen voor een C# developer, deze in m'n repertoire gaat zitten met de vraag "Kun je me eens vertellen wat jou bevalt of niet bevalt aan deze methode en wat je er al dan niet aan zou verbeteren?"

Uiteraard voor de compleetheid even een correcte implementatie, zodat iedereen die niet direct bekend is met C# en hoe het dan wel zou moeten even mee kan lachen om het origineel. (Het is trouwens niet een helemaal triviaal probleem, mocht je dat denken. Schrikkeljaren maken het een beetje irritant.)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <summary>
/// Uses the current <see cref="DateTime" /> instance as the date of origin to
/// calculate an age in years today.
/// </summary>
/// <param name="datetime">The <see cref="DateTime"/> instance that this method extends.</param>
/// <returns>An integer number representing an age in years, with a minimum age of zero.</returns>
public static int GetYearsOfAge(this DateTime datetime)
{
  return GetYearsOfAge(datetime, DateTime.Today);
}

/// <summary>
/// Uses the current <see cref="DateTime" /> instance as the date of origin to
/// calculate an age in years at the specified reference date.
/// </summary>
/// <param name="datetime">The <see cref="DateTime"/> instance that this method extends.</param>
/// <param name="reference">The reference date at which to establish an age.</param>
/// <returns>An integer number representing an age in years, with a minimum age of zero.</returns>
public static int GetYearsOfAge(this DateTime datetime, DateTime reference)
{
  int age = reference.Year - datetime.Year;
  if (age > 0 && reference.Date < datetime.Date.AddYears(age))
  {
    age--;
  }  
  else if ( age < 0 )
  {
    age = 0;
  }

  return age;
}



(Ik kan me nog herinneren dat Grijze Vos en ik tijdens de refactoring slag waarin we dat soort gedrochten uit de codebase aan het gooien waren, net iets anders hadden gedaan. Ik geloof iets met expliciete vergelijking van de maand en dag. Ik denk alleen dat bovenstaande sneller en compacter is ... en hopelijk ook duidelijker.)

[ Voor 3% gewijzigd door R4gnax op 05-03-2014 12:11 ]


Acties:
  • 0 Henk 'm!

  • EvilItSelf
  • Registratie: Januari 2010
  • Laatst online: 17-12-2024
@throw [NSException exceptionWithName:@"Error" reason:@"This part has not been written yet. I had to go home early." userInfo:nil];

Acties:
  • 0 Henk 'm!

  • SubSpace
  • Registratie: November 2003
  • Laatst online: 27-08 11:33
Niet zo zeer verschrikkelijke code, maar simpelweg nutteloze code in een C# project waar ik aan heb gewerkt:
A Better Boolean

Soms vraag je je echt af waarom iets is geschreven.

[ Voor 12% gewijzigd door SubSpace op 05-03-2014 00:39 ]


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
Het ziet er allemaal mooi uit, met commentaar etc. Maar de code die jij geeft doet niet wat je verwacht, en valt dus onder 'slechte programmeervoorbeelden'.

Het volgende retourneert bijvoorbeeld de waarde 0:
C#:
1
Console.WriteLine(new DateTime(2000, 2, 5).GetYearsOfAge(DateTime.Now));


Ik stel de volgende wijziging voor:

C#:
1
2
3
4
5
6
7
8
9
public static int GetYearsOfAge(this DateTime datetime, DateTime reference)
{
   int age = Math.Max(0, reference.Year - datetime.Year);
   if (age > 0 && reference.Date < datetime.Date.AddYears(age))
   {
      age--;
   }
   return age;
}

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Markieman schreef op woensdag 05 maart 2014 @ 09:28:
[...]

Het ziet er allemaal mooi uit, met commentaar etc. Maar de code die jij geeft doet niet wat je verwacht, en valt dus onder 'slechte programmeervoorbeelden'.
Oops. Inderdaad iets te ijverig weggeknipt gisteravond. Daar was een tweede if achter de else teveel weggehaald. 8)7

Zou nu wel correct moeten zijn.

[ Voor 9% gewijzigd door R4gnax op 05-03-2014 12:15 ]


Acties:
  • 0 Henk 'm!

  • DrBreakalot
  • Registratie: Oktober 2010
  • Laatst online: 10-09 08:29
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-( void )setReadOnly:(NSInteger) tag readonly:(BOOL)readonly{
    UIView* v = [self->expandView viewWithTag: tag];
    
    if ([v isKindOfClass:[ListSelectorView class]]) {
        ListSelectorView* lsView = (ListSelectorView*) v;
        lsView.readOnly = readonly;
    }
    else if ([v isKindOfClass:[KeyValueEditor class]]) {
        KeyValueEditor* kvEditor = (KeyValueEditor*) v;
        kvEditor.readOnly = readonly;
    } else if ([v isKindOfClass:[DateSelectorView class]]) {
        DateSelectorView* dateSelectorView = (DateSelectorView*) v;
        dateSelectorView.readOnly = readonly;
    }
}

Deze drie classes waren de enige subclasses van een class die deze property niet bevatte. De enige oplossing was blijkbaar dit :+

In hetzelfde project praten we tegen een externe 'rest'-api:
code:
1
2
3
4
Search endpoint:
https://url/?q=SELECT [enorme hoeveelheid kolommen] FROM [tableName] WHERE accountname LIKE %<zoekterm>% OR city LIKE %<zoekterm>%

In de query moeten spaties door een +-teken vervangen worden en zoekterm door uw zoekterm

8)7

Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 11-09 05:38

Firesphere

Yoshis before Hoshis

Wilco1e schreef op donderdag 13 maart 2014 @ 19:03:
In hetzelfde project praten we tegen een externe 'rest'-api:
code:
1
2
3
4
Search endpoint:
https://url/?q=SELECT [enorme hoeveelheid kolommen] FROM [tableName] WHERE accountname LIKE %<zoekterm>% OR city LIKE %<zoekterm>%

In de query moeten spaties door een +-teken vervangen worden en zoekterm door uw zoekterm

8)7
Dit klinkt als FQL, waar je ook een complete query in een get-param moet gooien. IMO echt de meest elegante oplossing hoor! O-) :X

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • king_charles
  • Registratie: Maart 2008
  • Laatst online: 15-08-2023
Zo kan het natuurlijk ook...
C#:
1
bool hasExpired = DateTime.Now > something.CreationTimestamp.Add(timespan) ? true : false;

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Hoe vaak ik dat wel niet zelf gedaan heb ... en er dan pas net ná de commit achterkomen. Je eigen stupiditeit voor eeuwig vastgelegd :P

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sowieso heb je af en toe wel eens dat je dergelijke constructies krijgt omdat er eerst meer gebeurde, en dat later vereenvoudigd is. Wat overblijft is dat soms aardig stupide :+

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

kenneth schreef op dinsdag 18 maart 2014 @ 14:39:
Hoe vaak ik dat wel niet zelf gedaan heb ... en er dan pas net ná de commit achterkomen. Je eigen stupiditeit voor eeuwig vastgelegd :P
Gewoon een ninja 'git commit --amend && git push --force' en doen alsof er niks gebeurd is :+

Acties:
  • 0 Henk 'm!

  • ObiTewodros
  • Registratie: April 2011
  • Laatst online: 05-04 22:22
code:
1
2
3
4
5
6
7
8
9
10
11
for(int j = 0; j<getSportList().size;j++){
for(int i = j-getReserves(); i<j; i+=j){
   Sport nat = getNatural(i);
   if(nat.getS())
   {
     break;
   }
 setReserves();

}
}


Ben dit net tegengekomen in de code van een project waaraan ik meewerk, en ben al een half uur bezig met het te begrijpen, maar het lukt maar niet.

Wat gebeurt hier in hemelsnaam?

Het project is een principe een planning software voor sport evenementen.

[ Voor 14% gewijzigd door ObiTewodros op 19-03-2014 15:41 ]


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 19:45

RayNbow

Kirika <3

NeutraleGast schreef op woensdag 19 maart 2014 @ 15:37:
code:
1
2
3
4
5
6
7
8
9
for(int i = j; i<i; i+=j)
{
   Sport nat = getNatural(i);
   if(nat.getS())
   {
     break;
   }

}
i<i? Hmm, volgens mij gebeurt er dan weinig. :p

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • ObiTewodros
  • Registratie: April 2011
  • Laatst online: 05-04 22:22
RayNbow schreef op woensdag 19 maart 2014 @ 15:39:
[...]

i<i? Hmm, volgens mij gebeurt er dan weinig. :p
Had het niet helemaal correct overgenomen. Zie wijzigingen.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:13

Haan

dotnetter

NeutraleGast schreef op woensdag 19 maart 2014 @ 15:37:
code:
1
2
3
4
5
6
7
8
9
10
11
for(int j = 0; j<getSportList().size;j++){
for(int i = j-getReserves(); i<j; i+=j){
   Sport nat = getNatural(i);
   if(nat.getS())
   {
     break;
   }
 setReserves();

}
}


Ben dit net tegengekomen in de code van een project waaraan ik meewerk, en ben al een half uur bezig met het te begrijpen, maar het lukt maar niet.

Wat gebeurt hier in hemelsnaam?

Het project is een principe een planning software voor sport evenementen.
Los van de kwaliteit van de code zelf, valt dit wel te begrijpen toch?
- voor ieder item in 'sport list':
- doe een onhandige omgedraaide for-loop over 'reserves'
- haal een object op, en ga verder met volgende sport list item als getS true is.
- zo niet, call setReserves method (waarvan het vreemd is dat deze verder geen parameters nodig heeft

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 08-09 15:03

Douweegbertje

Wat kinderachtig.. godverdomme

NeutraleGast schreef op woensdag 19 maart 2014 @ 15:37:
code:
1
2
3
4
5
6
7
8
9
10
11
for(int j = 0; j<getSportList().size;j++){
for(int i = j-getReserves(); i<j; i+=j){
   Sport nat = getNatural(i);
   if(nat.getS())
   {
     break;
   }
 setReserves();

}
}


Ben dit net tegengekomen in de code van een project waaraan ik meewerk, en ben al een half uur bezig met het te begrijpen, maar het lukt maar niet.

Wat gebeurt hier in hemelsnaam?

Het project is een principe een planning software voor sport evenementen.
Maak dan een topic als jij het niet snapt. No offence oid, maar het is hier voor slechte programmeer voorbeelden, niet direct om te vertellen hoe je slechte/onduidelijke code werkt :p

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:28
NeutraleGast schreef op woensdag 19 maart 2014 @ 15:37:
C:
2
for(int i = j-getReserves(); i<j; i+=j){
Moet die i+=j niet i+=1 (of gewoon i++) zijn? Nu doorloop je de lus namelijk maar één keer (aangenomen dat i na initialisatie niet negatief is).

Acties:
  • 0 Henk 'm!

  • Basti504
  • Registratie: Februari 2005
  • Laatst online: 16:33

Basti504

Niet de enige, wel de echte.

Verwijderd schreef op donderdag 27 februari 2014 @ 19:38:
Mwah je zult nog staan te kijken hoe vaak het voorkomt dat er geen dev/test/accept omgeving is. Zelfs wanneer het een paar keer goed fout gaat leren mensen het gewoon niet.

...
Het is altijd mooi om te zien hoe erg de industriële automatisering achterloopt op moderne computer programmatie. In het werk wat ik doe (PLC/robot programmeren) bestaan dev/test/accept al nagenoeg niet. Na testen in een simulator en gezamenlijk reviewen van de code houdt het al vaak op. Daarna is het vaak 'plop, code in de machine' en live testen met gereduceerde snelheden en/of test producten.

Terwijl softwarefouten in deze systemen wel degelijk gevolgen hebben in de fysieke wereld door bijvoorbeeld materiele schade of nog erger menselijke ongevallen.

Afbeeldingslocatie: http://novatronas.eu/var/novatronas/storage/images/media/images/kuka-industrial-robot2/8730-1-lit-LT/KUKA-industrial-robot.jpg

...

Pagina: 1 ... 4 ... 20 Laatste

Let op:
Uiteraard is het in dit topic niet de bedoeling dat andere users en/of topics aangehaald worden om ze voor gek te zetten. Lachen om je eigen code, of over dingen die je "wel eens tegengekomen bent" is prima, maar hou het onderling netjes. :)