Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
[ Voor 9% gewijzigd door Woy op 14-07-2009 11:21 ]
“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.”
"Please connect data jack and turn on the switch for reading log data"Sebazzz schreef op dinsdag 14 juli 2009 @ 11:17:
Wat moet ik mij voorstellen bij een gegevenshouthakker?En met een bocht op een schakelaar (voor lezing van boomstronk gegevens) aansluiten?
Zet- en drukfouten voorbehouden
[ Voor 6% gewijzigd door Matis op 14-07-2009 11:21 ]
If money talks then I'm a mime
If time is money then I'm out of time
Ah ja die miste ik net idd. Data jack en turn on the switch kon ik dan nog wel uitvogelen. Maar fuck zeg, echt een typische Babelfish vertaling. Why even bother?kenneth schreef op dinsdag 14 juli 2009 @ 11:19:
boomstronkgegevens -> log data?
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.
gelukkig kan het altijd ergerThooomas schreef op dinsdag 14 juli 2009 @ 19:59:
Haha Babelfish heeft inderdaad soms echt verschrikkelijke vertalingenOm zo'n vertaling ook echt te vertrouwen
Beetje offtopic, maar toch wel leuk.Woy schreef op dinsdag 14 juli 2009 @ 10:04:
[...]
Ik kwam laatst ook wel een "leuke" vertaling tegen in File-Zilla
"Bezig met host naam oplossen", ja resolve betekent oplossen als je het letterlijk vertaald, maar in deze context klint het nogal stom.
Ik was laatst de EeePC (de oude nog, van Asus 7" met flashgeheugen i.p.v. SSD), en daar moest ik mijn netwerkprinter voor instellen. Vroeg 'Linux' wat voorn printer het was, een Linux/Unix-printer of een 'Ramen' printer. Zat even gek te kijken.
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.
Nee alleen Vista.oisyn schreef op dinsdag 14 juli 2009 @ 22:03:
Doe mij ook zo'n ding, ik kan best wel wat nieuw geprintte ramen gebruiken. Print ie ook dubbelglas?
If money talks then I'm a mime
If time is money then I'm out of time
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| private Task findTask(Collection<Task> tasks, int id) { for (Task task : tasks) { if (task.getId() == id) { return task; } else if (task.getSubTasks() != null) { Task subTask = findTask(task.getSubTasks(), id); // Call naar zelfde methode if (subTask != null) { return subTask; } } break; } return null; } |
Alhoewel het in principe wel goed zal gaan, de boom structuur is nou eenmaal niet oneindig,
The ships hung in the sky in much the same way that bricks don’t.
Een foreach gebruiken en altijd bij het eerste element breaken of returnen. Echt goed doorlopen van de boom doet hij niet. Dus met twee of meer subtasks wordt alleen de eerste vergeleken met het ID.Standeman schreef op woensdag 15 juli 2009 @ 14:16:
Java:
1 2 3 4 5 6 7 8 9 private Task findTask(Collection<Task> tasks, int id) { for (Task task : tasks) { [..] break; } return null; }
[ Voor 7% gewijzigd door CoolGamer op 15-07-2009 14:22 ]
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
Lijkt mij toch een redelijk normale breadth-first recursive search implementatie...Standeman schreef op woensdag 15 juli 2009 @ 14:16:
Ik kwam net een stukje code tegen van mezelf dat me een best naar gevoel gaf:
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 private Task findTask(Collection<Task> tasks, int id) { for (Task task : tasks) { if (task.getId() == id) { return task; } else if (task.getSubTasks() != null) { Task subTask = findTask(task.getSubTasks(), id); // Call naar zelfde methode if (subTask != null) { return subTask; } } break; } return null; }
Alhoewel het in principe wel goed zal gaan, de boom structuur is nou eenmaal niet oneindig,
Edit: whoops, de break over het hoofd gezien, zie hierboven.
[ Voor 3% gewijzigd door Herko_ter_Horst op 15-07-2009 14:24 ]
"Any sufficiently advanced technology is indistinguishable from magic."
Op de utteloze break na zie ik niet zo heel veel vreemds aan deze implementatie. Het is gewoon een standaard implementaties gebruikmakend van recursie. Zolang je als pre conditie hebt dat een taak nooit een subtaak (of sub sub taak enz enz) van zichzelf kan zijn is er niks aan de hand.Standeman schreef op woensdag 15 juli 2009 @ 14:16:
Ik kwam net een stukje code tegen van mezelf dat me een best naar gevoel gaf:
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 private Task findTask(Collection<Task> tasks, int id) { for (Task task : tasks) { if (task.getId() == id) { return task; } else if (task.getSubTasks() != null) { Task subTask = findTask(task.getSubTasks(), id); // Call naar zelfde methode if (subTask != null) { return subTask; } } break; } return null; }
Alhoewel het in principe wel goed zal gaan, de boom structuur is nou eenmaal niet oneindig,
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Als die break er niet had gestaan was het volgens mij een depth-first, niet een breadth-first. Hij loopt een tak eerst helemaal door voordat hij naar de volgende tak gaat.Herko_ter_Horst schreef op woensdag 15 juli 2009 @ 14:23:
[...]
Lijkt mij toch een redelijk normale breadth-first recursive search implementatie...
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
TheCoolGamer schreef op woensdag 15 juli 2009 @ 14:21:
[...]
Een foreach gebruiken en altijd bij het eerste element breaken of returnen. Echt goed doorlopen van de boom doet hij niet. Dus met twee of meer subtasks wordt alleen de eerste vergeleken met het ID.

grmbl, dat krijg je als iemand steeds tegen aan zit te ouwehoeren.
Die conditie is er inderdaad. hmmm, zijn mijn implementaties toch beter dan gedachtJanoz schreef op woensdag 15 juli 2009 @ 14:31:
[...]
Op de utteloze break na zie ik niet zo heel veel vreemds aan deze implementatie. Het is gewoon een standaard implementaties gebruikmakend van recursie. Zolang je als pre conditie hebt dat een taak nooit een subtaak (of sub sub taak enz enz) van zichzelf kan zijn is er niks aan de hand.
[ Voor 37% gewijzigd door Standeman op 15-07-2009 14:34 ]
The ships hung in the sky in much the same way that bricks don’t.
[ Voor 77% gewijzigd door Janoz op 15-07-2009 15:08 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Dat merk ik ook wel eens ja, programmeren en iemand die tegen je aan loopt te praten gaat niet altijd samen.Standeman schreef op woensdag 15 juli 2009 @ 14:33:
[...]
Die break.
grmbl, dat krijg je als iemand steeds tegen aan zit te ouwehoeren.
Het valt wel op dat discussies in dit of andere PRG topics heel vaak weer over PHP gaan, en dan vaak ook weer worden afgesplitst. Wat een taaltje toch hè, dat PHPJanoz schreef op woensdag 15 juli 2009 @ 14:55:
De presentatie discussie is afgesplitst naar Over logica en presentatie. Mocht ik nog berichten vergeten zijn, stuur dan even een DM naar mij of 1 van mijn collega mods.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
En dat mijn post op een of andere manier altijd de eerste is die in de nieuwe topic belandtSebazzz schreef op donderdag 16 juli 2009 @ 13:07:
Het valt wel op dat discussies in dit of andere PRG topics heel vaak weer over PHP gaan

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.
Dan komt bij mij de vraag op waarom dat komt? Is PHP de taal waar veel beginnende programmeurs mee prutsen, of is het gewoon een rottaal?Sebazzz schreef op donderdag 16 juli 2009 @ 13:07:
Het valt wel op dat discussies in dit of andere PRG topics heel vaak weer over PHP gaan, en dan vaak ook weer worden afgesplitst. Wat een taaltje toch hè, dat PHP
Je bent niet de eerste die die vraag stelt.Stephan4kant schreef op donderdag 16 juli 2009 @ 23:46:
[...]
Dan komt bij mij de vraag op waarom dat komt? Is PHP de taal waar veel beginnende programmeurs mee prutsen, of is het gewoon een rottaal?
Verder ben ik het eens met MBV. Het is niet de meest geweldig in elkaar gebouwde scripttaal die er is, en tegelijkertijd zijn er zéér veel mensen met zeer weinig of de verkeerde kennis (op internet, maar ook in oude boeken, is ontzettend veel verkeerde informatie omtrent scripten met PHP te vinden).
Mijn opinie: veel beginnende programmeurs prutsen ermee. Voor de dingen doen waar het voor bedoeld was, dynamische webcontent, vind ik het absoluut geen rottaal. Tuurlijk, de syntax bevat wat rare dingen (zoals argument volgorde bij stringfuncties) en ik ben ooit eens een middag kwijt geweest omdat ofwel PHP's SoapClient, ofwel IIS' SoapServer zich niet aan de specificaties houden, en natuurlijk kan je er ongelovelijk ranzig mee coden, maar daar staat tegenover dat als je je best doet je ook ongelovelijk mooi kan coden.Stephan4kant schreef op donderdag 16 juli 2009 @ 23:46:
Dan komt bij mij de vraag op waarom dat komt? Is PHP de taal waar veel beginnende programmeurs mee prutsen, of is het gewoon een rottaal?
Vergelijk bijvoorbeeld eens function pointers in C++ met een variabele functienaam en eventueel bijbehorende magic __call in PHP - dan is die laatste (in elk geval voor mij) vele malen logischer. Sindskort heeft het late static binding, je kan zelf een classloader definieren voor dynamische includes (ik gebruik al jaren geen require / include's meer), dingen als een error en session handler zitten erin maar zijn relatief simpel te vervangen door je eigen exemplaren mocht je dat willen, etc etc etc. Combineer dat met een sublieme manual, een gigantische hoeveelheid libraries, enorme userbase en je hebt een ongelovelijk toegankelijke maar vooral ook fijne taal. En ja, je hebt mensen die er op neer kijken, so what - als je denkt dat je een betere programmeur bent omdat je in C++ of .NET werkt, good for you.
Om m'n post niet helemaal nutteloos te maken; een oud project, code geschreven door een collega die niet lang met ons was
1
| $wizzardPage = intval($postData['wizzard']); |
En m'n favoriete comment in die grote bende troep
1
2
| class Spider { const USER_ID = 358; # >:) muhaha |
Subliem!? Dat vind ik een beetje ovedreven eigenlijkCombineer dat met een sublieme manual
Wat is hier precies fout aan? Behalve dat het waarschijnlijk wizard moet zijn, maar dat ligt niet aan het programmeren.PHP:
1 2 3 <?php $wizzardPage = intval($postData['wizzard']); ?>
De volgorde van functieargumenten is iets dat deel uitmaakt van de meegeleverde library en dat heeft 0,0 te maken met syntax.FragFrog schreef op vrijdag 17 juli 2009 @ 01:38:
[...]
Tuurlijk, de syntax bevat wat rare dingen (zoals argument volgorde bij stringfuncties)
Een beetje maar?Patriot schreef op vrijdag 17 juli 2009 @ 03:11:
[...]
Subliem!? Dat vind ik een beetje ovedreven eigenlijk
En zelfs wizzard mag! Wikipedia: RincewindWat is hier precies fout aan? Behalve dat het waarschijnlijk wizard moet zijn, maar dat ligt niet aan het programmeren.
Zijdelings gerelateerd:
1
2
| echo intval(420000000000000000000); // 0 echo intval('420000000000000000000'); // 2147483647 |
/me cry *
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Java heeft ook zulke bugsNMe schreef op vrijdag 17 juli 2009 @ 03:21:
[...]
De volgorde van functieargumenten is iets dat deel uitmaakt van de meegeleverde library en dat heeft 0,0 te maken met syntax.
[...]
Een beetje maar?
[...]
En zelfs wizzard mag! Wikipedia: Rincewind
Zijdelings gerelateerd:
PHP:
1 2 echo intval(420000000000000000000); // 0 echo intval('420000000000000000000'); // 2147483647
/me cry *
'You like a gay cowboy and you look like a gay terrorist.' - James May
Care to explain? Ik kan me namelijk niet herinneren dat java ook maar ergens bij een groot getal automatisch maar maxint neemt.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Even schaamteloze copy paste van een TweakblogJanoz schreef op vrijdag 17 juli 2009 @ 09:03:
[...]
Care to explain? Ik kan me namelijk niet herinneren dat java ook maar ergens bij een groot getal automatisch maar maxint neemt.
1
2
| final long YEAR_IN_MS = 1000 * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS); |
Java zet alles eerst om naar int
'You like a gay cowboy and you look like a gay terrorist.' - James May
Dat is gedefinieerd gedrag van Java en er wordt in alle boeken, tutorials ed ook altijd behandeld. Literals zijn per definitie int, tenzij je er een L achter zet. Sterker nog als je een literal groter dan Integer.MAX_VALUE gebruikt dan zal de compiler gaan klagen.Phyxion schreef op vrijdag 17 juli 2009 @ 09:22:
[...]
Even schaamteloze copy paste van een Tweakblog![]()
Java:
1 2 final long YEAR_IN_MS = 1000 * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS);
Java zet alles eerst om naar int
In jouw voorbeeld wordt in eerste instanties het resultaat met ints berekend, waarbij overflow optreedt, en pas daarna wordt er converteerd naar long. Bij berekening waar één long in voorkomt wordt de rest ook geupcast naar een long en klopt het resultaat dus wel.
Dus het volgende geeft wat je wil:
1
2
| final long YEAR_IN_MS = 1000L * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS); |
[ Voor 17% gewijzigd door Remus op 17-07-2009 09:51 ]
1
2
| final long YEAR_IN_MS = 1000l * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS); |
Door iig 1 long op te nemen krijg je long * int = long waardoor het resultaat al voor het in de variabele zetten als long behandeld wordt.
Goed, het blijft vervelend en lastig terug te vinden, maar ten eerste doet java het enkel bij een berekening die een overflow oplevert en dus niet 1 of andere exotische cast omdat je toevallig de println gebruikt.
Verder wordt er niet zomaar MAX_INT gebruikt, maar worden de bits die buiten het bereik geschreven worden genegeerd. Dit is
1 - vaak wat er ook wordt verwacht
2 - duidelijk in de standaard gedocumenteerd http://java.sun.com/docs/...ypesValues.doc.html#51035
3 - altijd hetzelfde (dus niet in het ene geval 0 en in het andere geval MAX_INT)
Het blijft echter wel vervelend dat de overflow niet (zomaar) gedetecteerd kan worden.
--edit--- Hmm, volgende keer maar even niet op zoek gaan naar de specificaties om een SpuitElfException te voorkomen
[ Voor 4% gewijzigd door Janoz op 17-07-2009 09:58 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Zoals al uitgelegd hierboven is dat logisch gedrag, omdat je int's met int's vermenigvuldigd. Het is logisch dat het resultaat een int is.Phyxion schreef op vrijdag 17 juli 2009 @ 09:22:
[...]
Even schaamteloze copy paste van een Tweakblog![]()
Java:
1 2 final long YEAR_IN_MS = 1000 * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS);
Java zet alles eerst om naar int
1
2
3
| long someval = 1000; final long YEAR_IN_MS = someval * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS); |
Zal dan ook gewoon goed gaan, want het resultaat van een long * int = long
edit:
Hier nog een SpuitElfRuntimeException
[ Voor 3% gewijzigd door Woy op 17-07-2009 09:59 ]
“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.”
Ik weet dat het gedocumenteerd is maar je assigned wel naar long, niet naar int. int * int is uiteraard int, maar je kan ook voor een eenvoudige oplossing kiezen door YEAR_IN_MS eerst op 1 doen bijvoorbeeld en dan YEAR_IN_MS *= 1000 * 60 * 60 * 24 * 365;Remus schreef op vrijdag 17 juli 2009 @ 09:48:
[...]
Dat is gedefinieerd gedrag van Java en er wordt in alle boeken, tutorials ed ook altijd behandeld. Literals zijn per definitie int, tenzij je er een L achter zet. Sterker nog als je een literal groter dan Integer.MAX_VALUE gebruikt dan zal de compiler gaan klagen.
In jouw voorbeeld wordt in eerste instanties het resultaat met ints berekend, waarbij overflow optreedt, en pas daarna wordt er converteerd naar long. Bij berekening waar één long in voorkomt wordt de rest ook geupcast naar een long en klopt het resultaat dus wel.
Dus het volgende geeft wat je wil:
Java:
1 2 final long YEAR_IN_MS = 1000L * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS);
'You like a gay cowboy and you look like a gay terrorist.' - James May
Ja dat kun je doen, maar logisch is het niet!Phyxion schreef op vrijdag 17 juli 2009 @ 10:06:
[...]
Ik weet dat het gedocumenteerd is maar je assigned wel naar long, niet naar int. int * int is uiteraard int, maar je kan ook voor een eenvoudige oplossing kiezen door YEAR_IN_MS eerst op 1 doen bijvoorbeeld en dan YEAR_IN_MS *= 1000 * 60 * 60 * 24 * 365;
Je moet de assignment gewoon los zien van de berekening, en het is compleet logisch. In sommige gevallen wil je gewoon een overflow in plaats van een opschaling naar long. Het is gewoon belangrijk om begrip van de onderliggende datatypes te hebben.
“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.”
Ik vind het dan logischer als je dat wilt om het dan zelf te casten naar int dan het in zo'n geval stuk te laten lopen. Persoonlijk misschien, maar zulke keuzes vind ik echt slecht.Woy schreef op vrijdag 17 juli 2009 @ 10:09:
[...]
Ja dat kun je doen, maar logisch is het niet!
Je moet de assignment gewoon los zien van de berekening, en het is compleet logisch. In sommige gevallen wil je gewoon een overflow in plaats van een opschaling naar long. Het is gewoon belangrijk om begrip van de onderliggende datatypes te hebben.
'You like a gay cowboy and you look like a gay terrorist.' - James May
In java is een expressie (en het resultaat van die expressie) onafhankelijk van de variabele waaraan het uiteindelijk wordt toegekend. Als je met longs wil rekenen, zul je dus ook gewoon met minimaal met een long moeten rekenen. En dat doe je hier simpelweg niet. Pas als de expressie is geevalueerd wordt de waarde gecast naar long en toegekend aan de variabelePhyxion schreef op vrijdag 17 juli 2009 @ 10:06:
[...]
Ik weet dat het gedocumenteerd is maar je assigned wel naar long, niet naar int. int * int is uiteraard int, maar je kan ook voor een eenvoudige oplossing kiezen door YEAR_IN_MS eerst op 1 doen bijvoorbeeld en dan YEAR_IN_MS *= 1000 * 60 * 60 * 24 * 365;
Het is dus geen bug zoals jij het noem, maar gewoon gedefinieerd gedrag en - in tegenstelling tot veel dingen in PHP - een bewuste keuze van de ontwerpers.
Dit noem ik wel een 'slecht programmeervoorbeeld': gebruik dan een hoofdletter LJanoz schreef op vrijdag 17 juli 2009 @ 09:57:
Java:
1 2 final long YEAR_IN_MS = 1000l * 60 * 60 * 24 * 365; System.out.println(YEAR_IN_MS);
Dat is geen slecht programmeervoorbeeld, maar eerder een "slecht stijlvoorbeeld". De kleine letter is inderdaad een stuk foutgevoeliger. Maar met een beetje goede code highlighting zou het geen probleem op moeten leveren.Remus schreef op vrijdag 17 juli 2009 @ 10:19:
[...]
Dit noem ik wel een 'slecht programmeervoorbeeld': gebruik dan een hoofdletter Lom het onderscheid tussen 1 en L te verduidelijken.
“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.”
NMe schreef op vrijdag 17 juli 2009 @ 03:21:
[...]
De volgorde van functieargumenten is iets dat deel uitmaakt van de meegeleverde library en dat heeft 0,0 te maken met syntax.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Foo { public void Bar( int x, int y ) { Console.WriteLine (String.Format("x: {0} y: {1}", x, y)); } public class Program { public static void Main() { Foo f = new Foo(); f.Bar (y: 10, x: 5); } } |
uit:
http://msmvps.com/blogs/j...evil-code-of-the-day.aspx
https://fgheysels.github.io/
Dat doet VS niet by default, dus in plaats daarvan hebben we bij C# een mooie gedocumenteerd compiler warningWoy schreef op vrijdag 17 juli 2009 @ 10:21:
[...]
Dat is geen slecht programmeervoorbeeld, maar eerder een "slecht stijlvoorbeeld". De kleine letter is inderdaad een stuk foutgevoeliger. Maar met een beetje goede code highlighting zou het geen probleem op moeten leveren.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Interessant; ik was tot nu toe onder de veronderstelling dat Java wel een exception gooit als een integer ergens overflowt. Niets blijkt minder waar:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| int myint = 1; for (int i=0;i<16;i++) { myint = myint * 256; System.out.println(myint); } /* 256 65536 16777216 0 0 0 0 0 0 0 0 0 0 0 0 0 */ |
Het is duidelijk dat ik al meer dan een jaar niets in Java heb gedaan, en alleen nog hier en daar wat in Python programmeer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| myint = 1 for i in range(16): myint = myint * 256 print myint # 256 # 65536 # 16777216 # 4294967296 # 1099511627776 # 281474976710656 # 72057594037927936 # 18446744073709551616 # 4722366482869645213696 # 1208925819614629174706176 # 309485009821345068724781056 # 79228162514264337593543950336 # 20282409603651670423947251286016 # 5192296858534827628530496329220096 # 1329227995784915872903807060280344576 # 340282366920938463463374607431768211456 |
Computer Science: describing our world with boxes and arrows.
Dat vind ik veel viezer dan gewoon:Phyxion schreef op vrijdag 17 juli 2009 @ 10:06:
[...]
Ik weet dat het gedocumenteerd is maar je assigned wel naar long, niet naar int. int * int is uiteraard int, maar je kan ook voor een eenvoudige oplossing kiezen door YEAR_IN_MS eerst op 1 doen bijvoorbeeld en dan YEAR_IN_MS *= 1000 * 60 * 60 * 24 * 365;
1
| long melp = 1000L * 60 * 60 * 24 * 365 |
hoor ....
https://fgheysels.github.io/
Interessante code, zeker als je het complete voorbeeld bekijkt, vrij logisch dat C# dat ervan maakt, maar zoals gezegd best wel evil codewhoami schreef op vrijdag 17 juli 2009 @ 10:28:
[...]
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Foo { public void Bar( int x, int y ) { Console.WriteLine (String.Format("x: {0} y: {1}", x, y)); } public class Program { public static void Main() { Foo f = new Foo(); f.Bar (y: 10, x: 5); } }
uit:
http://msmvps.com/blogs/j...evil-code-of-the-day.aspx
@ Hierboven,
Dit was bedoeld voor Java, niet om zelf zo te coden.
[ Voor 4% gewijzigd door Phyxion op 17-07-2009 10:36 ]
'You like a gay cowboy and you look like a gay terrorist.' - James May
De meeste talen zijn "zo goed als degene die ermee werkt" De mogelijkheden om mooi en goed te scripten (waarbij ik geen onderscheid wens te maken tussen OOP of structureel, beiden kan prima werken) zijn er wel (in JS, JAVA, C#, PHP enz) maar sommige van die talen zijn wat losser of gaan in elk geval wat gemakkelijker om met de "regeltjes" die er zijn.
PHP bijvoorbeeld vind ik ook een leuke, maar tegelijkertijd prima taal. Mits je weet wat je doet, altijd alle errors weergeeft in je ontwikkelomgeving (online natuurlijk op de achtergrond afvangen en bezoekers met een logische melding "afschepen") kan je er leuke dingen mee maken.
Wat ik in bijna alle (al moet ik eerlijk bekennen dat ik er helemaal geen ken) boeken slecht vind is dat ze bijna nooit isset() gebruiken en al helemaal error_reporting niet aan hebben staan. Ze noemen het vaak wel (ergens heel klein/ weggestopt op een plek waar niemand het opmerkt) even, maar geven niet aan dat je dat het best aan kan zetten tijdens de ontwikkeling en uit schakelen bij je online versie.
Daar gaat de beginnende PHP-er al meteen de fout in, omdat hij niet leert om volgens de standaard te werken. Iets wat je slecht aanleert is heel moeilijk om daarna weer af te leren.Sterker nog: Het is moeilijker om iets af te leren dan om iets aan te leren.
Behalve hier op 't forum zit ik ook op 2 andere Nederlandstalige (php) fora, zo vaak als je daar bijna kan volstaan met
1
2
3
4
| <?php ini_set('error_reporting',1); error_reporting(E_ALL); ?> |
(dit is even snel getypt, kan best een typefoutje inzitten)
Dan zien ze een melding gaan verder kijken en "Hé, dit is de melding..."
Laat boeken bij de basis beginnen, dus ook tijdens het leren aangeven wat fouten zijn, veroorzaakt, de melding is en hoe je ze op kan lossen/ snel terug kan vinden. (en nog veeel beter: Hoe kan je ze voorkomen)
[ Voor 10% gewijzigd door jbdeiman op 17-07-2009 10:39 ]
Idd.Sebazzz schreef op vrijdag 17 juli 2009 @ 10:30:
[...]
Dat doet VS niet by default, dus in plaats daarvan hebben we bij C# een mooie gedocumenteerd compiler warning
Nooit op gelet eigenlijk, maar net even getest.
https://fgheysels.github.io/
Casting regels zijn in java heel duidelijk, intuïtief en bruikbaar. Wat jij 'logisch' vind heeft als gevolg dat of elke primitieve berekening van byte en int middels 64 bit long arithmetics uitgevoerd moet worden, of dat bij elke simpele operatie gekeken moet worden of er een overflow is en vervolgens de hele berekening opnieuw gedaan worden met een breder type. Wat is dan überhaupt nog het nut van de kleinere types?Phyxion schreef op vrijdag 17 juli 2009 @ 10:12:
Ik vind het dan logischer als je dat wilt om het dan zelf te casten naar int dan het in zo'n geval stuk te laten lopen. Persoonlijk misschien, maar zulke keuzes vind ik echt slecht.
@Remus:
Je hebt helemaal gelijk.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Het hoeft niet bij alles, maar met een final/const is het natuurlijk heel anders.Janoz schreef op vrijdag 17 juli 2009 @ 10:38:
[...]
Casting regels zijn in java heel duidelijk, intuïtief en bruikbaar. Wat jij 'logisch' vind heeft als gevolg dat of elke primitieve berekening van byte en int middels 64 bit long arithmetics uitgevoerd moet worden, of dat bij elke simpele operatie gekeken moet worden of er een overflow is en vervolgens de hele berekening opnieuw gedaan worden met een breder type. Wat is dan überhaupt nog het nut van de kleinere types?
@Remus:
Je hebt helemaal gelijk.
'You like a gay cowboy and you look like a gay terrorist.' - James May
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ja want laten we voor elke manier van definitie maar andere regels gaan bedenken, daar word het een stuk duidelijker van?Phyxion schreef op vrijdag 17 juli 2009 @ 10:46:
[...]
Het hoeft niet bij alles, maar met een final/const is het natuurlijk heel anders.
Dan zou de waarde van een variabele dus niet alleen afhangen van welk data-type het is, maar ook met welke modifiers hij gedeclareerd word.
Die is inderdaad wel evil, maar het omwisselen van parameter namen in een override van een functie past dan wel weer mooi in dit topicwhoami schreef op vrijdag 17 juli 2009 @ 10:28:
[...]
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Foo { public void Bar( int x, int y ) { Console.WriteLine (String.Format("x: {0} y: {1}", x, y)); } public class Program { public static void Main() { Foo f = new Foo(); f.Bar (y: 10, x: 5); } }
uit:
http://msmvps.com/blogs/j...evil-code-of-the-day.aspx
[ Voor 40% gewijzigd door Woy op 17-07-2009 11:06 ]
“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.”
[ Voor 11% gewijzigd door Zoijar op 17-07-2009 11:09 ]
Ik vind het wel duidelijk dat het gewoon niet automatisch gedaan word. Bij C# krijg je overigens gewoon een compiler error als een vermenigvuldiging van literals een overflow oplevert.Zoijar schreef op vrijdag 17 juli 2009 @ 11:05:
Ik vind het wel een beetje vreemd eigenlijk dat een literal niet gewoon het grootste type heeft. Dat de assignment naar een int fout gaat is geheel logisch, maar dat de vermenigvuliding van twee literals al overflowed is bewerkelijk.
The operation overflows at compile time in checked mode
Op zich zou dat netjes zijn, maar het verschil met floats is natuurlijk al dat de waarde in de float niet exact overeen hoeft te komen met de literal.Als je een cijfer teveel achter de komma typed by een float literal, gaat het dan ook fout?
[ Voor 4% gewijzigd door Woy op 17-07-2009 11:10 ]
“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.”
Dat ze bij literals voor gehele getallen voor de 32bit int gekozen hebben ipv de 64bit long is waarschijnlijk uit efficiëntie overwegingen (in uitvoer en bij het programmeren). In 99% van de gevallen zou je daar toch een int bedoelen (bedenk dat het begin jaren 90 is dat de standaard is opgesteld), en om een long in een int te krijgen heb je een expliciete cast nodig.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Volgens mij werkt dat helemaal niet. De expressie rechts van *= overflowed nog steeds voordat *= wordt uitgevoerd.Woy schreef op vrijdag 17 juli 2009 @ 10:09:
Ja dat kun je doen, maar logisch is het niet!
Daar heb je idd ook nog eens gelijk in.Olaf van der Spek schreef op vrijdag 17 juli 2009 @ 11:14:
[...]
Volgens mij werkt dat helemaal niet. De expressie rechts van *= overflowed nog steeds voordat *= wordt uitgevoerd.
“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.”
Efficientie boeit niet echt bij literals: ik mag aannemen dat de java compiler dat fold (Ook in het geval van (int)x * 2, zou je compiler moeten zien dat 2 als int kan). Ik denk eerder dat de rede is dat ze bijvoorbeeld compiler makers voor 32bit platformen niet willen dwingen om 64bit integer arithmetic te implementeren. Het is dus om implementatie van de compiler te versimpelen, niet omdat het zo logisch programmeert.Janoz schreef op vrijdag 17 juli 2009 @ 11:11:
Dat ze bij literals voor gehele getallen voor de 32bit int gekozen hebben ipv de 64bit long is waarschijnlijk uit efficiëntie overwegingen (in uitvoer en bij het programmeren). In 99% van de gevallen zou je daar toch een int bedoelen (bedenk dat het begin jaren 90 is dat de standaard is opgesteld), en om een long in een int te krijgen heb je een expliciete cast nodig.
[ Voor 11% gewijzigd door Zoijar op 17-07-2009 11:18 ]
Janoz bedoelt denk efficientie van het data-type. Aangezien de meeste mensen gewoon een literal zonder toevoegingen gebruiken, kun je het standaard type beter het type maken wat onder de meeste omstandigheden het efficientst is.Zoijar schreef op vrijdag 17 juli 2009 @ 11:16:
[...]
Efficientie boeit niet echt bij literals: ik mag aannemen dat de java compiler dat fold. Ik denk eerder dat de rede is dat ze bijvoorbeeld compiler makers voor 32bit platformen niet willen dwingen om 64bit integer arithmetic te implementeren.
“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.”
Efficient in welk opzicht?Woy schreef op vrijdag 17 juli 2009 @ 11:19:
Janoz bedoelt denk efficientie van het data-type. Aangezien de meeste mensen gewoon een literal zonder toevoegingen gebruiken, kun je het standaard type beter het type maken wat onder de meeste omstandigheden het efficientst is.
Normaals, ik snap dus de design beslissing wel, maar er werd hier net gedaan of die beslissing is gemaakt omdat het zo makkelijk programmeert, terwijl ik juist denk dat de beslissing alleen is gemaakt omdat het het schrijven van portable compilers een stuk simpeler maakt. Het programmeert natuurlijk makkelijker als je helemaal niet op dat soort dingen hoeft te letten.
[ Voor 30% gewijzigd door Zoijar op 17-07-2009 11:26 ]
Maar verder denk ik wel dat je gelijk hebt. Ik heb er ook "in uitvoer en programmeren" bij gezet en vervolgens enkel een voorbeeld over het programmeren bij gezet waarmee ik eigenlijk enkel aan wilde geven dat je toch vaak uit kunt met de int ipv de long. En ja, dat is eigenlijk meer het verdedigen van het uiteindelijke gevolg van de ontwerpbeslissing ipv de echte achterliggende reden van de beslissing.
[ Voor 35% gewijzigd door Janoz op 17-07-2009 11:29 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Daarom zei ik ook "onder de meeste omstandigheden". De meeste talen zijn ontworpen met 32 bits processoren in het achterhoofd.Zoijar schreef op vrijdag 17 juli 2009 @ 11:20:
[...]
Efficient in welk opzicht?Op een 64bit platform is een 32bit int niet efficient.
Ik zal niet ontekennen dat de keuze waarschijnlijk grotendeels gebaseerd is op de complexiteit van de compiler. Maar het geeft wel controle over wat er gebeurt, en dat is in sommige gevallen ook wel fijn.Normaals, ik snap dus de design beslissing wel, maar er werd hier net gedaan of die beslissing is gemaakt omdat het zo makkelijk programmeert, terwijl ik juist denk dat de beslissing alleen is gemaakt omdat het het schrijven van portable compilers een stuk simpeler maakt. Het programmeert natuurlijk makkelijker als je helemaal niet op dat soort dingen hoeft te letten.
“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.”
Jaja, strict genomen heb je gelijk, maar je snapt wat ik bedoel - de default libraries zijn wat maf somsNMe schreef op vrijdag 17 juli 2009 @ 03:21:
De volgorde van functieargumenten is iets dat deel uitmaakt van de meegeleverde library en dat heeft 0,0 te maken met syntax.
De vier manuals / API's die ik meestal gebruik zijn die van PHP, JAVA, AS3 en C++. Daarvan bied die van PHP veel meer voorbeelden dan de anderen, hebben alleen die van PHP en C++ een overzichtelijke groepering (die verder gaat dan een lijst classes), geven de PHP & C++ search me de meest zinnige resultaten en vind ik alleen bij de PHP manual ook extra info als installatie instructies voor externe libraries. Overall ben ik nog geen betere tegengekomen.Een beetje maar?
Ik ben trouwens niet de enige die er zo over denkt
Ik vind de Java doc's anders zeer uitgebreid, maar ben het met je eens dat ze misschien iets meer examples in de doc's op hadden kunnen nemen. Maar dat het niet gegroepeerd is ben ik niet met je eens, de namespaces zijn immers IMHO best duidelijk gekozen, en dat is dus een duidelijk groepering.FragFrog schreef op vrijdag 17 juli 2009 @ 14:36:
[...]
De vier manuals / API's die ik meestal gebruik zijn die van PHP, JAVA, AS3 en C++. Daarvan bied die van PHP veel meer voorbeelden dan de anderen, hebben alleen die van PHP en C++ een overzichtelijke groepering (die verder gaat dan een lijst classes), geven de PHP & C++ search me de meest zinnige resultaten en vind ik alleen bij de PHP manual ook extra info als installatie instructies voor externe libraries. Overall ben ik nog geen betere tegengekomen.
Bij de PHP doc's staan misschien wel een hoop examples, maar een groot nadeel daarvan is dat er ook vaak, zeker in de comments, enorme fouten in de examples zitten.
Wat dat betreft verdiend MS echt een groot compliment, de documentatie van hun is meestal erg goed!
Ik ben trouwens niet de enige die er zo over denkt
resemples ?

“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.”
Dat lijkt me niet per definitie waar. Sterker nog, 32 bit variabelen zouden best eens efficienter kunnen zijn dan 64 bit variabelen op een 64 bit platform.Zoijar schreef op vrijdag 17 juli 2009 @ 11:20:
Efficient in welk opzicht?Op een 64bit platform is een 32bit int niet efficient.
En dat helpt wil je zeggen? Het ding waar je mee vermenigvuldigt is nog altijd een int waar 1000 * 60 * 60 * 24 * 365 niet in pastPhyxion schreef op vrijdag 17 juli 2009 @ 10:06:
[...]
Ik weet dat het gedocumenteerd is maar je assigned wel naar long, niet naar int. int * int is uiteraard int, maar je kan ook voor een eenvoudige oplossing kiezen door YEAR_IN_MS eerst op 1 doen bijvoorbeeld en dan YEAR_IN_MS *= 1000 * 60 * 60 * 24 * 365;
.edit: ah dat was al gezegd
Wel suf dat de compiler er niet op warnt overigens.
[ Voor 7% gewijzigd door .oisyn op 21-07-2009 13:48 ]
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.
Van de .NET documentatie zeker weten wel ja, maar in de Win32 api documentatie zitten af en toe wel wat gaten.Woy schreef op vrijdag 17 juli 2009 @ 14:47:
[...]
Wat dat betreft verdiend MS echt een groot compliment, de documentatie van hun is meestal erg goed!
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Verwijderd
1
2
3
4
| $handle = fopen($url, "r"); while (!feof($handle)) { $buffer .= fgets($handle, 4096); } |
Resultaat:
23 miljoen regels in de error_log van Apache in een tijd van 4 minuten en 32 seconden.
Dat is ruim 86.000 errors per seconde, goed voor een totaal van 5 GB aan error_log.
En als mooie bijvangst gingen er 267 websites down.
Voor degenen die het niet zien: wat gebeurt er als de URL niet opgevraagd kan worden door bijvoorbeeld een network timeout of een name resolving error?
Niet, long double is vaak nog groter dan double.Janoz schreef op vrijdag 17 juli 2009 @ 11:11:
Een floating point literal is standaard een double. Daar heb je automatisch al het grootste type.
Output van:
1
| cout << sizeof(1.0) << " " << sizeof(long double) << "\n"; |
op g++ 4.3.3:
1
| 8 12 |
Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.
Pff, de php manual schiet ook vaak te kort hoor. Zo is de PDO doccumentatie niet volledig. Vandaag wou ik nog aan de slag met filter_input (), wat blijkt:FragFrog schreef op vrijdag 17 juli 2009 @ 14:36:
[...]
Jaja, strict genomen heb je gelijk, maar je snapt wat ik bedoel - de default libraries zijn wat maf soms
[...]
De vier manuals / API's die ik meestal gebruik zijn die van PHP, JAVA, AS3 en C++. Daarvan bied die van PHP veel meer voorbeelden dan de anderen, hebben alleen die van PHP en C++ een overzichtelijke groepering (die verder gaat dan een lijst classes), geven de PHP & C++ search me de meest zinnige resultaten en vind ik alleen bij de PHP manual ook extra info als installatie instructies voor externe libraries. Overall ben ik nog geen betere tegengekomen.
Ik ben trouwens niet de enige die er zo over denkt
1
2
3
| Parameters - filter Filter to apply. Defaults to FILTER_DEFAULT. |
Ja, en waar is de rest?
[ Voor 26% gewijzigd door XWB op 24-07-2009 23:26 ]
Java, waar ik het over had, heeft geen long double.bobo1on1 schreef op vrijdag 24 juli 2009 @ 22:20:
[...]
Niet, long double is vaak nog groter dan double.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
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
| try { .... } catch (Exception e) { return; } |
En dan maak je een typo en dan verwijst je goto ineens naar een label in een andere prodecure...ValHallASW schreef op zaterdag 25 juli 2009 @ 21:32:
De opmerking van Sebazzz dat 'goto een no-go is' is hier dan ook gewoon onzin.
Goto is gewoon fundamenteel slecht. Een oud-professor van mijn universiteit heeft daar wel een keertje over gerant.
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Persoonlijk vind ik dat het altijd mogelijk is spaghetti code te schrijven, of je nou goto gebruikt of niet
Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.
Ik ben het zeker met je eens dat je ze, als he het kunt vermijden, niet moet gebruiken, maar soms kom je er niet onderuit
Jouw opmerking is eerder kritiek op naamgeving dan op goto's an sich. Als je al je variabelen i1, i2, i3 ... i5144, i5145 noemt dan krijg je ook de meest wazige dingen als je met de verkeerde gaat rekenen door een typo. Als je echter je error-deel (functienaam)_error of zo noemt, en verder naar goed gebruik geen goto's gebruikt, is het al heel lastig om met een simpele typo ergens compleet anders uit te komen.
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Als je code schrijft waarbij door een typo opeens een andere functie of variabele wordt aangeroepen ben je eerder een fundamenteel slechte programmeurGrijze Vos schreef op zondag 26 juli 2009 @ 00:24:
[...]
En dan maak je een typo en dan verwijst je goto ineens naar een label in een andere prodecure...
Goto is gewoon fundamenteel slecht. Een oud-professor van mijn universiteit heeft daar wel een keertje over gerant.
Het maken van een typo heeft imo niets te maken met een programmeertaal, maar ligt volledig bij de programmeur, al wordt het met code-completion wel makkelijker om een 'typo' te maken doordat je per ongeluk de verkeerde suggestie uit een lijstje kan selecteren.
Kater? Eerst water, de rest komt later
Heb je ook zelf al eens de moeite gelezen om het artikel te lezen? Hij betoogt namelijk dat gebruik van goto er gemakkelijk voor kan zorgen dat het niet meer mogelijk is om in te zien in welke 'state' het programma zich bevindt: je kunt immers raar tussen lussen springen. Hij betoogt dan ook om lussen en functies te gebruiken in plaats van goto's - daar raak je immers het overzicht kwijt (lees maar eens GWBASIC-code...). Daar is bij deze constructie alleen helemaal geen sprake van! Het enige probleem is dat er de mogelijkheid bestaat om vanuit een ander punt óók naar dit label te springen - maar dan zou dát het slechte programmeervoorbeeld zijn.Grijze Vos schreef op zondag 26 juli 2009 @ 00:24:
[...]
Een oud-professor van mijn universiteit heeft daar wel een keertje over gerant.
Daar is geen 'Haan schreef op zondag 26 juli 2009 @ 09:15:
[...]
Als je code schrijft waarbij door een typo opeens een andere functie of variabele wordt aangeroepen ben je eerder een fundamenteel slechte programmeur
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Wat zijn eigenlijk precies de werkzaamheden van een programmeur?Haan schreef op zondag 26 juli 2009 @ 09:15:
Als je code schrijft waarbij door een typo opeens een andere functie of variabele wordt aangeroepen ben je eerder een fundamenteel slechte programmeur
Je hebt programmeurs die vanaf de vraag (vraag om bepaalde functionaliteit) t/m het schrijven van de documentatie alles zelf doen. Maar je hebt ook programmeurs die maar een deel van de rit doen, zoals alleen maar inkloppen van code waarvan iemand anders in een blokdiagram het gedrag van variabelen al heeft gedefinieerd.
Speel ook Balls Connect en Repeat
Als hobby-programmeur ben je ook nog documentarist, designer (als in: UI-design), en marketingmanager
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Wanneer het inderdaad op een manier gebruikt word wanneer een algoritme een stuk duidelijker word, vind ik het persoonlijk ook totaal niet verkeerd. Uiteindelijk wil je werkende code die goed te onderhouden is. Dit krijg je niet door hemel en aarde bewegen om de zelfde functionaliteit op een compleet onduidelijke manier zonder goto aan de man te brengen. Wanneer je het zo aanpakt vind ik het ook gewoon fundamenteel fout. Wat mij betreft kan je het een beetje vergelijken met het hebben van een hamer en een schroevendraaier. Omdat opa gezegd heeft dat de hamer een groot, eng monster is, gebruik je de schroevendraaier maar om een spijkertje in een stuk hout te slaan.In one case, a single "goto" doubled the speed of a
time-critical application; in the other case, "goto" shortens a segment of
code by half and makes the algorithm much clearer.
When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.
Verwijderd
Tja, iedereen kan natuurlijk een quote ergens vandaan halen die mooi in zijn straatje past. Het liefst zag ik toch een bepaalde context waaruit het één en ander blijkt.icyx schreef op zondag 26 juli 2009 @ 16:50:
Kijk, in het artikel op kerneltrap word, vind ik, duidelijk door Linus & Scott Robert Ladd aangegeven wanneer het niet fout is om een goto te gebruiken. Zie dit stukje:
[...]
Wanneer het inderdaad op een manier gebruikt word wanneer een algoritme een stuk duidelijker word, vind ik het persoonlijk ook totaal niet verkeerd. Uiteindelijk wil je werkende code die goed te onderhouden is. Dit krijg je niet door hemel en aarde bewegen om de zelfde functionaliteit op een compleet onduidelijke manier zonder goto aan de man te brengen.
Natuurlijk kan dat altijd, maar dat is ook het hele idee. Ik ben het (denk ik) met je eens dat het vaak bad behaviour is om goto te gebruiken, maar juist die enkele uitzonderingen, die voorbeeldjes uit mijn straatje, maken het wat mij betrefd op dat soort momenten legitiem. Zoals het stukje code waar de discussie op kerneltrap mee begint:Verwijderd schreef op zondag 26 juli 2009 @ 17:43:
[...]
Tja, iedereen kan natuurlijk een quote ergens vandaan halen die mooi in zijn straatje past. Het liefst zag ik toch een bepaalde context waaruit het één en ander blijkt.
1
2
3
4
5
6
7
8
9
10
| if (spin_trylock(&tty_lock.lock)) goto got_lock; if (tsk == tty_lock.lock_owner) { WARN_ON(!tty_lock.lock_count); tty_lock.lock_count++; return flags; } spin_lock(&tty_lock.lock); got_lock: WARN_ON(tty_lock.lock_owner); |
GOTO vrij:
1
2
3
4
5
6
7
8
| if (!(spin_trylock(&tty_lock.lock))){ if (tsk ==tty_lock.lock_owner){ WARN_ON(!tty_lock.lcok_count); tty_lock.lock_count++; return flags; } } WARN_ON(tty_lock.lock_owner); |
Persoonlijk vind ik het eerste excerpt een stuk eleganter. Het (eenvoudige) error handling principe is wat mij betreft een stuk eleganter dan het op meerdere niveaus nesten de code, om vervolgens hetzelfde resultaat te krijgen.
When you think you’ve succeeded / but something’s missing / means you have been defeated / by greed, your weakness.
Het punt van de on error resume next is dat je helemaal geen foutafhandelijk doet, maar dat je errors gewoon keihard negeert.ValHallASW schreef op zaterdag 25 juli 2009 @ 21:32:
Zowel voor ON ERROR GOTO als ON ERROR RESUME NEXT geldt dat je zelf de foutafhandeling moet doen
Kan dat in VB? My god...Grijze Vos schreef op zondag 26 juli 2009 @ 00:24:
En dan maak je een typo en dan verwijst je goto ineens naar een label in een andere prodecure...
on error goto != goto. Voor foutafhandeling in VB had je niet zo heel veel andere keuze.Goto is gewoon fundamenteel slecht.
Zoals altijd geldt: use with care. De goto is daar niet veel anders in. De term "goto is evil" is goed om beginnende programmeurs mee om hun oren te slaan, maar hij is niet per definitie waar.Een oud-professor van mijn universiteit heeft daar wel een keertje over gerant.
[ Voor 20% gewijzigd door .oisyn op 26-07-2009 18:27 ]
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.
Kan in C ook met longjmp, dat maakt het nog niet minder slecht natuurlijk.
Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.
Afhankelijk van de type foutmelding laat ik het programma stoppen of doorgaan. Een fout is weliswaar een fout, maar soms is een fout minder erg waardoor het programma evengoed door kan gaan met de bewerking.
Geen goto dus, maar gewoon een nette aanroep van een functie.
[ Voor 8% gewijzigd door Onbekend op 26-07-2009 19:11 ]
Speel ook Balls Connect en Repeat
We hadden het over een goto waar je per ongeluk een label uit een andere functie refereert. Dat is een taaltechnisch iets. Dat C een functie heeft die de stack state opslaat zodat je die later weer kunt gebruiken is een heel ander verhaal. Dergelijke functies zou je in elke taal kunnen implementeren.bobo1on1 schreef op zondag 26 juli 2009 @ 19:05:
[...]
Kan in C ook met longjmp, dat maakt het nog niet minder slecht natuurlijk.
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.
Wat denk je zelf? Dat ik iets link zonder het gelezen te hebben? Ik heb genoeg assembly geschreven om te weten hoe onoverzichtelijk een paar goto's worden.ValHallASW schreef op zondag 26 juli 2009 @ 14:10:
[...]
Heb je ook zelf al eens de moeite gelezen om het artikel te lezen?
Ik begrijp dat je in VB niet veel keuze hebt omdat er geen zinnige try/catch constructie is, maar dat maakt de constructie niet automagisch beter.
Dat iets evil is betekent gewoon dat je het moet vermijden tenzij noodzakelijk. Soms is die noodzaak er inderdaad. Als je een kernel bouwt en het is 2x zo snel om iets met een jump te doen, dan moet je dat vooral doen. Je moet wel -weten- wat je doet. Het niveau van de programmeurs in het werkveld is echter bedroevend laag, dus ik ben liever iets kritischer bij dit soort dingen..oisyn schreef op zondag 26 juli 2009 @ 18:21:
[...]
Zoals altijd geldt: use with care. De goto is daar niet veel anders in. De term "goto is evil" is goed om beginnende programmeurs mee om hun oren te slaan, maar hij is niet per definitie waar.
Je weet hoe het gaat met dit soort dingen. Iemand gebruikt die on error labels eerst gewoon. Dan denkt ie "heey, ik kan ook naar hetzelfde label wijzen, en alle fouten door dezelfde code laten afhandelen." En voor je het weet bouwt iemand spaghetti die jij mag onderhouden.
[ Voor 10% gewijzigd door Grijze Vos op 27-07-2009 00:42 ]
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Je doet bij een goto eigenlijk zoiets:
als(voorwaarde_is_voldaan){
ga naar regelnaam/ functienaam
}
dat is eigenlijk precies hetzelfde als wanneer je een functie schrijft die de actie doet die na je goto wordt uitgevoerd.
Een goto is eigenlijk niets meer dan een kortere notatie van een if/else controle. Het komt neer op:
1
2
3
4
5
6
7
8
9
10
11
| <?php if($voorwaarde = true){ //ga naar goto } else{ //voer dit uit } function functienaam(){ echo 'blaat'; } ?> |
Als aan de voorwaarde is voldaan, dan voert die uit wat in de If staat, als niet aan de voorwaarde is voldaan, voert die de else uit.. Nooit beiden..
Daarnaast kan je na de if/ else prima verder gaan met je code, net als wat je bij een goto zou doen. Overigens snap ik de ophef over de goto wel, zeker voor de beginnende programmeur is het heel simpel om maar snel een stukje code over te slaan, de echte logica is op dat moment alleen maar lastiger. Zeker wanneer je op een stuk code meerdere goto's gebruikt, kan het wel eens zijn dat er heen en weer gesprongen wordt. De leesbaarheid van je code komt dat dan niet echt ten goede vind ik.
jbdeiman schreef op maandag 27 juli 2009 @ 12:01:
Ik snap op zich het punt van een GOTO nou niet zo zeer:
<snip>
Overigens snap ik de ophef over de goto wel, zeker voor de beginnende programmeur is het heel simpel om maar snel een stukje code over te slaan, de echte logica is op dat moment alleen maar lastiger. Zeker wanneer je op een stuk code meerdere goto's gebruikt, kan het wel eens zijn dat er heen en weer gesprongen wordt. De leesbaarheid van je code komt dat dan niet echt ten goede vind ik.

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
Ampera-e (60kWh) -> (66kWh)
Echt? Ik zou altijd die tweede kiezen. Het is nog korter ook! Het enige geldige punt dat ze maken is voor die rare conditionele loops, waar je anders een "bool isdone = false; while (!done) { if (xx) done = true;}" contructie nodig hebt. Dan kan een goto handig zijn, hoewel een break meestal duidelijker is. Als je dat dan nest, dan werkt een break niet, en dan heb je een goto nodig. Ik heb dat nog nooit nodig gehad...icyx schreef op zondag 26 juli 2009 @ 18:08:
Zoals het stukje code waar de discussie op kerneltrap mee begint:
C:
1 2 3 4 5 6 7 8 9 10 if (spin_trylock(&tty_lock.lock)) goto got_lock; if (tsk == tty_lock.lock_owner) { WARN_ON(!tty_lock.lock_count); tty_lock.lock_count++; return flags; } spin_lock(&tty_lock.lock); got_lock: WARN_ON(tty_lock.lock_owner);
GOTO vrij:
C:
1 2 3 4 5 6 7 8 if (!(spin_trylock(&tty_lock.lock))){ if (tsk ==tty_lock.lock_owner){ WARN_ON(!tty_lock.lcok_count); tty_lock.lock_count++; return flags; } } WARN_ON(tty_lock.lock_owner);
Persoonlijk vind ik het eerste excerpt een stuk eleganter.
hoewel ik het zo zou schrijven:
1
2
3
4
5
6
| if (!spin_trylock(&tty_lock.lock) && tsk == tty_lock.lock_count) { WARN_ON(!tty_lock.lcok_count); tty_lock.lock_count++; return flags; } // eventueel een else { en return flags buiten de if, maar alleen indien beide code path een return flags doen WARN_ON(tty_lock.lock_owner); |
[/code]
[ Voor 13% gewijzigd door Zoijar op 27-07-2009 12:30 ]
Waar het om gaat is dat een if gestructureerd is. Je kunt er niet alle kanten mee opspringen, de volgorde van executie is ten alle tijden van boven naar beneden, waarbij eventueel een heel blok code al dan niet wordt uitgevoerd. Het is bij een if statement dus inherent duidelijk om te zien hoe de executie gaat zijn. Bij een goto is dat niet het geval.jbdeiman schreef op maandag 27 juli 2009 @ 12:01:
Een goto is eigenlijk niets meer dan een kortere notatie van een if/else controle.
Niet nodig, je kunt die bool ook naar buiten trekken en in de buitenste loop nog een keer checken en dan opnieuw breaken. Bij nog diepere nesting wordt dat idd onleesbaar, maar voor performance hoef je het doorgaans niet te laten (meestal is de gegenereerde code exact identiek aan de code die goto gebruikt, omdat de compiler ook wel snapt dat je een bool zet en dan de lus verlaat, waarna meteen die bool weer wordt getest zodat je net zo goed meteen door kunt springen)Zoijar schreef op maandag 27 juli 2009 @ 12:28:
Als je dat dan nest, dan werkt een break niet, en dan heb je een goto nodig.
[ Voor 38% gewijzigd door .oisyn op 27-07-2009 12:31 ]
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 je er een if-statement om heen zet wel; een goto op zichzelf is echter onconditioneel en verstoort gewoon de flow van de code (en dus krijg je spaghetti code).jbdeiman schreef op maandag 27 juli 2009 @ 12:01:
Je doet bij een goto eigenlijk zoiets:
als(voorwaarde_is_voldaan){
ga naar regelnaam/ functienaam
}
Er zijn trouwens best gevallen waarin GOTO bruikbaar/handig/noodzakelijk is, maar die gevallen zijn zéér zeldzaam en dan moet je een verdomd goede reden hebben om een GOTO te gebruiken (tenzij je in ASM werkt; en zelfs die zijn vaak nog conditioneel
Ey.oisyn schreef op maandag 27 juli 2009 @ 12:28:
[...]
Waar het om gaat is dat een if gestructureerd is. Je kunt er niet alle kanten mee opspringen, de volgorde van executie is ten alle tijden van boven naar beneden, waarbij eventueel een heel blok code al dan niet wordt uitgevoerd. Het is bij een if statement dus inherent duidelijk om te zien hoe de executie gaat zijn. Bij een goto is dat niet het geval.
[ Voor 35% gewijzigd door RobIII op 27-07-2009 12:32 ]
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
True. Dat performance argument snapte ik ook niet; meestal genereert het idd exact dezelfde code, mits je het goed opschrijft..oisyn schreef op maandag 27 juli 2009 @ 12:28:
Niet nodig, je kunt die bool ook naar buiten trekken en in de buitenste loop nog een keer checken en dan opnieuw breaken. Bij nog diepere nesting wordt dat idd onleesbaar, maar voor performance hoef je het doorgaans niet te laten (meestal is de gegenereerde code exact identiek aan de code die goto gebruikt, omdat de compiler ook wel snapt dat je een bool zet en dan de lus verlaat, waarna meteen die bool weer wordt getest zodat je net zo goed meteen door kunt springen)
Eerlijk gezegd komt die hele discussie op mij erg over als "wij zijn expert kernel hackers en kunnen een goto wel goed gebruiken en weten ook een heel zeldzaam legitiem geval waar het correct is, dus goto is niet evil en iedereen die dat denkt is eigenlijk maar dom omdat ze niet zo slim zijn dat ze het goed kunnen gebruiken". Maarja...
Wil je zeggen dat het volgende stukje code errors keihard negeert dan?.oisyn schreef op zondag 26 juli 2009 @ 18:21:
[...]
Het punt van de on error resume next is dat je helemaal geen foutafhandelijk doet, maar dat je errors gewoon keihard negeert.
1
2
3
4
5
6
| On Error Resume Next Dim x x = 1/0 If Err Then MsgBox "Error " & Err & ": " & Err.Description End If |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Nee, maar ik hoef hoop ik niet uit te leggen dat dit wel een heel erg simpel voorbeeld is, en dat je in de werkelijkheid te maken hebt met veel grotere lappen code, waarbij in een functie bijv. wordt gerekend op error afhandeling van buitenaf, maar dat iemand anders dan toch maar een Resume Next er van heeft gemaakt in de context van een specifieke aanroep.RayNbow schreef op maandag 27 juli 2009 @ 13:01:
[...]
Wil je zeggen dat het volgende stukje code errors keihard negeert dan?
Of ga jij overal je code peperen met If Err statements?
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.
Right tool for the right job..oisyn schreef op maandag 27 juli 2009 @ 13:08:
[...]
Nee, maar ik hoef hoop ik niet uit te leggen dat dit wel een heel erg simpel voorbeeld is, en dat je in de werkelijkheid te maken hebt met veel grotere lappen code, waarbij in een functie bijv. wordt gerekend op error afhandeling van buitenaf, maar dat iemand anders dan toch maar een Resume Next er van heeft gemaakt in de context van een specifieke aanroep.
On Error Resume Next gebruik je dus als je lokaal de fout wilt en kan afhandelen. Met On Error GoTo bevindt de error handler meestal onderaan in de functie of sub.
Nee, want in grotere blokken code waar het niet precies uitmaakt waar de fout optreedt zul je dus gebruik maken van On Error GoTo.Of ga jij overal je code peperen met If Err statements?
Of in een bepaalde functionele taal gebruik je de Maybe of een Error (zoals Either) monad
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Dit topic is gesloten.
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.