| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
if (bla === true) doeIets() else doeWatAnders()
Of 3 diepe array for loops die bijna niet te ontcijferen zijn terwijl met filters hetzelfde met minder code en beter leesbaar te bereiken is.
Niet alleen JavaScript. Mijn (ex)collega's deden dat ook in Obj-C (BAH!)matty___ schreef op dinsdag 16 februari 2016 @ 12:52:
Waar ik pukkels van krijg zijn javaScript if statements op single line en niet alleen maar van kort format zoals dit voorbeeld maar echt zo breed dat ik horizontaal moet scrollen:
if (bla === true) doeIets() else doeWatAnders()
Of 3 diepe array for loops die bijna niet te ontcijferen zijn terwijl met filters hetzelfde met minder code en beter leesbaar te bereiken is.
1
2
3
4
5
6
7
| if(empty($e)){ if(!empty($e){ // doe iets }else{ // redirect } } |
[ Voor 6% gewijzigd door ongewoongewoon op 16-02-2016 18:37 ]
Je weet het maar nooit met die $e. Misschien dat die toch nog snel veranderdongewoongewoon schreef op dinsdag 16 februari 2016 @ 18:37:
Kwam deze vandaag tegen (php pseudo code):
code:
1 2 3 4 5 6 7 if(empty($e)){ if(!empty($e){ // doe iets }else{ // redirect } }
Bij PHP zou het me op zich dan weer niet verbazen als er situaties zouden kunnen zijn waarin een variabele half empty of half vol kan zijn afhankelijk van je gezichtspuntmatty___ schreef op dinsdag 16 februari 2016 @ 22:05:
[...]
Je weet het maar nooit met die $e. Misschien dat die toch nog snel veranderd
Multithreading?matty___ schreef op dinsdag 16 februari 2016 @ 22:05:
[...]
Je weet het maar nooit met die $e. Misschien dat die toch nog snel veranderd
1
2
3
4
5
| //make really really really sure $e is good if($e && $e && $e && $e) { ... } |
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Zo fout dat het goed is.RobV schreef op woensdag 17 februari 2016 @ 13:16:
code:
1 2 3 4 5 //make really really really sure $e is good if($e && $e && $e && $e) { ... }
Komt d'r in, dan kö-j d’r oet kieken
En dan bij een manager claimen dat je software redundant is opgebouwdRobV schreef op woensdag 17 februari 2016 @ 13:16:
code:
1 2 3 4 5 //make really really really sure $e is good if($e && $e && $e && $e) { ... }
Heeft empty geen side effects dan?matty___ schreef op dinsdag 16 februari 2016 @ 22:05:
[...]
Je weet het maar nooit met die $e. Misschien dat die toch nog snel veranderd
Of is_empty(), afhankelijk van de windrichting tijdens het schrijven van php features.
[ Voor 46% gewijzigd door Voutloos op 17-02-2016 19:14 ]
{signature}
Eigenlijk is heel PHP een slecht programmeervoorbeeld, maar dat ter zijdeVoutloos schreef op woensdag 17 februari 2016 @ 19:12:
Nee, want het had eigenlijk isEmpty() moeten heten.
Of is_empty(), afhankelijk van de windrichting tijdens het schrijven van php features.

| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
1
2
3
4
5
6
7
8
9
10
| public SomeSingleton getInstance() { if (instance == null) { synchronized(semaphore) { if (instance == null) { instance = new SomeSingleton(); } } } return instance; } |
Maar goed, dat is (zoals ray-t al aangeeft) relevant bij multi-threading. Daar is bij php natuurlijk sowieso geen sprake van.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
1
2
3
4
5
6
| fetch all data from table A between dates x & y for each row in A: fetch data for parent from table B fetch bool from table C where user is given user and parent id = parent id if query for table C returns true: // Display something |
JOIN, wat is dat?
Eventjes getest met de data-range die standaard gebruikt wordt in de applicatie: 263 queries naar de database ipv 1

Ach het hoofdstuk SELECT en de WHERE clause zijn in iedergeval wel blijven hangen .. 't kon nog minderazerty schreef op zondag 21 februari 2016 @ 16:11:
Deze verdient hier ook wel een plekje... Pseudocode, maar het maakt toch niet veel uit om het te begrijpen of niet...
code:
1 2 3 4 5 6 fetch all data from table A between dates x & y for each row in A: fetch data for parent from table B fetch bool from table C where user is given user and parent id = parent id if query for table C returns true: // Display something
JOIN, wat is dat?
Eventjes getest met de data-range die standaard gebruikt wordt in de applicatie: 263 queries naar de database ipv 1![]()
1
2
3
4
5
6
| int strlen(const char* pText) { if (!*pText) return 0; return strlen(pText+1)+1; } |
Blijkbaar iets teveel opgelet bij de les recursie en iets te weinig bij het onderwerp dat over stacks gaat
The miracle isn't that I finished. The miracle is that I had the courage to start.
Op regel 3 gaat het al mis als pText een null pointer isBugBoy schreef op zondag 21 februari 2016 @ 16:41:
Ooit eens gezien bij iemand die koud van school kwam:
code:
1 2 3 4 5 6 int strlen(const char* pText) { if (!*pText) return 0; return strlen(pText+1)+1; }
Blijkbaar iets teveel opgelet bij de les recursie en iets te weinig bij het onderwerp dat over stacks gaat
Volgens de specificatie hoeft strlen ook niet op NULL te controleren. Dat is dus niet het probleem. De belabberde snelheid, hoge stackgebruik en kans op stack overflows des te meer...Jerrythafast schreef op zondag 21 februari 2016 @ 16:44:
Op regel 3 gaat het al mis als pText een null pointer is
The miracle isn't that I finished. The miracle is that I had the courage to start.
.edit: Oh nee wacht de +1 gooit roet in het eten.
[ Voor 24% gewijzigd door .oisyn op 21-02-2016 17:13 ]
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.
Is dit beter dan?BugBoy schreef op zondag 21 februari 2016 @ 16:41:
Ooit eens gezien bij iemand die koud van school kwam:
code:
1 2 3 4 5 6 int strlen(const char* pText) { if (!*pText) return 0; return strlen(pText+1)+1; }
Blijkbaar iets teveel opgelet bij de les recursie en iets te weinig bij het onderwerp dat over stacks gaat
1
2
3
4
5
6
7
8
9
10
11
12
| int strlen(const char* pText) { return strlen_acc(pText, 0); } int strlen_acc(const char* pText, int length) { if (!*pText) return length; else return strlen_acc(pText + 1, length+1); } |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Wat is het probleem met de tailrecursive versie dan?RobV schreef op zondag 21 februari 2016 @ 18:11:
Het zijn allemaal goede voorbeelden... van hoe het niet moet.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Zo heb ik ook leren programmeren, De reden: de code wordt beter leesbaar/debugbaar omdat de if altijd eerst 'positief' is. Oldskool COBOL FTWgr8-jen schreef op zaterdag 13 februari 2016 @ 22:07:
Bij mijn eerste bedrijf waar ik kwam werken hadden ze software opgekocht die ik mocht gaan onderhouden. Ik vond meerdere stukken slechte code maar dit blijft me altijd bij:
if (bla...bla....)
{
// do nothing
} else
{
*code die iets doet*
}
Waar ik het meeste mee zat was het comentaar //do nothing......
Standaard dus:
if x=6
:ok
else
*code die iets doet
endif
I.p.v.
if x !=6
*code die iets doet
endif
[ Voor 6% gewijzigd door dragon2 op 21-02-2016 18:35 ]
Ik vind het soms andersom toch zeker handiger. Bijvoorbeeld bij inputvalidatie:dragon2 schreef op zondag 21 februari 2016 @ 18:32:
[...]
Zo heb ik ook leren programmeren, De reden: de code wordt beter leesbaar/debugbaar omdat de if altijd eerst 'positief' is. Oldskool COBOL FTW
Standaard dus:
if x=6
:ok
else
*code die iets doet
endif
I.p.v.
if x !=6
*code die iets doet
endif
1
2
| if(!User.Exists(id)) throw new HttpResponseException(...); if(!User.HasRights(id)) throw new HttpResponseException(...); |
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Dit zijn guard statements en bedoeld om de input te valideren. In dezelfde categorie als asserts() en preconditions. Die staan buiten de 'expected flow of events' en zijn (althans volgens mij) zonder problemen op deze manier te gebruiken. Maar een lege 'if' om een else te kunnen schrijven, daar krijg ik echt rillingen van.F.West98 schreef op zondag 21 februari 2016 @ 18:45:
[...]
Ik vind het soms andersom toch zeker handiger. Bijvoorbeeld bij inputvalidatie:
C#:
1 2 if(!User.Exists(id)) throw new HttpResponseException(...); if(!User.HasRights(id)) throw new HttpResponseException(...);
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Ik hoop wel dat je bedoelt dat je het volgende apprecieert :dragon2 schreef op zondag 21 februari 2016 @ 18:32:
[...]
Zo heb ik ook leren programmeren, De reden: de code wordt beter leesbaar/debugbaar omdat de if altijd eerst 'positief' is. Oldskool COBOL FTW
Standaard dus:
if x=6
:ok
else
*code die iets doet
endif
I.p.v.
if x !=6
*code die iets doet
endif
If (true) {
Doe überhaupt iets
}
Ipv
Een commentaar met de tekst doe niets
WP: ME SUZ-SWM80VA + ERST20D-VM2D || PV: 4500Wp ZWW || BENG, Rc6 rondom, tripple glas, WTW, 165m2 verwarmd || Gasloos sinds sep 2023
Soms is het voor de leesbaarheid van de code of voor bepaalde code reviews erg nuttig om "expliciet" aan te geven dat er op dat moment niks gebeurt.gr8-jen schreef op zondag 21 februari 2016 @ 18:51:
[...]
Ik hoop wel dat je bedoelt dat je het volgende apprecieert :
If (true) {
Doe überhaupt iets
}
Ipv
Een commentaar met de tekst doe niets
Bijvoorbeeld, als je veiligheidskritieke systemen programmeert en een reviewer vereist dat je elke mogelijke situatie die voor kan komen in je code hebt staan... ook als daar geen actie op is vereist. Zo hou je je code zo deterministisch mogelijk.
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
1
2
3
| if (level === 0 ) return "green.svg"; if (level === 1 ) return "orange.svg"; return "red.svg"; |
[ Voor 5% gewijzigd door matty___ op 24-02-2016 14:22 ]
Wat is hier precies mis mee afgezien dat je het beter als switch had kunnen schrijven en je natuurlijk als je het zo oplost er een variabel van had kunnen maken dat je op het eind returned?matty___ schreef op woensdag 24 februari 2016 @ 14:22:
JavaScript
code:
1 2 3 if (level === 0 ) return "green.svg"; if (level === 1 ) return "orange.svg"; return "red.svg";
Je geeft zelf al voorbeelden. Je zou ook een object of array kunnen gebruiken. Vind 3 keer return beetje storend maar dat is mijn tik.Webgnome schreef op woensdag 24 februari 2016 @ 14:23:
[...]
Wat is hier precies mis mee afgezien dat je het beter als switch had kunnen schrijven en je natuurlijk als je het zo oplost er een variabel van had kunnen maken dat je op het eind returned?
Edit: Als ik er verder over na denk is de verwijzing naar een harde filename in de functie ook niet juist. Dit zijn configuratie parameters en zouden op een centrale plek moeten staan of via CSS en regel je daar maar de styling in.
[ Voor 20% gewijzigd door matty___ op 24-02-2016 14:46 ]
1
2
3
4
5
6
7
| For Each Company As Company In MyCompanies If Company.Activated = True Then ' Doe iets Else Continue For End If Next |
[ Voor 67% gewijzigd door DieVeenman op 16-03-2016 17:19 ]
“Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway.”
Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag
{signature}
Vind dit soort voorbeelden nou niet bepaald heel erg WTF. Zoals al aangegeven door iemand anders. Is dit niet gewoon een overblijfsel van een refactor slag. Zonder context is hier niet te bepalen of dat dit wenselijk gedrag is.DieVeenman schreef op woensdag 16 maart 2016 @ 17:16:
Net dit stukje gezien:
Visual Basic .NET:
1 2 3 4 5 6 7 For Each Company As Company In MyCompanies If Company.Activated = True Then ' Doe iets Else Continue For End If Next
1
2
3
4
| foreach (var company in myCompanies.Where(c => c.Activated)) { // doe iets } |
Kater? Eerst water, de rest komt later
De indentation is hier de echte wtf, neem ik aan? Er is een speciaal plekje in de hel voor dit soort mensen.DieVeenman schreef op woensdag 16 maart 2016 @ 17:16:
Net dit stukje gezien:
Visual Basic .NET:
1 2 3 4 5 6 7 For Each Company As Company In MyCompanies If Company.Activated = True Then ' Doe iets Else Continue For End If Next
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Zo zie je maar weer hoe veel werk een goede editor werk kan besparen of versimpelen. Als ik rare indents maak of teveel }'s neerzet dan gaat ie piepen dat t niet klopt.kenneth schreef op donderdag 17 maart 2016 @ 09:26:
[...]
De indentation is hier de echte wtf, neem ik aan? Er is een speciaal plekje in de hel voor dit soort mensen.

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
| SELECT COUNT(*) NumberOfRecords FROM vw_User INNER JOIN OrganisationRole on vw_User.UserID = OrganisationRole.[UserId] WHERE OrganisationRole.[OrganisationID] = @OrganisationID AND OrganisationRole.[RoleID]=@RoleID; WITH usersFound AS ( SELECT vw_User.* FROM vw_User INNER JOIN OrganisationRole on vw_User.UserID = OrganisationRole.[UserId] WHERE OrganisationRole.[OrganisationID] = @OrganisationID AND OrganisationRole.[RoleID]=@RoleID ), users as ( SELECT ROW_NUMBER() OVER (ORDER BY LastName) AS rowNumber,* FROM usersFound ) SELECT * FROM users WHERE rowNumber BETWEEN (((@Page -1) * @PageSize) + 1 ) AND (@Page * @PageSize) ORDER BY rowNumber |
Zéér efficient... (onderdeel van een stored procedure)
[ Voor 12% gewijzigd door F.West98 op 28-03-2016 23:29 ]
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Mijn gok: zoek een OrganizationRole dat voldoet aan argumenten @OrganisationId en @RoleID, zoek alle users die daarbij horen, en filter ze op het regelnummer om steeds 1 pagina te krijgen. Maar in welke database-taal kan OrganisationRole.UserId matchen met meerdere users?

Ik vind dit vaak duidelijker dan werken met het !F.West98 schreef op zondag 21 februari 2016 @ 18:45:
[...]
Ik vind het soms andersom toch zeker handiger. Bijvoorbeeld bij inputvalidatie:
C#:
1 2 if(!User.Exists(id)) throw new HttpResponseException(...); if(!User.HasRights(id)) throw new HttpResponseException(...);
1
2
| if(User.Exists(id) == false) throw new HttpResponseException(...); if(User.HasRights(id) == false) throw new HttpResponseException(...); |
je kan ook de "verwachte uitkomst" vooraan zetten:
1
2
| if(false == User.Exists(id)) throw new HttpResponseException(...); if(false == User.HasRights(id)) throw new HttpResponseException(...); |
(je kunt natuurlijk als het echt altijd een boolean is met === werken, maargoed.
Ik ben dan direct heel benieuwd wat C# doet als het geen boolean is, Java geeft een syntax error
Wellicht dat het geoptimaliseerd wordt, maar:MBV schreef op dinsdag 29 maart 2016 @ 12:48:
Het stuk wel/niet efficient (je probleem is zeker: zoek alles op, en filter daarna pas op paginanummer?) vind ik minder belangrijk dan het stuk wel/niet leesbaar... Wat doet het? Ik heb hem nu 5x verkeerd geinterpreteerd, dacht dat hij een aantal gebruikers bij een role-id zocht.
Mijn gok: zoek een OrganizationRole dat voldoet aan argumenten @OrganisationId en @RoleID, zoek alle users die daarbij horen, en filter ze op het regelnummer om steeds 1 pagina te krijgen. Maar in welke database-taal kan OrganisationRole.UserId matchen met meerdere users?
- Zoek alles op en tel het
- Zoek nogmaals alles op en sla het lokaal op
- Sorteer alles
- Filter x resultaten
Wat het doet: Opzoeken in de koppeltabel OrganisationRole (koppeling tussen Organisation en User) welke users in een bepaalde organisation een bepaalde role hebben. Heet ook GetUsersByRoleAndOrganisation. Maargoed, je hebt dus naast de OrganisationRole-koppeltabel ook nog de UserOrganisation-koppeltabel. Met dezelfde informatie, alleen niet welke role die user heeft. Zéér efficiënt ook.
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
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
| switch (b) { case 0: return ("0"); case 1: return ("1"); case 2: return ("2"); case 3: return ("3"); case 4: return ("4"); case 5: return ("5"); case 6: return ("6"); case 7: return ("7"); case 8: return ("8"); case 9: return ("9"); case 10: return ("a"); case 11: return ("b"); case 12: return ("c"); case 13: return ("d"); case 14: return ("e"); case 15: return ("f"); } |
1
| int pageCount = (Int32)Math.Floor(Decimal.Divide(ItemCount, pageSize)); |
Tja. Hè. Wat moet je hier nou weer mee.
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Zonder te weten wat b precies is ben ik daar nog niet zo zeker van. Dit zou je al beter kunnen doen met een enum, en als het hier om een hexadecimaal getal gaat lijktmcDavid schreef op woensdag 30 maart 2016 @ 00:17:
Ik ben niet heel erg thuis in Java, maar ik heb zo'n vermoeden dat dit korter kan:
Java:
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 switch (b) { case 0: return ("0"); case 1: return ("1"); case 2: return ("2"); case 3: return ("3"); case 4: return ("4"); case 5: return ("5"); case 6: return ("6"); case 7: return ("7"); case 8: return ("8"); case 9: return ("9"); case 10: return ("a"); case 11: return ("b"); case 12: return ("c"); case 13: return ("d"); case 14: return ("e"); case 15: return ("f"); }
1
| Integer.toHexString(b); |
Sterker nog, zit nu verder te lezen en er zit nog deze code voor:
1
2
3
4
5
6
| public static String byte2Asc(byte b) { String s = nibble2Asc((byte )((b & 0xf0) >>> 4)); s += nibble2Asc((byte )(b & 0x0f)); return (s); } |
Waarbij nibble2Asc voorgaande switch bevat.
Beide functies hadden samengevat kunnen worden met Integer.toHexString(b);
1
2
| if (b >= 0 && b <= 15) return new String("0123456789abcdef"[b]); |
.edit: oh je kunt geen String constructen van een char in Java. Nou ja, deze code is toch inefficient, beter maak je gewoon een statische array van 16 strings.
[ Voor 73% gewijzigd door .oisyn op 30-03-2016 13: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.
String String::valueOf(char)?.oisyn schreef op woensdag 30 maart 2016 @ 12:57:
.edit: oh je kunt geen String constructen van een char in Java.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
I know, mijn punt was dat mijn code niet compilet, en ik had geen zin om hem aan te passen
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.
107765 regels.

Het spelletje zelf ziet er eigenlijk nog wel OK uit.
Certified smart block developer op de agile darkchain stack. PM voor info.
Not Pingu schreef op vrijdag 08 april 2016 @ 09:28:
Nou heb ik al heel wat ellenlange stukken code gezien, gemaakt door mensen die echt geen verstand hadden van OO, maar hier viel mijn mond wel van open
107765 regels.![]()
Het spelletje zelf ziet er eigenlijk nog wel OK uit.
1
2
3
4
5
6
7
| //CHANGE THIS sfxExplosion = Content.Load<SoundEffect>("AllSounds/boom2Boss"); //FUCKING CHANGE THIS //CHANGE THIS HOLY SHIT playStageMusic = new PlayStageMusic(1, stageBGM); |
haha ik mag die gast wel.Not Pingu schreef op vrijdag 08 april 2016 @ 09:28:
Nou heb ik al heel wat ellenlange stukken code gezien, gemaakt door mensen die echt geen verstand hadden van OO, maar hier viel mijn mond wel van open
107765 regels.![]()
Het spelletje zelf ziet er eigenlijk nog wel OK uit.
Waarschijnlijk zijn eerste game, het is een zootje geworden maar hij heeft wel doorgezet. Op de één of andere manier waardeer ik dan zoiets uiteindelijk wel
Het eindresultaat is prima, meer dan menig persoon bereikt dus ja.. wat moet je er van zeggen.
En als je die gast helemaal over de zeik wil hebben, vraag dan even of hij er <vul willekeurige feature> bij in wil bouwenDouweegbertje schreef op vrijdag 08 april 2016 @ 13:22:
[...]
haha ik mag die gast wel.
Waarschijnlijk zijn eerste game, het is een zootje geworden maar hij heeft wel doorgezet. Op de één of andere manier waardeer ik dan zoiets uiteindelijk wel
Het eindresultaat is prima, meer dan menig persoon bereikt dus ja.. wat moet je er van zeggen.
... en gaat over tot de orde van de dag
Kan me herinneren dat iemand hier ook nog eens een spelletje heeft gepubliceerd in een showcase topic. Kwam ongeveer op hetzelfde neer. Ik kreeg er wel gemengde gevoelens bij. Aan de ene kant knap dat je iets werkends neer weet te zetten, maar aan de andere kant kennelijk niet (voldoende) verdiept in de materie bij aanvang en ook gaandeweg het ontwikkelen niet nagedacht over eventuele aanpassingen die het beter onderhoudbaar zouden maken door een betere structuur. Zat in eerste instantie te kijken naar de mogelijkheid om het hele verhaal te refactoren als oefening voor mezelf, maar heb dat idee maar snel naast me neer gelegd omdat het effectief een complete rewrite zou worden. In de praktijk toch de programmeurs die je liever niet in je team hebt tenzij ze hun kennis op bepaalde gebieden flink bijschaven.Not Pingu schreef op vrijdag 08 april 2016 @ 09:28:
Nou heb ik al heel wat ellenlange stukken code gezien, gemaakt door mensen die echt geen verstand hadden van OO, maar hier viel mijn mond wel van open
107765 regels.![]()
Het spelletje zelf ziet er eigenlijk nog wel OK uit.
Overigens dan ook wel weer het omgekeerde gezien. Een pakket met teleurstellend weinig functionaliteit, een enorm aantal regels code en gebruik makend van ongeveer ieder denkbaar design pattern. Ook gemengde gevoelens. Je kan er niet echt iets slechts over zeggen maar echt vrolijk werd ik er nou ook weer niet van.
Master of questionable victories and sheer glorious defeats
Heet dat dan niet gewoon overengineren. En daar is genoeg slechts over te zeggen. Zoals daar zijn onderhoudbaarheid en/of begrijpbaarheid. Als je miljoen miljard regels code nodig hebt om een paar knopjes te renderen dan kan het er technisch misschien wel mooi uitzien maar dat wil je dan daarna nooit meer aanpassen. Simpelweg omdat je de gevolgen daar niet meer van kunt overzien.Tribits schreef op zondag 10 april 2016 @ 16:39:
[...]
...
Overigens dan ook wel weer het omgekeerde gezien. Een pakket met teleurstellend weinig functionaliteit, een enorm aantal regels code en gebruik makend van ongeveer ieder denkbaar design pattern. Ook gemengde gevoelens. Je kan er niet echt iets slechts over zeggen maar echt vrolijk werd ik er nou ook weer niet van.
[ Voor 65% gewijzigd door Webgnome op 17-04-2016 14:12 ]
Ik ben zelf Swift aan het leren en merk dat ik regelmatig opnieuw begin met apps en stukken code omdat ik er achter kom dat ik bepaalde patterns helemaal niet goed gebruikt heb. Ondertussen leer ik wel een boel veelP_Tingen schreef op vrijdag 08 april 2016 @ 13:35:
[...]
En als je die gast helemaal over de zeik wil hebben, vraag dan even of hij er <vul willekeurige feature> bij in wil bouwen. Dit is zo'n groot copy-paste verhaal geworden dat het een drama moet zijn om er ook maar iets bij te knutselen. Wel respect idd voor zijn doorzettingsvermogen.
ZIPper: Zelfstandig Interim Professional
Laat ik het anders zeggen: het is een discussie die ik doorgaans maar liever uit de weg ga. Over slechte programmeervoorbeelden is iedereen het doorgaans wel eens, maar wanneer er sprake is van overengineering is veel minder absoluut. Er is altijd wel een reden en een oorzaak aan te wijzen en dus zijn er ook altijd wel argumenten voor de doorgeslagen ontwerpkeuzes. En aangezien die keuzes doorgaans gemaakt zijn door iemand met een nog al uitgesproken visie op software engineering zal dat zelden een gemakkelijke discussie worden. Ik heb nog eens gewerkt aan een systeem dat ooit begonnen was op een 386 en dat in de nieuwste versie na talloze 'verbeteringen' zelfs op de nieuwste hardware niet vooruit te branden was. Desondanks wilde de ontwerper van het systeem niet accepteren dat de structuur te complex was geworden.Webgnome schreef op zondag 17 april 2016 @ 14:04:
Heet dat dan niet gewoon overengineren. En daar is genoeg slechts over te zeggen. Zoals daar zijn onderhoudbaarheid en/of begrijpbaarheid. Als je miljoen miljard regels code nodig hebt om een paar knopjes te renderen dan kan het er technisch misschien wel mooi uitzien maar dat wil je dan daarna nooit meer aanpassen. Simpelweg omdat je de gevolgen daar niet meer van kunt overzien.
Ik wilde nog even een simpel voorbeeldje toevoegen van een geval waar in mijn ogen sprake is van overengineering, maar ik realiseerde me dat de meeste lezers het hier waarschijnlijk als 'best practice' zouden bestempelen. Het blijft allemaal vrij subjectief.
Master of questionable victories and sheer glorious defeats
http://www.amstel.nl/framework/modules/agecheck2/js/agecheck.jsWebgnome schreef op zondag 17 april 2016 @ 14:04:
heb nog een leuke gevonden. Als je op http://www.amstel.nl/agecheck een datum kiest van bijv 1900 dan krijg je een 'te jong' melding.. Als je voor 1800 kiest dan werkt het script helemaal niet (ook niet een melding)
[...]
Het is zeker weten wel een stukje monstercode voor een simpele age check....
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
| var checkDate = function(day, month, year) { var result; // all vars present to make a date if (!day || !month || !year) return false; // month within bounds month = month - 1; if (month < 0 || month > 11) return false; var date = new Date(year, month, day); // day exceeds month's bounds if (month != date.getMonth()) return false; // year within bounds if (date.getFullYear() < minYear) return false; if (date == 'Invalid Date' || (new Date() - date < 0)) { return false; } else { var d = '0' + date.getDate(); var m = '0' + (date.getMonth() + 1); return [d.substr(d.length - 2, d.length), m.substr(m.length - 2, m.length), date.getFullYear()]; } }; |
Volgens mij zijn er minstens 100 libraries en methodes om te bepalen hoe oud iemand is vanuit een datum, die direct je datum checkt. Dat je handmatig je 'month within range' moet gaan checken

[ Voor 47% gewijzigd door Edwin88 op 18-04-2016 13:54 ]
moment.jsEdwin88 schreef op maandag 18 april 2016 @ 13:52:
[...]
http://www.amstel.nl/framework/modules/agecheck2/js/agecheck.js
Het is zeker weten wel een stukje monstercode voor een simpele age check....
JavaScript:
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 var checkDate = function(day, month, year) { var result; // all vars present to make a date if (!day || !month || !year) return false; // month within bounds month = month - 1; if (month < 0 || month > 11) return false; var date = new Date(year, month, day); // day exceeds month's bounds if (month != date.getMonth()) return false; // year within bounds if (date.getFullYear() < minYear) return false; if (date == 'Invalid Date' || (new Date() - date < 0)) { return false; } else { var d = '0' + date.getDate(); var m = '0' + (date.getMonth() + 1); return [d.substr(d.length - 2, d.length), m.substr(m.length - 2, m.length), date.getFullYear()]; } };
Volgens mij zijn er minstens 100 libraries en methodes om te bepalen hoe oud iemand is vanuit een datum, die direct je datum checkt. Dat je handmatig je 'month within range' moet gaan checken
Ja, die moeten er een hoop users hebben bijgekregen sinds Globalize.js ineens framework-aspiraties kreeg. Moment.js is een fijne library.
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Enfin, zal wel een goedkope oplossing geweest zijn en lang geleden gemaakt. En op zich werkt het prima genoeg.
Een bedrijf als amstel zal het echt een r... zorg zijn hoe de code eruit ziet. Als het maar .. oh ja wacht. En om heel eerlijk te zijn wie gaat er nu serieus 1900 invullen als jaartal? Dit is waarschijnlijk gewoon niet getest.Edwin88 schreef op maandag 18 april 2016 @ 14:47:
Ik vind het vooral gek dat een groot bedrijf als amstel dit soort code op zijn site heeft staan. Het ziet er niet echt professioneel uit als je site niet eens goed werkt.
Enfin, zal wel een goedkope oplossing geweest zijn en lang geleden gemaakt. En op zich werkt het prima genoeg.
Boardroom: wat? €80k voor een website? Ik vraag het wel aan mijn neefje. Die zit ook wel eens op internet.Webgnome schreef op maandag 18 april 2016 @ 14:48:
[...]
Een bedrijf als amstel zal het echt een r... zorg zijn hoe de code eruit ziet. Als het maar .. oh ja wacht. En om heel eerlijk te zijn wie gaat er nu serieus 1900 invullen als jaartal? Dit is waarschijnlijk gewoon niet getest.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Daar moet ik ze dan wel gelijk in geven. Ze hadden alleen beter even de skills van dat neefje kunnen checken.RobV schreef op maandag 18 april 2016 @ 15:52:
[...]
Boardroom: wat? €80k voor een website? Ik vraag het wel aan mijn neefje. Die zit ook wel eens op internet.
Volgens mij is er in deze tijd altijd wel iemand in een bedrijf die (iemand kent die) wel een eenvoudig dingetje als dit op een website op een goede manier kan implementeren. En daar geen €80k voor vraagt.
Er waren wel 5 werknemers die hun neefje hebben voorgedragen als oplossing bij de board. Allemaal hadden ze al 5 websites in de lucht die er prachtig uit zagen en iets moois lieten zien. Het goedkoopste neefje kreeg de opdracht. Het ziet er toch prima uit?Jerrythafast schreef op maandag 18 april 2016 @ 19:15:
[...]
Daar moet ik ze dan wel gelijk in geven. Ze hadden alleen beter even de skills van dat neefje kunnen checken.
Volgens mij is er in deze tijd altijd wel iemand in een bedrijf die (iemand kent die) wel een eenvoudig dingetje als dit op een website op een goede manier kan implementeren. En daar geen €80k voor vraagt.
De board was happy, tot de wereld het echt ging uittesten. De volgende keer betalen ze weer 80k.
👑
Naar wie niet? Die paar mensen die weten hoe HTML en javascript werken én die weten hoe het beter moet? Verder gaat het alleen maar om mensen die de agecheck gebruiken, en die werkt verder prima. Het is een mooi voorbeeld voor dit topic, maar het is het laatste waar Amstel zich druk om moet maken.Edwin88 schreef op maandag 18 april 2016 @ 14:47:
Ik vind het vooral gek dat een groot bedrijf als amstel dit soort code op zijn site heeft staan. Het ziet er niet echt professioneel uit als je site niet eens goed werkt.
EDIT: Ik denk eerlijk gezegd ook niet dat het het werk van een neefje is. Genoeg bedrijven met wat zakelijke mensen en een paar designers die ook nog wel een beetje wegwijs zijn in javascript.
[ Voor 14% gewijzigd door Patriot op 18-04-2016 19:35 ]
[ Voor 98% gewijzigd door Mercatres op 19-04-2016 09:45 . Reden: Verkeerde topic :/ ]
We are shaping the future
1
2
3
4
5
6
7
8
| <tr> <td width="50%" align="center"> <SCRIPT LANGUAGE="JavaScript"> if (window.print) document.write('<a href=javascript:window.print()><input type="button" value="$strButtonPrinten" onclick="javascript:window.print()"></a>') </SCRIPT> </td> </tr> |
> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing
Blijkbaar is printen wel erg belangrijk.glashio schreef op maandag 02 mei 2016 @ 09:42:
code:Kwam het tegen in codebase
1 2 3 4 5 6 7 8 <tr> <td width="50%" align="center"> <SCRIPT LANGUAGE="JavaScript"> if (window.print) document.write('<a href=javascript:window.print()><input type="button" value="$strButtonPrinten" onclick="javascript:window.print()"></a>') </SCRIPT> </td> </tr>(Firefox, IE liep verschillende keren vast bij PC's)

Kater? Eerst water, de rest komt later
Andersom: software uit de USA. XML met de hand printen, maar geen locale meegeven. Vervolgens faalt de xml importer op in nederland gegenereerde data omdat er kommas als decimaal scheidingsteken gebruikt zijn.Haan schreef op maandag 02 mei 2016 @ 10:49:
Unit tests die checken op een specifieke tekst in een exception.. En dan ook nog in het Nederlands, zodat het op mijn Engelstalige OS en op de build servers sowieso faalt
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
1
2
3
4
5
| public void Foo(bool? flag) { bool myFlag = (flag.GetValueOrDefault(false) == true); CallAnotherMethodWithFlag(myFlag); } |
Onthutsend om te zien hoeveel overbodige zaken je in één regel code kan stoppen

Kater? Eerst water, de rest komt later
Decimalen moeten helemaal niet volgens het Amerikaanse formaat zijn. Die moeten volgens een standaard gaan. Het SI-voorvoegsel gebruikt een comma voor decimalen (het Franse SI-formaat, wat meer gebruikt wordt dan het Engelse). ISO 80000-1:2009 wat gaat over Quantities en Units gebruikt ook een comma. Ons systeem is afgeleid van het Arabische systeem, wat ook een comma gebruikt; dat is de historische reden waarom veel Europese landen een comma gebruiken. Het is gewoon totaal onlogisch om een punt te gebruiken, behalve als je bent van de rare systemen waar ze in Amerika goed in zijn (Fahrenheit, Imperial units, ed.)Sebazzz schreef op maandag 02 mei 2016 @ 12:52:
Decimale getallen in XML moeten naar mijn mening altijd in Amerikaans formaat zijn. Overigens verwacht XSD validatie dat ook als je de ingebouwde XSD datatypes gebruikt.
Da's leuk, maar als je een XSD valideerbaar XML oplevert/verwacht en je het attribuut aanmerkt als een xsd:decimal of xsd:double móet er dus altijd een punt gebruikt worden. bronThomasG schreef op woensdag 04 mei 2016 @ 10:35:
[...]
Decimalen moeten helemaal niet volgens het Amerikaanse formaat zijn. Die moeten volgens een standaard gaan. Het SI-voorvoegsel gebruikt een comma voor decimalen (het Franse SI-formaat, wat meer gebruikt wordt dan het Engelse). ISO 80000-1:2009 wat gaat over Quantities en Units gebruikt ook een comma. Ons systeem is afgeleid van het Arabische systeem, wat ook een comma gebruikt; dat is de historische reden waarom veel Europese landen een comma gebruiken. Het is gewoon totaal onlogisch om een punt te gebruiken, behalve als je bent van de rare systemen waar ze in Amerika goed in zijn (Fahrenheit, Imperial units, ed.)
Het komt er op neer dat de opsteller dus zelf mag bepalen hoe hij getallen verwacht, de andere partij heeft dat maar te volgen.
Dat slaat nergens op. Er zit geen enkele logica achter het gebruik van een punt danwel komma; het is louter gebaseerd op historie.ThomasG schreef op woensdag 04 mei 2016 @ 10:35:
Het is gewoon totaal onlogisch om een punt te gebruiken
Als je echter kijkt naar het gebruik van dezelfde symbolen in overig taalgebruik, dan vind ik de komma wel logisch als scheidingsteken, en dan kom je in de knoei als de komma ook wordt gebruikt als decimaalteken. Daarom zie je de puntkomma vaak in gebruik als scheidingsteken in regio's waar ze de komma geburiken als decimaalteken, maar taaltechnisch is dat niet logisch.
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.
Als zijn doel was "code obfuscation", dan is hij flink op weg. Pluim daarvoorHaan schreef op woensdag 04 mei 2016 @ 10:17:
C#:
1 2 3 4 5 public void Foo(bool? flag) { bool myFlag = (flag.GetValueOrDefault(false) == true); CallAnotherMethodWithFlag(myFlag); }
Onthutsend om te zien hoeveel overbodige zaken je in één regel code kan stoppen
ZIPper: Zelfstandig Interim Professional
De vraag is: "Check if object is a number or boolean" (in python)
De antwoorden:
1
| isinstance(x[0], (int, float)) |
1
2
| import types type(x) == types.BooleanType |
Mijn antwoord:
1
| type(x) == type(True) |
Het gaat om het commentaar van de lezers:
A little bit hacky but no imports, so +1
Aanvullend:
1
2
3
4
| print(type(0) == type(False)); print(type(1) == type(True)); print(type(0) == type(1)); print(type(1) == type(0)); |
Geeft netjes:
1
2
3
4
| False False True True |
Of iemand moet mij betrappen op een programmeerfout, maar volgens mij is het toch echt zo simpel
http://stackoverflow.com/...ct-is-a-number-or-boolean
Sinds de 2 dagen regel reageer ik hier niet meer
Wauw, wat ondoorzichtig. Zo wazig dat ik twijfel aan mijn eigen interpretatie. Het is toch equivalent aan:Haan schreef op woensdag 04 mei 2016 @ 10:17:
C#:
1 2 3 4 5 public void Foo(bool? flag) { bool myFlag = (flag.GetValueOrDefault(false) == true); CallAnotherMethodWithFlag(myFlag); }
Onthutsend om te zien hoeveel overbodige zaken je in één regel code kan stoppen
1
2
3
4
| public void Foo(bool? flag) { CallAnotherMethodWithFlag(flag ?? false); } |
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
Ofkenneth schreef op woensdag 04 mei 2016 @ 13:42:
[...]
Wauw, wat ondoorzichtig. Zo wazig dat ik twijfel aan mijn eigen interpretatie. Het is toch equivalent aan:
C#:
1 2 3 4 public void Foo(bool? flag) { CallAnotherMethodWithFlag(flag ?? false); }
1
| CallAnotherMethodWithFlag(flag.GetValueOrDefault()); |
Kater? Eerst water, de rest komt later
Dat vind ik wel de mooiste oplossingkenneth schreef op woensdag 04 mei 2016 @ 13:42:
[...]
Wauw, wat ondoorzichtig. Zo wazig dat ik twijfel aan mijn eigen interpretatie. Het is toch equivalent aan:
C#:
1 2 3 4 public void Foo(bool? flag) { CallAnotherMethodWithFlag(flag ?? false); }
Met een hele kleine aanpassing in de semantiek van de aanroep (software architect voorrecht), geen nieuwe functie maken/verzinnen, maar een overload gebruiken en de default specificeren in de argumentenlijst. Maar ik vermoed zo dat de originele bouwer meer wil doen dan enkele een functie aanroepen met een optional boolean. Ook kan het zijn dat de functie specifiek moet werken met een nullable bool.
1
2
3
4
| public void CallAnotherMethodWithFlag(bool flag = false) { CallAnotherMethodWithFlag(flag); } |
Maar eerlijk gezegd is de originele stelling zo ongelofelijk beroerd, dat iedere aanpassing leidt naar een verbetering

| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Nee hoor, dat kan vast nog slechter:RobV schreef op woensdag 04 mei 2016 @ 14:02:
[...]
Maar eerlijk gezegd is de originele stelling zo ongelofelijk beroerd, dat iedere aanpassen leidt naar een verbetering
1
2
3
4
5
6
7
8
9
10
11
| public void Foo(bool? flag) { string result; if (flag.HasValue) if (flag.Value) result = bool.TrueString; else result = bool.FalseString; else result = bool.FalseString; return CallAnotherMethodWithFlag(bool.Parse(result)); } |
Geavanceerder kan ook,dmv Reflection.Emit() hahaThomasG schreef op woensdag 04 mei 2016 @ 14:22:
[...]
Nee hoor, dat kan vast nog slechter:
C#:
1 2 3 4 5 6 7 8 9 10 11 public void Foo(bool? flag) { string result; if (flag.HasValue) if (flag.Value) result = bool.TrueString; else result = bool.FalseString; else result = bool.FalseString; return CallAnotherMethodWithFlag(!result.Equals("false")); }
Edit: ik ken mensen die hier voor de zekerheid een try/catch omheen hadden gezet, met een logging stack.
[ Voor 10% gewijzigd door RobV op 04-05-2016 14:25 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
1
2
3
4
5
6
7
8
9
10
| private Foo _SomeFoo; internal string SomeFooStringRepresentation { get; set; } public Foo SomeFoo { get { return _SomeFoo; } set { SomeFooStringRepresentation = value?.ToString(); } } |
Private field heeft maar één usage, de getter in de property verderop...
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
1
2
3
4
5
6
7
8
9
10
11
12
13
| class SomeClass { public: bool operator==(const SomeClass& other) const { // some equality test } bool operator!=(const SomeClass& other) const { return operator!=(other); } }; |

Blijkbaar heeft iemand een SomeClass nooit op ongelijkheid hoeven testen
[ Voor 9% gewijzigd door .oisyn op 09-05-2016 22:53 ]
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| strong { font-weight: bold; } strong { font-weight: bold; } strong, b { font-weight: bold; } html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { border: 0 none; font-family: inherit; font-size: 100%; font-style: inherit; font-weight: inherit; margin: 0; outline: 0 none; padding: 0; vertical-align: baseline; } |
Kwam dit tegen in firebug, de bovenste twee regels staan overigens in een ander stylesheet maar goed daar staan dan weer wel alle twee in.
1
2
3
4
| if (result.Data != null && result.Data != null) { // do a thing } |
Check, dubbelcheck?
Het zou zo maar kunnen dat tussen de evaluatie van de eerste subexpressie en de evaluatie van de tweede een of andere thread wat heeft lopen prutsen?Robicide schreef op vrijdag 03 juni 2016 @ 16:25:
Misschien mis ik een enorm obscuur geval waarin dit nuttig zou zijn, maar:
C#:
1 2 3 4 if (result.Data != null && result.Data != null) { // do a thing }
Check, dubbelcheck?
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Of iets heel heel heel engs zoals neveneffecten op de getter.Robicide schreef op vrijdag 03 juni 2016 @ 16:25:
Misschien mis ik een enorm obscuur geval waarin dit nuttig zou zijn, maar:
C#:
1 2 3 4 if (result.Data != null && result.Data != null) { // do a thing }
Check, dubbelcheck?
1
2
3
4
5
6
7
8
9
| public string Data { get { this.flipper = !this.flipper; return this.flipper ? "Tekst" : null; } } [ |
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Ik zie het volgens mij over mijn hoofd, wat is er mis mee?F.West98 schreef op woensdag 30 maart 2016 @ 00:21:
C#:
1 int pageCount = (Int32)Math.Floor(Decimal.Divide(ItemCount, pageSize));
Tja. Hè. Wat moet je hier nou weer mee.
Beetje onhandige manier om gewoon te schrijvenSBTweaker schreef op vrijdag 03 juni 2016 @ 23:12:
[...]
Ik zie het volgens mij over mijn hoofd, wat is er mis mee?
1
| int pageCount = ItemCount / pageSize; |
Naast dat dit veel sneller is omdat dit een integer division is en er geen types gecast hoeven te worden enzo is het ook veel duidelijker
2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI
Ik ken het decimal type niet als het een float is met 2 getallen achter de comma en je voert een float in met 4 getallen zou hij anders afgerond worden.F.West98 schreef op vrijdag 03 juni 2016 @ 23:23:
[...]
Beetje onhandige manier om gewoon te schrijven
C#:
1 int pageCount = ItemCount / pageSize;
Naast dat dit veel sneller is omdat dit een integer division is en er geen types gecast hoeven te worden enzo is het ook veel duidelijker
Ach, off-by-one is een feature, geen bug.mcDavid schreef op zaterdag 04 juni 2016 @ 08:05:
Daarnaast zou je in dit geval Math.Ceil() willen gebruiken, anders mis je de pagina voor de laatste paar items.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
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.