[alg] Slechtste programmeervoorbeelden deel 4 Vorige deel Overzicht Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 72 ... 103 Laatste
Acties:
  • 993.631 views

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
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.

Acties:
  • 0 Henk 'm!

Verwijderd

Die variabelen worden weer weggeoptimaliseerd. In jouw voorbeeld moet de compiler net zogoed een waarde op de stack pushen alvorens f() aan te roepen.

Dat is een gok hoor :P maar dat is wat ik denk wat er gebeurt.

[ Voor 18% gewijzigd door Verwijderd op 03-10-2011 15:27 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16:46
@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. Maar het kan erger:
code:
1
x = a ? 1 : b ? 2 : c ? 3 : 0;

Acties:
  • 0 Henk 'm!

  • xos
  • Registratie: Januari 2002
  • Laatst online: 12-09 12:41

xos

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 :P

Acties:
  • 0 Henk 'm!

Verwijderd

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.
Zo dan?

C++:
1
f(1 * (bool)a, 2 * (bool)b, 4 * (bool)c);

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16:46
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 :P
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...

Over het code-voorbeeldje dat ik gaf, en wat sommige mensen nodig vonden om te nit-picken ;) : ik heb even een explode-functie geschreven om de 'argumenten' uit elkaar te trekken, scheelt 3 regels code en een hoop complexiteit, zeker in de subclass met meer 'argumenten' :*) Ook het stuk van de verwerking van de 'argumenten' te parsen heb ik apart getrokken, zodat een subclass extra argumenten kan accepteren. Regels code per functie is dus ook omlaag.

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
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.
Natuurlijk, maar dat zegt toch niks over of het syntactic sugar is?
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.
Hoezo is het niet leesbaar?
Kleine typefoutjes kunnen toch zo vaak een grote invloed hebben?
Verwijderd schreef op maandag 03 oktober 2011 @ 18:35:
[...]

Zo dan?

C++:
1
f(1 * (bool)a, 2 * (bool)b, 4 * (bool)c);
Grapjas. Die, 1, 2, 4 en 0 waren natuurlijk maar placeholders.

[ Voor 50% gewijzigd door Olaf van der Spek op 03-10-2011 20:05 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 27-09 13:00

Patriot

Fulltime #whatpulsert

Olaf van der Spek schreef op maandag 03 oktober 2011 @ 20:02:
[...]

Natuurlijk, maar dat zegt toch niks over of het syntactic sugar is?
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.

EDIT: "Not that there's anything wrong with that..."
[...]

Hoezo is het niet leesbaar?
Kleine typefoutjes kunnen toch zo vaak een grote invloed hebben?
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.

[ Voor 5% gewijzigd door Patriot op 03-10-2011 20:32 ]


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Patriot schreef op maandag 03 oktober 2011 @ 20:30:
Dus ja, het is syntactische suiker.
De gegenereerde code is anders (maar semantisch waarschijnlijk equivalent). Dan is het toch geen syntactic sugar meer?

[ Voor 40% gewijzigd door Olaf van der Spek op 03-10-2011 20:44 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 27-09 13:00

Patriot

Fulltime #whatpulsert

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?
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.

Acties:
  • 0 Henk 'm!

Verwijderd

Een while loop is weer syntaxische suiker omdat je hetzelfde met een if en een GOTO kan doen :>

Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Als we zo gaan beginnen dan is elke taal natuurlijk gewoon syntactic sugar voor machinecode.

Acties:
  • 0 Henk 'm!

Verwijderd

LINQ is ook syntactic sugar :p Maar het maakt het leven echt extreem veel handiger ;)

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
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 is machine code syntactic sugar voor de set operaties gedefinieerd door een Turing machine ...

Wie biedt om nog lager te gaan? :P

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

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?
En hoe stel je voor hoe een niet-moderne compiler de code genereert in beide gevallen dan? :)
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.


Acties:
  • 0 Henk 'm!

Verwijderd

Een niet-moderne compiler zal mogelijk niet doorhebben dat de variabelen meteen weer worden weggegooid na het aanroepen van de functie, er zal dus geheugen worden gealloceerd voor de 3 variabelen. Een moderne compiler zou die moeite niet doen en de tussentijdse resultaten gewoon opslaan in een register.

* User heeft overigens nog nooit gekeken wat een compiler nu eigenlijk uitspuugt...
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.

[ Voor 40% gewijzigd door Verwijderd op 03-10-2011 23:19 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16:46
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?
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:
code:
1
x = myvar & 0xF00 >> 2;

|:(
[...]

Grapjas. Die, 1, 2, 4 en 0 waren natuurlijk maar placeholders.
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:
code:
1
2
bool UseFastSearch = true;
search(x, y, UseFastSearch);

Acties:
  • 0 Henk 'm!

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

RayNbow

Kirika <3

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.
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.

code:
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)


Bovenstaade voorbeeldtransformaties kijken alleen naar de syntax, niet naar de rest van het programma.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
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.

[ Voor 23% gewijzigd door Olaf van der Spek op 04-10-2011 11:08 ]


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Dat levert een compile error op.
of met geneste ternary operators een haakje verkeerd zetten, zorgt voor grote verschillen.
Genest is weer een stap complexer, maar mijn voorbeeld had geen geneste operators.
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.
Te veel onnodige haakjes vind ik dan weer minder leesbaar.
Als daar iets complexers staat dan de variabelen a, b, en c, dan past de regel niet meer in de breedte op het scherm.
Werk je met een 80 x 25 terminal? :p
Dan nog:
code:
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 ]


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 26-09 08:43
Word gek van het hoofdlettergebruik in Unity3D. Classes beginnen 50/50 met een hoofdletter of niet, functions kunnen zoZijn() maar OokZo() en variables hebben soms helemaal geen hoofdletters.

Meestal kom je alleenDit() tegen.

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16:46
Olaf van der Spek schreef op dinsdag 04 oktober 2011 @ 11:01:
[...]
Te veel onnodige haakjes vind ik dan weer minder leesbaar.
Ik ook, en ik heb er een hekel aan, maar die lompe fout van mezelf toonde het nut wel aan ;)
[...]

Werk je met een 80 x 25 terminal? :p
Dan nog:
code:
1
2
3
f(a ? 1 : 0, 
  b ? 2 : 0, 
  c ? 4 : 0);
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 ;)

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 26-09 19:17

Matis

Rubber Rocket

Olaf van der Spek schreef op dinsdag 04 oktober 2011 @ 11:01:
Werk je met een 80 x 25 terminal? :p
Dan nog:
code:
1
2
3
f(a ? 1 : 0, 
  b ? 2 : 0, 
  c ? 4 : 0);
Maak er maar grappen over :X

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 :)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Matis schreef op dinsdag 04 oktober 2011 @ 22:36:
[...]

Maak er maar grappen over :X

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 :)
code:
1
:set wrap

:+

Nu met Land Rover Series 3 en Defender 90


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.
Maar dan heb je het specifiek over C++, waar sommige dingen niet eens kunnen zonder ternaire operator.

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


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16:46
Dat is de default, bij veel bestanden doe ik juist :set nowrap om nog iets te kunnen lezen... kan je daar trouwens nog iets aan instellen, zoals een speciaal tekentje om de wrap aan te geven?

Acties:
  • 0 Henk 'm!

  • Lointje
  • Registratie: Oktober 2008
  • Laatst online: 26-09 11:15
code:
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;
    }


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.

Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 13:58
En de naamgeving is ook al zo handig...

Toch wel handig om een boolean method naam met is te beginnen, of niet?

[ Voor 49% gewijzigd door 418O2 op 05-10-2011 12:41 ]


Acties:
  • 0 Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 20:16
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?
Niet perse. Bij sommige woorden kan het gewoon niet. Zolang je maar er maar ja of nee op kan antwoorden is het goed toch?

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Juist, meestal is dat is, soms has, heel soms iets anders maar nooit check.

Dat de variabele in de methode wel een goede naam heeft maar de methode zelf niet is een fijn staaltje inconsequente naamgeving ...

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


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 17:38
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?
ah maar waar wordt de account op gechecked in de functie?
Is een functienaam als isBicBankAccountValid of iets dergelijks niet duidelijker?

Acties:
  • 0 Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 20:16
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?
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.

[ Voor 3% gewijzigd door Phoenix1337 op 05-10-2011 13:11 ]


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
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 ;)
Hmm, met 1920 pixels pasten er bijna 240 tekens op mijn scherm dacht ik. :p

Acties:
  • 0 Henk 'm!

  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 20:16
Olaf 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. :p
225 bij mij :p

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16:46
En wordt het daar leesbaarder van? :X 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 :P

Acties:
  • 0 Henk 'm!

  • Gorion3
  • Registratie: Februari 2005
  • Laatst online: 24-08 08:28

Gorion3

ABC++

Yep, ik vind 80 tekens ook te weinig tegenwoordig, maar echt veel meer dan 120 zijn ze niet (ik gebruik altijd self-describing functienamen, welke soms dus best wel lang kunnen worden)

Awesomenauts! Swords & Soldiers


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
MBV schreef op woensdag 05 oktober 2011 @ 15:06:
En wordt het daar leesbaarder van? :X 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 :P
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.

[ Voor 26% gewijzigd door Olaf van der Spek op 05-10-2011 15:44 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 27-09 13:00

Patriot

Fulltime #whatpulsert

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.
Tsja, wat voor definitie moet je dan hanteren?
Bovenstaade voorbeeldtransformaties kijken alleen naar de syntax, niet naar de rest van het programma.
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 :?

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 :P

[ Voor 14% gewijzigd door Patriot op 06-10-2011 01:17 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Olaf 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.
Ik snap dit soort uitlijning nooit. Als de functie zelf dus vrij lang is staan alle parameters aan de rechterkant van je scherm 8)7. Ik gebruik gewoon 1 extra tab.
C++:
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.


Acties:
  • 0 Henk 'm!

  • Jeldert
  • Registratie: Juni 2001
  • Niet online

Jeldert

Rozijntjes

Precies, helemaal omdat je met uitlijning nog met spaties zit te klooien, om alles onder de 1e parameter te krijgen...

Juist


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 26-09 19:17

Matis

Rubber Rocket

Muhaha,

ik maakte (eigenlijk geheel onbewust) de volgende expressie
C:
1
2
3
4
if(8==D)
{
  /* ... */
}

:D

D is een macro voor debuglogging.

[ 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


Acties:
  • 0 Henk 'm!

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

RayNbow

Kirika <3

Patriot schreef op donderdag 06 oktober 2011 @ 01:15:
[...]


Tsja, wat voor definitie moet je dan hanteren?
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 :P
Als we het over syntactische suiker hebben, lijkt me het slim om minstens het woord syntax in de definitie op te nemen. ;)
[...]

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 :?
Bij het desugaren wordt er louter en alleen gekeken naar de syntax en wordt een syntactische constructie vervangen door een andere syntactische constructie.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Syntactische suiker is gewoon een alternatieve schrijfwijze voor iets wat al in de taal zelf op een andere manier te schrijven is ("syntactisch"), maar dan op een leesbaardere manier ("suiker").

Wat dat betreft is de ?: in C++ iig geen suiker - hij is uitgevonden omdat dat de énige manier is om een if-then-else constructie te gebruiken in expressies, en er zijn een aantal plaatsen waar je louter een expressie (en dus geen statement) kunt gebruiken (zoals voor constanten en initializers).

C++:
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.


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Jeldert 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...
Een beetje IDE doet dat gewoon voor je met de juiste codestyle instellingen. Niks zelf klooien met spaties :)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
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.
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.

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


Acties:
  • 0 Henk 'm!

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 18-01-2023
Een mooie die ik tegen kwam op 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


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Ik had dit eerst in de koffiecorner getikt om mijn frustratie te uiten, maar ik denk dat het toch beter in de categorie 'slecht programmeervoorbeeld' past...

Lieve SF.net, wat zuig je weer hard vandaag.

Ik ben bezig met het overzetten van bugs van sf.net naar JIRA. (yay! JIRA!).

sf.net heeft een export-functionaliteit. Ik weet alleen niet zo goed wat ik er van moet denken.

code:
1
<field name="summary">...</field>
in plaats van gewoon een
code:
1
<summary>...</summary>
. Maargoed, ik moet het toch parsen, dus dat is niet zo'n ramp.

Irritanter is de huge brainfuck die ze van encodings gemaakt hebben. De XML is, volgens de header, encoded in ISO-8859-1. Vervolgens zijn niet-ISO-8859-1-tekens als htmlentities opgeslagen. Redelijk.

Totdat je ziet wat ze precies opslaan. "Spellcheck.py – Print title" ( = u'Spellcheck.py \u2013 Print title') wordt namelijk in de exported XML....

code:
1
<field name="summary">Spellcheck.py â&#8364;&#8220; Print title</field>


..en nee, dat is niet omdat GoT iets geks doet. Er staat daadwerkelijk in de XML &#226;&#8364;&#8220;.... dat is namelijk wat je krijgt als je de – éérst als utf-8 encoded, en vervolgens inleest als windows-1252, en de unicode-entities die je dan krijgt weer wegschrijft in je XML-file.

In pythonspeak:
code:
1
2
>>> u"&#8211;".encode('utf-8').decode('windows-1252').encode('ascii', 'xmlcharrefreplace')
'â&#8364;&#8220;'



EDIT: maar niet alle tekens die je krijgt als je er utf-8 van maakt zijn ook zinnige windows-1252-characters. Wat doe je daarmee? Negeren, en gewoon 1-op-1 overnemen, natuurlijk. Maakt niet uit hoor, kan python ook. Maar toch: WTF?!

spamspamspam: https://github.com/valhallasw/sfjira/blob/master/parser.py ;-)

[ Voor 9% gewijzigd door ValHallASW op 09-10-2011 22:45 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Iemand die probeert onleesbare code overzichtelijk te houden:

C#:
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 ..]
}


Opdelen in functies was klaarblijkelijk niet handig genoeg.
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 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


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

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. ><
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?

[ 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...


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Nope, zo'n flag zit er niet in.

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


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
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 :p.

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Ik heb Obj-C sowieso altijd erg onleesbaar gevonden...

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 17:00
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 :p.
Volgens mij worden de : altijd onder elkaar gezet over meerdere regels en zou je zoiets krijgen:
Objective-C:
1
2
3
+(NSAPIRequest *)getDepartureTimesForStationCodeString:(NSString *)code
                                          withCallback:(void (^)(NSArray *))callback
                                         errorCallback:(void (^)(void))anErrorCallback { ... }

Wat ik nog niet eens zo extreem onleesbaar vind. Overloads werken IMHO zo ook best mooi. Alleen moest ik er in het begin gruwelijk aan wennen.

Acties:
  • 0 Henk 'm!

  • Otherside1982
  • Registratie: Februari 2009
  • Laatst online: 16:28
Obj-C levert wel mooi ASCII-art op als je alle letters weglaat:

code:
1
2
3
4
+( *):( *)
    :( (^)( *))
    :( (^)()) {
}


Ik zie wel niet meteen of het nu een konijntje, of een beertje moet voorstellen :+

Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Hmmm, er is een nieuwe view gemaakt waarbij de succesmeldingen in een andere div worden geladen.

Waarom zou het nu niet meer werken?
PHP:
1
2
3
if ($data['errors'] == '<div id="succeed">Het formulier is verstuurd</div>'){
    // doe iets
}


Sowieso is het al "vreemd" om een succesbericht in een error array te zetten :).
8)7

Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 15:26
Ik heb net volgende code gezien in de broncode van een website (vraag me niet wat ik daar zit te neuzen :+ :P ):

JavaScript:
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>

En dan voornamelijk die parseInt(0), lol :S.

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Gisteren 'even' een classfile opgeschoond. Van 3500 regels naar 250 *O*

Vreselijk, mensen die ipv source control hun source files als versiegeschiedenis gebruiken :/

We are shaping the future


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

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...

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
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 8)7 .

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
ValHallASW schreef op zondag 09 oktober 2011 @ 22:17:
In pythonspeak:
code:
1
2
>>> u"&#8211;".encode('utf-8').decode('windows-1252').encode('ascii', 'xmlcharrefreplace')
'â&#8364;&#8220;'
Nuja, het blijkt iets subtieler te zijn. Er zijn drie entiteiten: de site, een binary storage en de xml-export.

De situatie N jaar geleden was dat er nergens een encoding was gedefineerd. De binary data die door de browser werd opgestuurd werd gewoon 1-op-1 in de binary storage geperst. Dat was dus, afhankelijk van de browser, latin-1 of windows-1252

Dat is inmiddels anders: er wordt tegen de browser gezegd dat alles utf-8 is - ook als dat eigenlijk niet zo is - de data uit de storage wordt nog steeds 1-op-1 doorgegeven. Maar: de browser zal data nu als utf-8 sturen, die wordt zonder het te bekijken opgeslagen en zo teruggegeven.

Maar: de XML exporter kan dat niet. Immers, om xmlcharrefs weg te kunnen schrijven moet je weten met welke unicode characters je te maken hebt. Om een onduidelijke reden heeft iemand er voor gekozen daar windows-1252 voor te gebruiken.

Uiteindelijk is de XML output dus gewoon een representatie van hun binary storage, en het is aan de ontvanger om uit te zoeken wat de daadwerkelijke encoding is (bv door het als utf-8 in te lezen met een fallback naar latin-1/windows-1252, wat een redelijk gangbare techniek is). Toch lichtelijk irritant dat ze dat niet even gedocumenteerd hebben (en dat ze windows-1252 hebben gebruikt ipv latin-1, want in dat laatste geval was het een stuk herkenbaarder geweest).

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
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...
Helemaal mee eens, ik kan daar ook niet tegen. Vooral als het allemaal public is enzo.

Ik heb nu nog een class library waarvan 90% van de methods (stuk of 100) niet meer wordt gebruikt, en ik wil deze weggooien. Kan ik dat ook met tooling laten doen? R# kan een safe delete doen, maar dat is op member-niveau, of op class-niveau, maar niet 'voor alle members van een class' :(

We are shaping the future


Acties:
  • 0 Henk 'm!

Verwijderd

C#:
1
[Obsolete()]

Toevoegen aan de methode lost al heel snel het probleem op (je krijgt een warning per aanroep van de method)

Dus bv
C#:
1
2
3
4
5
[Obsolete()]
public void OudeMethod()
{
//Doe iets...
}


Daarna ga je de warnings af en pas je die aan :)

[ Voor 35% gewijzigd door Verwijderd op 15-10-2011 22:23 ]


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
[Obsolete] is inderdaad een handige, die heb ik al bij een andere class gebruikt. Visual Studio geeft er mooi een warning op. Ik denk dat ik R#'s Safe Delete maar ga gebruiken op iedere method van de class. :)

We are shaping the future


Acties:
  • 0 Henk 'm!

Verwijderd

Ook kan je "Find All References" gebruiken, wat je hele Solution doorzoekt. Maar ja, dat werkt weer minder voor shared libraries.

Acties:
  • 0 Henk 'm!

  • Dwarrelegel
  • Registratie: Februari 2009
  • Laatst online: 16-09 21:56
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);
}

Dit was nadat hij in een switch case de breaks was vergeten en stond te roepen waarom alle acties altijd werden uitgevoerd.

Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Dwarrelegel 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);
}
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 >:)

Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
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 >:)
Gelukkig staat er nergens beschreven dat time in milliseconds is.
En je zult nog even moeten aangeven dat je de stack moet vergroten als je langer wilt wachten :+

Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 18-09 16:32
Eentje uit eigen hand, dat moet toch echt andersom als je thread safe wilt zijn :D
C:
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 ]


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 14:27

CoolGamer

What is it? Dragons?

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.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat ook alleen maar goed gaat als memory synchronization rules duidelijk zijn gedefinieerd. In C is dat iig niet het geval, wellicht in Objective-C wel?

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


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
CoolGamer 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.
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

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja dat zeg ik toch net ;). De vraag is of je de garantie hebt dat er pas naar object wordt geschreven nadat alle side-effects van [[NSObject alloc] init] helemaal zijn afgerond. En dan kun je wel denken: "duh, het is een functie die wordt aangeroepen, die is al klaar als ie returnt", maar het staat de compiler vrij om alle operaties die gedaan moeten worden te herordenen.

Moderne C en C++ compilers hebben als regel dat een write naar een volatile release semantics heeft, en een read van een volatile acquire semantics. Dat houdt in dat iig alle writes voor de write naar de volatile gegarandeerd zijn afgerond, en alle reads die je doet na een volatile read pas daadwerkelijk plaatsvinden ná die volatile read. In C++-11 is dit opgenomen in de standaard, C loopt wat dat betreft nog wat achter. Hoe het met Objective-C implementaties zit weet ik niet.

[ 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.


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Remus 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
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 6% gewijzigd door Jegorex op 19-10-2011 15:11 ]


Acties:
  • 0 Henk 'm!

  • ctrlaltdelbe
  • Registratie: Juli 2005
  • Laatst online: 25-09 11:09
Deze hoort wel thuis in het topic: signs that you are a bad programmer :D

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

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, doet het ook.
Volgens die link moet ik dus alsnog volatile gebruiken.
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.

Daarnaast wil je ook dat de read volatile is, omdat je anders een gecachede kopie kunt krijgen die wellicht nog null is, waardoor je 2x het object construct. Wel zou je zoiets kunnen doen:

Java:
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.


Acties:
  • 0 Henk 'm!

  • Dwarrelegel
  • Registratie: Februari 2009
  • Laatst online: 16-09 21:56
C++:
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);
  }

Nog een mooie .....

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat behoeft iets meer uitleg. Ik zie een nutteloze substring constructie elke keer, maar dat noem ik nou niet echt een slecht programmeervoorbeeld.

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


Acties:
  • 0 Henk 'm!

  • Montaldo
  • Registratie: Oktober 2011
  • Laatst online: 17-07-2024
Typo. De iterator idx wordt niet opgehoogd, maar i.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Montaldo schreef op donderdag 20 oktober 2011 @ 01:43:
Typo. De iterator idx wordt niet opgehoogd, maar i.
Dat zou een compilerfout moeten opleveren, daar i niet in de scope staat (voor zover ik kan zien).

En als dit slechts een onderdeel is van een grotere method: doe eens een Extract Method, :+.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
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.
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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is een van de punten die ik daarnet al noemde ja, en dan vergeet je even het andere punt, dat de write naar de variabele niet per se plaatsvindt ná het runnen van de ctor. De VM kan instructies herordenen, en de CPU kan memory access intern ook nog eens herordenen. Alleen een compiler barrier is dus niet afdoende, een speciale memory barrier instructie is ook nog eens van belang (maar dan weer niet op x86 CPU's, want die herordenen geen memory access, maar da's een implementatiedetail waar je je als Java programmeur niet mee bezig hoeft te houden)

[ 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.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Pinball Programming

One Try-Catch block wrapping the entire body of Main() and resetting the program in the Catch clause (the pinball gutter)
Schitterend :P

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • tiesmaster
  • Registratie: Maart 2003
  • Laatst online: 25-10-2022
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 8)7 .
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.

Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 17:00
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 :),

Overigens hadden we het alleen nodig voor het verwerken van Bitmaps in Android, dat is namelijk een draak, aangezien die niet automatisch gerecycled worden :(. Erg irritant in een managed omgeving.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Uiteindelijk is een zichzelf opnieuw startende applicatie niet eens zo'n gek idee, zeker niet in de grotere / geclusterde omgevingen. Ja, je wilt liever software schrijven die gewoon niet kan crashen, maar zoals Alex al aangeeft, soms heb je daar gewoon geen invloed over.

Zeker als het lichtgewicht software is moet dat niet een al te groot drama zijn. Je kunt bijv. een viertal NodeJS processen op een server met een loadbalancer ervoor draaien (allemaal op dezelfde machine) (NodeJS is singlethreaded, vier processen kunnen een quadcore beter gebruiken), die elk door een programma als Supervisor of één van de twintig alternatieven opnieuw opgestart worden indien er toch iets stuq gaat.

Acties:
  • 0 Henk 'm!

  • smeetsmeister
  • Registratie: Maart 2010
  • Laatst online: 07-07 15:19
Ik ben van de week toch wel een erg puntje tegengekomen. Er was een website die door een voorganger was gemaakt. Hij had bij een else (als je niet ingelogd was op een pagina om dingen te bewerken) een echo staan: 'Rot op kut mongool'. Niet zo slim natuurlijk, maar je kunt mijn verbaasde hoofd voorstellen toen deze klant me opbelde dat hij niet tevreden was met wat er in z'n site stond.

Acties:
  • 0 Henk 'm!

  • RomeoJ
  • Registratie: Mei 2003
  • Niet online

RomeoJ

Matched: (.*)

Sowieso niet slim om dat soort teksten te gebruiken, ook niet om even snel iets te testen.

Collega van mij had een keer snel wat linkjes aangemaakt op een website met xxx als href, bij het testen kwamen er een aantal personen op de blacklist van onze proxy, omdat ze die linkjes aangeklikt hadden.
Toen mochten deze personen bij hun leidinggevenden uit gaan leggen waarom ze een pornografische site wilden bekijken :X

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.


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Jeuj bugfixxen. Eerste bug gefixed:

C:
1
2
3
4
5
6
7
+(BOOL)ShowHSL {
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"yearly_subscription_preference"];
}

+(BOOL)YearlySubscription {
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"hsl_preference"];
}


:+

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 25-09 15:59
Ik kom net deze tegen:

C#:
1
2
3
int volgNummer = 1;
//Doe iets met volgnummer
string foo = string.Format("{0}", volgNummer.ToString());


:? :S

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 27-09 14:27
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());


:? :S
Whut :D :D

Acties:
  • 0 Henk 'm!

Verwijderd

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());


:? :S
Die valt toch wel mee? Hij lijkt misschien nogal stom, maar:

Wie zegt dat het volgnummer altijd een integer zal zijn of is geweest? (Dat blijkt niet uit de code zo). Volgens mij is iets dergelijks een paar pagina's geleden ookal voorbij gekomen... Dit is eerder een gebrek aan documentatie dan een slecht voorbeeld van programmeren.

Er zitten wel paar kleine dingetjes in: "ToString()" is natuurlijk niet nodig en eigenlijk (heel puristisch gezien) zou je ook de Culture moeten opgeven bij de format.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Er zitten wel paar kleine dingetjes in: "ToString()" is natuurlijk niet nodig
Het hele punt is dat een string.Format("{0}", x.ToString()) hetzelfde is als gewoon x.ToString()

[ 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.


Acties:
  • 0 Henk 'm!

Verwijderd

Deze week voor de zoveelste keer van een aanleverende partij een XSD-schema gehad voor de XML die zij gaan aanleveren. Op zich hartstikke mooi natuurlijk, kunnen wij fijn de XML valideren bij binnenkomst :*). Beetje jammer dat de aanleverende partij de XSD zelf niet gebruikt en hij dus vol met fouten stond :X. En helaas lijkt dat tegenwoordig meer regel dan uitzondering te zijn... :(

Acties:
  • 0 Henk 'm!

Verwijderd

.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()
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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

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?
Hoe is dat relevant dan?
Format geeft je echter wel meer mogelijkheden.
Maar die worden niet gebruikt.

[ 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.


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op vrijdag 21 oktober 2011 @ 13:00:
[...]

Hoe is dat relevant dan?

[...]

Maar die worden niet gebruikt.
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.

Maar er zijn in dit geval legio (legacy/extensibility) redenen te vinden en te bedenken waarom men hiervoor heeft gekozen. En laten we eerlijk zijn, dan is dit helemaal niet zo raar of slecht.... Hooguit wat ongelukkig...

[ Voor 17% gewijzigd door Verwijderd op 21-10-2011 13:15 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.
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.

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


Acties:
  • 0 Henk 'm!

Verwijderd

.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.
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 :).

Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 27-09 17:04
Zelfs als was het "vroeger" anders, dan nog zou zoiets niet mogen.
De ontwikkelaar die het zo heeft aangepast, heeft dan er een andere betekenis aan gegeven.
Wat zijn grote fout is geweest, is dat hij niet goed of onvoldoende de code heeft gerefactored, maar "lekker makkelijk" alleen de kleine aanpassingen heeft gedaan. Ook een hele goede manier om spaghetti-code te maken.

regel: ALS JE REFACTORED, MOET JE HET GOED DOEN! (8>

let the past be the past.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Nu we het toch over refactoren hebben. Iemand enig idee hoe je je collega's dat kan aanleren?

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

Pagina: 1 ... 72 ... 103 Laatste

Dit topic is gesloten.

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