Ligt eraan wat je onder sugar verstaat.PiepPiep schreef op maandag 03 oktober 2011 @ 14:57:
Het is idd syntactic sugar
code:
1
| f(a ? 1 : 0, b ? 2 : 0, c ? 4 : 0); |
Zonder ? : heb je extra variabelen nodig.
Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.
Ligt eraan wat je onder sugar verstaat.PiepPiep schreef op maandag 03 oktober 2011 @ 14:57:
Het is idd syntactic sugar
1
| f(a ? 1 : 0, b ? 2 : 0, c ? 4 : 0); |
Verwijderd
[ Voor 18% gewijzigd door Verwijderd op 03-10-2011 15:27 ]
1
| x = a ? 1 : b ? 2 : c ? 3 : 0; |
1
| cond1 ? a : b = cond2 ? c : d |
Verwijderd
Zo dan?Olaf van der Spek schreef op maandag 03 oktober 2011 @ 15:19:
[...]
Ligt eraan wat je onder sugar verstaat.
code:
1 f(a ? 1 : 0, b ? 2 : 0, c ? 4 : 0);
Zonder ? : heb je extra variabelen nodig.
1
| f(1 * (bool)a, 2 * (bool)b, 4 * (bool)c); |
Mijn stelling: er is geen enkele complexiteitsmetric die in alle gevallen een 1-op-1 relatie heeft tussen complexiteit van de code en de output. Mensen vinden altijd bochten om zich in te wringen om die metric omlaag te krijgen zonder de complexiteit omlaag te brengen. Als ze die creativiteit nou eens zouden stoppen in het verminderen van de complexiteit...xos schreef op maandag 03 oktober 2011 @ 17:36:
of
code:
1 cond1 ? a : b = cond2 ? c : d
Dit soort constructies ontstonden toen een programmeur nog 1 jaar moest voordat hij met pensioen mocht en geen zin had om iets nieuws te leren. Het laatste jaar heeft hij de tijd gekregen om het product waar hij al jaren lang aan werkte goed te documenteren en klaar te stomen voor overdracht. Eigenlijk onzin aangezien het product toch binnenkort wordt vervangen, maar het hield hem bezig. Maargoed, het aantal regels codes is wel met 30% afgenomen het laatste jaar. En volgens een of andere obscure regel om de complexiteit te meten van software is de complexiteit van het code natuurlijk ook met 30% afgenomen
Natuurlijk, maar dat zegt toch niks over of het syntactic sugar is?Verwijderd schreef op maandag 03 oktober 2011 @ 15:26:
Die variabelen worden weer weggeoptimaliseerd. In jouw voorbeeld moet de compiler net zogoed een waarde op de stack pushen alvorens f() aan te roepen.
Hoezo is het niet leesbaar?MBV schreef op maandag 03 oktober 2011 @ 15:44:
@Olaf: als je dat door mij laat reviewen mag je dat er direct weer uithalen, want het is niet leesbaar en geeft bij kleine typfoutjes een compleet ander gedrag.
Grapjas. Die, 1, 2, 4 en 0 waren natuurlijk maar placeholders.Verwijderd schreef op maandag 03 oktober 2011 @ 18:35:
[...]
Zo dan?
C++:
1 f(1 * (bool)a, 2 * (bool)b, 4 * (bool)c);
[ Voor 50% gewijzigd door Olaf van der Spek op 03-10-2011 20:05 ]
Het zijn twee manieren om hetzelfde te doen, waarbij de ternary operator ervoor zorgt dat het e.e.a. wat compacter en leesbaarder wordt (ook al valt over dat laatste te twisten omdat leesbaarheid iets persoonlijks is). Dus ja, het is syntactische suiker.Olaf van der Spek schreef op maandag 03 oktober 2011 @ 20:02:
[...]
Natuurlijk, maar dat zegt toch niks over of het syntactic sugar is?
Kleine typo's kunnen inderdaad al snel een grote invloed hebben, dus ben ik met je eens dat dat geen tegenargument zou moeten zijn. Of het leesbaar is hangt denk ik vooral af van de programmeur. Als je het wat vaker gebruikt zal je er geen enkele moeite mee hebben om het te lezen. Als je het zelden gebruikt is het allemaal wat ingewikkelder.[...]
Hoezo is het niet leesbaar?
Kleine typefoutjes kunnen toch zo vaak een grote invloed hebben?
[ Voor 5% gewijzigd door Patriot op 03-10-2011 20:32 ]
De gegenereerde code is anders (maar semantisch waarschijnlijk equivalent). Dan is het toch geen syntactic sugar meer?Patriot schreef op maandag 03 oktober 2011 @ 20:30:
Dus ja, het is syntactische suiker.
[ Voor 40% gewijzigd door Olaf van der Spek op 03-10-2011 20:44 ]
Jawel, heeft namelijk alles met functionaliteit te maken. Een for-loop is al syntactische suiker omdat het ook met een while loop en wat extra moeite kan.Olaf van der Spek schreef op maandag 03 oktober 2011 @ 20:44:
[...]
De gegenereerde code is anders (maar semantisch waarschijnlijk equivalent). Dan is het toch geen syntactic sugar meer?
Verwijderd
En is machine code syntactic sugar voor de set operaties gedefinieerd door een Turing machine ...Olaf van der Spek schreef op maandag 03 oktober 2011 @ 22:13:
Als we zo gaan beginnen dan is elke taal natuurlijk gewoon syntactic sugar voor machinecode.
En hoe stel je voor hoe een niet-moderne compiler de code genereert in beide gevallen dan?Verwijderd schreef op maandag 03 oktober 2011 @ 14:24:
Ik vroeg me precies hetzelfde af. Een moderne compiler compileert dat toch naar precies dezelfde executable?
Waarom dan?
[ Voor 21% gewijzigd door .oisyn op 03-10-2011 23: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.
Verwijderd
I was wondering the same thing.. Als je het nu over een switch statement had, oke. Maar je mag er toch wel vanuitgaan dat if en ? uiteindelijk tot dezelfde machinecode worden vertaald..oisyn schreef op maandag 03 oktober 2011 @ 23:10:
Waarom dan?
[ Voor 40% gewijzigd door Verwijderd op 03-10-2011 23:19 ]
Een , en : verwisselen, of met geneste ternary operators een haakje verkeerd zetten, zorgt voor grote verschillen. Een ternary operator per regel vind ik wel genoeg. En ja, kleine dingetjes kunnen ook op andere plaatsen grote gevolgen hebben, zoals haakjes op verkeerde plekken etc, vandaar dat o.a. het bedrijf waar ik werk in de style guide heeft staan om overal haakjes omheen te zetten. Je moet de kans gewoon zo klein mogelijk maken dat jij of je collega het fout doet. Wat ik uiteraard vergeet bij dit stukje:Olaf van der Spek schreef op maandag 03 oktober 2011 @ 20:02:
[...]
Hoezo is het niet leesbaar?
Kleine typefoutjes kunnen toch zo vaak een grote invloed hebben?
1
| x = myvar & 0xF00 >> 2; |
Als daar iets complexers staat dan de variabelen a, b, en c, dan past de regel niet meer in de breedte op het scherm. Dan kan je beter temp variabelen neerzetten, weet iedereen ook direct wat je bedoelde, als je ze een zinnige naam geeft. Dit is dan weer over the top:[...]
Grapjas. Die, 1, 2, 4 en 0 waren natuurlijk maar placeholders.
1
2
| bool UseFastSearch = true; search(x, y, UseFastSearch); |
Zelf vind ik dat een best (te?) ruime definitie voor syntactische suiker. Ik prefereer de definitie waarbij je op basis van alleen syntax een bepaalde constructie kunt herschrijven naar een andere constructie.Patriot schreef op maandag 03 oktober 2011 @ 20:30:
[...]
Het zijn twee manieren om hetzelfde te doen, waarbij de ternary operator ervoor zorgt dat het e.e.a. wat compacter en leesbaarder wordt (ook al valt over dat laatste te twisten omdat leesbaarheid iets persoonlijks is). Dus ja, het is syntactische suiker.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| --Haskell: (a,b) ~~~> ((,) a b) (a,b,c) ~~~> ((,,) a b c) [] ~~~> [] [a] ~~~> (a : []) [a,b] ~~~> (a : [b]) [a,b,c] ~~~> (a : [b,c]) ... do a <- ma ~~~> ma >>= \a -> f a f a // C# from x in xs ~~~> xs.Select(x => f(x)) select f(x) |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Zonder optimalisaties in ieder geval. Met optimalisaties is de code hopelijk wel hetzelfde, al denk ik dat dat afhankelijk is van de types. Classes zonder trivial copy constructor en zonder move constructor bijvoorbeeld..oisyn schreef op maandag 03 oktober 2011 @ 23:10:
Waarom dan?
[ Voor 23% gewijzigd door Olaf van der Spek op 04-10-2011 11:08 ]
Dat levert een compile error op.MBV schreef op maandag 03 oktober 2011 @ 23:42:
Een , en : verwisselen,
Genest is weer een stap complexer, maar mijn voorbeeld had geen geneste operators.of met geneste ternary operators een haakje verkeerd zetten, zorgt voor grote verschillen.
Te veel onnodige haakjes vind ik dan weer minder leesbaar.Een ternary operator per regel vind ik wel genoeg. En ja, kleine dingetjes kunnen ook op andere plaatsen grote gevolgen hebben, zoals haakjes op verkeerde plekken etc, vandaar dat o.a. het bedrijf waar ik werk in de style guide heeft staan om overal haakjes omheen te zetten.
Werk je met een 80 x 25 terminal?Als daar iets complexers staat dan de variabelen a, b, en c, dan past de regel niet meer in de breedte op het scherm.
1
2
3
| f(a ? 1 : 0, b ? 2 : 0, c ? 4 : 0); |
[ Voor 4% gewijzigd door Olaf van der Spek op 04-10-2011 11:11 ]
Ik ook, en ik heb er een hekel aan, maar die lompe fout van mezelf toonde het nut wel aanOlaf van der Spek schreef op dinsdag 04 oktober 2011 @ 11:01:
[...]
Te veel onnodige haakjes vind ik dan weer minder leesbaar.
Nee, met Eclipse op een 1280x1024 scherm, ik geloof dat je met een tekstgrootte van 9 punten maar iets van 100 karakters kwijt kan. En de style guide gaat nog altijd uit van 80 tekens, waar ik me niet aan houd als het onduidelijker wordt van line-breaks[...]
Werk je met een 80 x 25 terminal?
Dan nog:
code:
1 2 3 f(a ? 1 : 0, b ? 2 : 0, c ? 4 : 0);
Maak er maar grappen overOlaf van der Spek schreef op dinsdag 04 oktober 2011 @ 11:01:
Werk je met een 80 x 25 terminal?
Dan nog:
code:
1 2 3 f(a ? 1 : 0, b ? 2 : 0, c ? 4 : 0);
If money talks then I'm a mime
If time is money then I'm out of time
Matis schreef op dinsdag 04 oktober 2011 @ 22:36:
[...]
Maak er maar grappen over
Bij ons op de zaak zijn er ontwikkelaars die VI(M) gebruiken, veelal dual-headed, waardoor er maar 80 karakters per lijn op passen.
Gelukkig schrijven onze richtlijnen 128 karakters per regel voor
1
| :set wrap |
Nu met Land Rover Series 3 en Defender 90
Maar dan heb je het specifiek over C++, waar sommige dingen niet eens kunnen zonder ternaire operator.Olaf van der Spek schreef op dinsdag 04 oktober 2011 @ 10:58:
[...]
Zonder optimalisaties in ieder geval. Met optimalisaties is de code hopelijk wel hetzelfde, al denk ik dat dat afhankelijk is van de types. Classes zonder trivial copy constructor en zonder move constructor bijvoorbeeld.
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
| public boolean checkBicBankAccount(String inValue) { boolean isNotBicBankAccount = !checkNotNullOrEmpty(inValue, BIC_BANK_ACCOUNT); if (!isNotBicBankAccount) { if (!isBicBankAccount(inValue)) { this.add(BusinessErrorType.INVALID_FORMAT, BIC_BANK_ACCOUNT); } } return !isNotBicBankAccount; } |
[ Voor 49% gewijzigd door 418O2 op 05-10-2011 12:41 ]
Niet perse. Bij sommige woorden kan het gewoon niet. Zolang je maar er maar ja of nee op kan antwoorden is het goed toch?418O2 schreef op woensdag 05 oktober 2011 @ 12:41:
En de naamgeving is ook al zo handig...
Toch wel handig om een boolean method naam met is te beginnen, of niet?
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
ah maar waar wordt de account op gechecked in de functie?Phoenix1337 schreef op woensdag 05 oktober 2011 @ 12:59:
[...]Niet perse. Bij sommige woorden kan het gewoon niet. Zolang je maar er maar ja of nee op kan antwoorden is het goed toch?
Dat ben ik met je eens hoor. De naam van de methode is gewoon fout. Alleen hoeft niet elke methode welke een boolean returned te beginnen met is. Zolang je de naam van methode met ja of nee kan beantwoorden, de naam ook nog beschrijft wat er gedaan word en geen 24 kantjes aan tekst is, is het een goede methodenaam.Caelorum schreef op woensdag 05 oktober 2011 @ 13:04:
[...]
ah maar waar wordt de account op gechecked in de functie?
Is een functienaam als isBicBankAccountValid of iets dergelijks niet duidelijker?
[ Voor 3% gewijzigd door Phoenix1337 op 05-10-2011 13:11 ]
Hmm, met 1920 pixels pasten er bijna 240 tekens op mijn scherm dacht ik.MBV schreef op dinsdag 04 oktober 2011 @ 20:21:
Nee, met Eclipse op een 1280x1024 scherm, ik geloof dat je met een tekstgrootte van 9 punten maar iets van 100 karakters kwijt kan. En de style guide gaat nog altijd uit van 80 tekens, waar ik me niet aan houd als het onduidelijker wordt van line-breaks
225 bij mijOlaf van der Spek schreef op woensdag 05 oktober 2011 @ 13:22:
[...]
Hmm, met 1920 pixels pasten er bijna 240 tekens op mijn scherm dacht ik.
Soms. Als je de breedte probeert te minimaliseren, krijg je soms code zoals dit:MBV schreef op woensdag 05 oktober 2011 @ 15:06:
En wordt het daar leesbaarder van?Je kan dan wel myString.substring(12,15).replace(0,1).toUpper().find(0) neerzetten, en vast nog wel gekker, maar zodra een regel voorbij de 100 tekens gaat raak ik het overzicht kwijt. Het lijkt dan alsof iemand een complexiteitsmetric tevreden probeert te houden
1
2
3
4
5
| optimizer::ExplainPlan planner(this, false, false, false, (zero_result_cause ? zero_result_cause : "No tables used")); |
[ Voor 26% gewijzigd door Olaf van der Spek op 05-10-2011 15:44 ]
Tsja, wat voor definitie moet je dan hanteren?RayNbow schreef op dinsdag 04 oktober 2011 @ 06:29:
[...]
Zelf vind ik dat een best (te?) ruime definitie voor syntactische suiker. Ik prefereer de definitie waarbij je op basis van alleen syntax een bepaalde constructie kunt herschrijven naar een andere constructie.
Dat is een behoorlijk vage definitie, als hij al te begrijpen is. Wat bedoel je in hemelsnaam met kijken naar de syntax ipv de rest van het programmaBovenstaade voorbeeldtransformaties kijken alleen naar de syntax, niet naar de rest van het programma.
[ Voor 14% gewijzigd door Patriot op 06-10-2011 01:17 ]
Ik snap dit soort uitlijning nooit. Als de functie zelf dus vrij lang is staan alle parameters aan de rechterkant van je schermOlaf van der Spek schreef op woensdag 05 oktober 2011 @ 15:41:
[...]
Soms. Als je de breedte probeert te minimaliseren, krijg je soms code zoals dit:
C++:
1 2 3 4 5 optimizer::ExplainPlan planner(this, false, false, false, (zero_result_cause ? zero_result_cause : "No tables used"));
IMO is een enkele regel dan veel leesbaarder.
1
2
3
4
5
6
| optimizer::ExplainPlan planner( this, false, false, false, zero_result_cause ? zero_result_cause : "No tables used"); |
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.
Juist
1
2
3
4
| if(8==D) { /* ... */ } |
[ Voor 13% gewijzigd door Matis op 06-10-2011 14:50 ]
If money talks then I'm a mime
If time is money then I'm out of time
Patriot schreef op donderdag 06 oktober 2011 @ 01:15:
[...]
Tsja, wat voor definitie moet je dan hanteren?
Als we het over syntactische suiker hebben, lijkt me het slim om minstens het woord syntax in de definitie op te nemen.EDIT:
Also, waarom zou het 'te' ruim kunnen zijn?Dan is het net alsof syntactische iets anders is dan een feitelijke observatie, wat niets zegt over datgene wat het is. Alsof het een waardeoordeel is
Bij het desugaren wordt er louter en alleen gekeken naar de syntax en wordt een syntactische constructie vervangen door een andere syntactische constructie.[...]
Dat is een behoorlijk vage definitie, als hij al te begrijpen is. Wat bedoel je in hemelsnaam met kijken naar de syntax ipv de rest van het programma
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
1
2
3
4
5
6
| struct Foo { /* ... */ }; enum Enum { value = sizeof(Foo) > 2 ? 5 : 7; } |
[ Voor 43% gewijzigd door .oisyn op 06-10-2011 18:15 ]
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.
Een beetje IDE doet dat gewoon voor je met de juiste codestyle instellingen. Niks zelf klooien met spatiesJeldert schreef op donderdag 06 oktober 2011 @ 14:46:
Precies, helemaal omdat je met uitlijning nog met spaties zit te klooien, om alles onder de 1e parameter te krijgen...
Ach, jouw variabele namen kloppen tenminste nog. Kwam gister een viewmodel tegen met de boolean property 'isIncludeNotReserve'. Ik heb er uiteindelijk 'FilterReservationsWithDontRemoveFlag' van gemaakt. Ook niet een schoonheidsprijs qua grootte, maar tenminste wel in 1x duidelijk wat het ding doet.Lointje schreef op woensdag 05 oktober 2011 @ 12:38:
Vandaag kwamen we dit tegen op het werk. Je krijgt niet alleen ontzettende hoofdpijn van alle nutteloze negaties die het allemaal veel moeilijker maken dan het is, uiteindelijk is het dan nog fout ook omdat slechts één van de twee controles wordt teruggegeven.
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
quote: http://bash.org<atrus> i worked on a project once where somebody named variables defined in various places explicity so on one line of code, it showed up as:
<atrus> function_name($all, $urBase, $rBelong, $toUs);
<atrus> closest i've ever come to manslaughter
486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22
1
| <field name="summary">...</field> |
1
| <summary>...</summary> |
1
| <field name="summary">Spellcheck.py – Print title</field> |
1
2
| >>> u"–".encode('utf-8').decode('windows-1252').encode('ascii', 'xmlcharrefreplace') '–' |
[ Voor 9% gewijzigd door ValHallASW op 09-10-2011 22:45 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public void SavePayment() { [.. 10 regels code ..] #region if( SomeThing ) { [.. 70 regels code ..] } #endregion #region else { [.. 70 regels code ..] } #endregion [.. 60 regels code ..] } |
[ Voor 45% gewijzigd door Grijze Vos op 12-10-2011 16:37 ]
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Weet jij dan of die webservice geen commit doet aan het eind van een serie transaties, zij het via een workaround als een soort ready-flag?Grijze Vos schreef op woensdag 12 oktober 2011 @ 16:35:
Oh, en ik zal maar niet beginnen over het feit dat deze client-server applicatie het opslaan van alle info rondom 1 betaaltransactie niet atomair doet, maar item voor item een webservice aanspreekt. Als die er toevallig halverwege uitklapt heb je mooi een halve transactie in je DB staan. ><
[ Voor 59% gewijzigd door CodeCaster op 12-10-2011 16:50 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
1
2
| +(NSAPIRequest *)getDepartureTimesForStationCodeString:(NSString *)code withCallback:(void (^)(NSArray *))callback errorCallback:(void (^)(void))anErrorCallback { } |
1
2
3
4
| +(NSAPIRequest *)getDepartureTimesForStationCodeString:(NSString *)code withCallback:(void (^)(NSArray *))callback errorCallback:(void (^)(void))anErrorCallback { } |
Volgens mij worden de : altijd onder elkaar gezet over meerdere regels en zou je zoiets krijgen:YopY schreef op donderdag 13 oktober 2011 @ 09:56:
mbt lange regels: Ik vind het niet eens zo erg, in Objective-C met XCode en line wrapping. Bakkesen als dit... wil ik liever niet op meerdere regels:
Objective-C:
1 2 +(NSAPIRequest *)getDepartureTimesForStationCodeString:(NSString *)code withCallback:(void (^)(NSArray *))callback errorCallback:(void (^)(void))anErrorCallback { }
Op meerdere regels zou het zoiets worden:
Objective-C:
1 2 3 4 +(NSAPIRequest *)getDepartureTimesForStationCodeString:(NSString *)code withCallback:(void (^)(NSArray *))callback errorCallback:(void (^)(void))anErrorCallback { }
...ok misschien zo erg nog niet.
1
2
3
| +(NSAPIRequest *)getDepartureTimesForStationCodeString:(NSString *)code withCallback:(void (^)(NSArray *))callback errorCallback:(void (^)(void))anErrorCallback { ... } |
1
2
3
4
| +( *):( *) :( (^)( *)) :( (^)()) { } |
1
2
3
| if ($data['errors'] == '<div id="succeed">Het formulier is verstuurd</div>'){ // doe iets } |
1
2
3
4
5
6
7
8
| <script type='text/javascript'> //<[!CDATA[ jsDebug = 0; /* Must come before JS includes */ USE_RTE = 1; DISABLE_AJAX = parseInt(0); /* Disables ajax requests where text is sent to the DB; helpful for charset issues */ inACP = false; //]]> </script> |
We are shaping the future
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Niet als je version control gebruikt nee, maar dan vraag ik mij af of ze wel hebben begrepen wat ze nou eigenlijk doen met version controlCodeCaster schreef op zaterdag 15 oktober 2011 @ 21:14:
Code weggooien is niet eng...
Nuja, het blijkt iets subtieler te zijn. Er zijn drie entiteiten: de site, een binary storage en de xml-export.ValHallASW schreef op zondag 09 oktober 2011 @ 22:17:
In pythonspeak:
code:
1 2 >>> u"–".encode('utf-8').decode('windows-1252').encode('ascii', 'xmlcharrefreplace') '–'
Helemaal mee eens, ik kan daar ook niet tegen. Vooral als het allemaal public is enzo.CodeCaster schreef op zaterdag 15 oktober 2011 @ 21:14:
Nog erger: mensen die wel source control gebruiken, maar massa's dode code (functies die nooit meer worden aangeroepen) en uitgecommentariseerde code laten staan.
Code weggooien is niet eng...
We are shaping the future
Verwijderd
1
| [Obsolete()] |
1
2
3
4
5
| [Obsolete()] public void OudeMethod() { //Doe iets... } |
[ Voor 35% gewijzigd door Verwijderd op 15-10-2011 22:23 ]
We are shaping the future
Verwijderd
1
2
3
4
| // Sleep action public void sleep(int time){ this.sleep(time); } |
Als ie nou een beeetje slim was had ie het volgende geproduceerdDwarrelegel schreef op zondag 16 oktober 2011 @ 22:37:
Samen werken werkt soms niet. Mijn practicum partner probeerde een thread even te laten slapen....
Denk dat de wijn zijn code niet heeft verbeterd.
Java:
1 2 3 4 // Sleep action public void sleep(int time){ this.sleep(time); }
1
2
3
4
5
| // Sleep action public void sleep(int time){ if( time > 0 ) this.sleep(--time); } |
Gelukkig staat er nergens beschreven dat time in milliseconds is.Enfer schreef op dinsdag 18 oktober 2011 @ 08:35:
[...]
Als ie nou een beeetje slim was had ie het volgende geproduceerd
Java:
1 2 3 4 5 // Sleep action public void sleep(int time){ if( time > 0 ) this.sleep(--time); }
Dan heb je nog een klein beetje een sleep functie gemaakt
1
2
3
4
5
| if( object == nil ){ @synchronized( self ){ object = [[NSObject alloc] init]; } } |
[ Voor 26% gewijzigd door Enfer op 18-10-2011 15:41 ]
1
2
3
4
5
6
7
| if( object == nil ){ @synchronized( self ){ if( object == nil ){ object = [[NSObject alloc] init]; } } } |
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
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.
Ligt heel erg aan de taal, in oudere versies van Java (1.4 en eerder) is het bijvoorbeeld niet zo safe als jij denkt: http://en.wikipedia.org/wiki/Double-checked_lockingCoolGamer schreef op dinsdag 18 oktober 2011 @ 15:45:
Wat je regelmatig ook ziet zijn constructies als:
C:
1 2 3 4 5 6 7 if( object == nil ){ @synchronized( self ){ if( object == nil ){ object = [[NSObject alloc] init]; } } }
Zo is het in de meeste gevallen niet nodig om te locken.
[ Voor 37% gewijzigd door .oisyn op 19-10-2011 10:55 ]
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.
Ik dacht altijd dat Java(6) alles gegarandeerd in het geheugen zette als je een synchronized block verlietRemus schreef op woensdag 19 oktober 2011 @ 09:40:
[...]
Ligt heel erg aan de taal, in oudere versies van Java (1.4 en eerder) is het bijvoorbeeld niet zo safe als jij denkt: http://en.wikipedia.org/wiki/Double-checked_locking
[ Voor 6% gewijzigd door Jegorex op 19-10-2011 15:11 ]
Klopt, doet het ook.Jegorex schreef op woensdag 19 oktober 2011 @ 15:08:
[...]
Ik dacht altijd dat Java(6) alles gegarandeerd in het geheugen zette als je een synchronized block verliet
Klopt ook. Het enige dat Java garandeert is dat alle writes voor het einde van het synchronized block zijn gedaan. Wat het niet garandeert is in welke volgorde die writes plaatsvinden. De referentie naar het object kan al geschreven worden voordat de constructor er daadwerkelijk mee klaar is. Een andere thread kan dus theoretisch een half geconstruct object zien. De volatile zorgt ervoor dat alle writes voor de volatile write (en dus alle sideeffects van de ctor) gedaan zijn.Volgens die link moet ik dus alsnog volatile gebruiken.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class Singleton { private volatile Singleton myObj; private Singleton myFastObj; private final Object sync = new Object(); public static Singleton getInstance() { if (myFastObj == null) { synchronized(sync) { if (myObj == null) myObj = new Singleton(); } myFastObj = myObj; } return myFastObj; } private Singleton() { /* ... */ } } |
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
| for(size_t idx = 0 ; idx < 3 ; i++) { angle[idx] = atoi(d_string); pos = d_string.find_first_of(" :"); if(angle[idx] == 0 || pos == string::npos) { return false; } d_string = d_string.substr(pos + 1); } |
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.
Dat zou een compilerfout moeten opleveren, daar i niet in de scope staat (voor zover ik kan zien).Montaldo schreef op donderdag 20 oktober 2011 @ 01:43:
Typo. De iterator idx wordt niet opgehoogd, maar i.
Ja, maar dat wil niet zeggen dat andere threads die unsynchronised dezelfde variabele lezen dan ook de juiste waarde uit de heap gebruiken of uit de lokale L1 t/m L3 cache of een register. In dat geval kunnen ze dus bijvoorbeeld nog null zien in de eerste if(). Volatile zorgt ervoor dat de wijziging ook unsynchronised zichbaar is voor de andere threads.Jegorex schreef op woensdag 19 oktober 2011 @ 15:08:
[...]
Ik dacht altijd dat Java(6) alles gegarandeerd in het geheugen zette als je een synchronized block verliet
Volgens die link moet ik dus alsnog volatile gebruiken.
[ Voor 71% gewijzigd door .oisyn op 20-10-2011 12:10 ]
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.
Nikolas schreef op woensdag 19 oktober 2011 @ 23:18:
Deze hoort wel thuis in het topic: signs that you are a bad programmer
SchitterendPinball Programming
One Try-Catch block wrapping the entire body of Main() and resetting the program in the Catch clause (the pinball gutter)
Dat is inderdaad wat ik ook heel veel zie, de echte kracht van scm wordt heel vaak nauwelijks gebruikt. Het wordt dan alleen gebruikt om de laatste versie van een source tree te hebben, dus eigenlijk gewoon een synchronisatie tooltje. De functionaliteit van het leveren van documentatie en historie is vaak onbekend terrein. Vaak krijg ik de vraag, "hoe kan dit nou?" en als je dan in de geschiedenis kijkt dan zie je binnen enkele tellen waarom iets zo is, of wie verantwoordelijk is geweest.Aloys schreef op zaterdag 15 oktober 2011 @ 21:19:
[...]
Niet als je version control gebruikt nee, maar dan vraag ik mij af of ze wel hebben begrepen wat ze nou eigenlijk doen met version control.
Laatst gebruikt bij een Android programma welke, als deze crashte, automatisch voor de klant opnieuw opgestart diende te worden. Was dus een programma op een dedicated telefoon. Dus het kan wel degelijk nut hebben
You only need two tools in life: WD-40 and Duct-Tape, if it doesn't move and it should, use the WD-40. If it does move and it shouldn't, use the Tape.
1
2
3
4
5
6
7
| +(BOOL)ShowHSL { return [[NSUserDefaults standardUserDefaults] boolForKey:@"yearly_subscription_preference"]; } +(BOOL)YearlySubscription { return [[NSUserDefaults standardUserDefaults] boolForKey:@"hsl_preference"]; } |
1
2
3
| int volgNummer = 1; //Doe iets met volgnummer string foo = string.Format("{0}", volgNummer.ToString()); |
Hail to the king baby!
Whuturk_forever schreef op vrijdag 21 oktober 2011 @ 11:58:
Ik kom net deze tegen:
C#:
1 2 3 int volgNummer = 1; //Doe iets met volgnummer string foo = string.Format("{0}", volgNummer.ToString());
![]()
Verwijderd
Die valt toch wel mee? Hij lijkt misschien nogal stom, maar:urk_forever schreef op vrijdag 21 oktober 2011 @ 11:58:
Ik kom net deze tegen:
C#:
1 2 3 int volgNummer = 1; //Doe iets met volgnummer string foo = string.Format("{0}", volgNummer.ToString());
![]()
Het hele punt is dat een string.Format("{0}", x.ToString()) hetzelfde is als gewoon x.ToString()Er zitten wel paar kleine dingetjes in: "ToString()" is natuurlijk niet nodig
[ Voor 3% gewijzigd door .oisyn op 21-10-2011 13:02 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Verwijderd
Klopt, maar wie zegt dat het volgnummer niet uit meerdere parameters heeft kunnen bestaan of moeten bestaan? Verder maakt string.Format of .ToString() weinig uit inderdaad, zolang je het maar consequent doet. Format geeft je echter wel meer mogelijkheden..oisyn schreef op vrijdag 21 oktober 2011 @ 12:47:
[...]
Het hele punt is dat een Format("{0}", x.ToString()) doorgaans hetzelfde is als gewoon x.ToString()
Hoe is dat relevant dan?Verwijderd schreef op vrijdag 21 oktober 2011 @ 12:50:
[...]
Klopt, maar wie zegt dat het volgnummer niet uit meerdere parameters heeft kunnen bestaan of moeten bestaan?
Maar die worden niet gebruikt.Format geeft je echter wel meer mogelijkheden.
[ Voor 14% gewijzigd door .oisyn op 21-10-2011 13:03 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Ik zeg alleen dat het helemaal niet zo'n raar slecht voorbeeld is als je er een seconde langer over nadenkt. Dat de schrijver het wat makkelijker had kunnen refactoren omdat het eenvoudig was dan hij van te voren had bedacht (Want dat mag je wel hieruit opmaken naar mijn mening), ja dat klopt..oisyn schreef op vrijdag 21 oktober 2011 @ 13:00:
[...]
Hoe is dat relevant dan?
[...]
Maar die worden niet gebruikt.
[ Voor 17% gewijzigd door Verwijderd op 21-10-2011 13:15 ]
Nee, je zei dat volgnummer wellicht wel meer was dan een int. Waarom is dát relevant? Dat er op de plek van de Format wellicht eerst wat anders stond is wel relevant, maar op die manier kun je 99% van de geposte voorbeelden wel naar de prullenbak verwijzen. Bottom line is, de code zoals ie er nu staat, dus een format van een string (en dus geen ander object!) als "{0}", is een beetje suf.Verwijderd schreef op vrijdag 21 oktober 2011 @ 13:10:
[...]
Ik zeg alleen dat het helemaal niet zo'n raar slecht voorbeeld is als je er een seconde langer over nadenkt.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Verwijderd
Ok, als je dat volgnummer zo had geinterpreteerd dan heb je daarin gelijk. Alhoewel ik niet op het volgnummer doelde. Tweede zijn we het overeens.oisyn schreef op vrijdag 21 oktober 2011 @ 13:24:
[...]
Nee, je zei dat volgnummer wellicht wel meer was dan een int. Waarom is dát relevant? Dat er op de plek van de Format wellicht eerst wat anders stond is wel relevant, maar op die manier kun je 99% van de geposte voorbeelden wel naar de prullenbak verwijzen. Bottom line is, de code zoals ie er nu staat, dus een format van een string (en dus geen object!) als "{0}", is een beetje suf.
let the past be the past.
Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info
Dit topic is gesloten.
Apple iPhone 17 LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq