Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three
Kater? Eerst water, de rest komt later
1
| someButton.Enabled = someBoolean ? true : false; |
Dat is dan weer wat overdreven, naar mijn idee.
Overigens zie ik het hier bij return statements ook vaak terugkomen, ook bij korte condities. Zelf heb ik de voorkeur voor de tweede optie zonder if-else, maar dat is persoonlijk.
Doet me denken aan mijn eerste stukjes codeAmras schreef op vrijdag 02 april 2010 @ 10:00:
Sommigen kunnen het if-elsen ook overdrijven, zo kwam ik hier in de frontend het volgende eens tegen:
C#:
1 someButton.Enabled = someBoolean ? true : false;
Dat is dan weer wat overdreven, naar mijn idee.
Overigens zie ik het hier bij return statements ook vaak terugkomen, ook bij korte condities. Zelf heb ik de voorkeur voor de tweede optie zonder if-else, maar dat is persoonlijk.
1
2
3
4
5
6
7
8
| If ((myVar = 5) = True) Then myButton.Visible = True End If 'Of bijvoorbeeld If(myButton.Visible = True) Then 'Switch button visibility myButton.Visible = False End If |
Toen wist ik dus nog niet wat je met een boolean moest doen. Maar goed toen was ik ook nog jong (eerste klassen van de middelbare school) en was het internet nog niet zo toegankelijk (33k6
Overigens zal ik nooit grote vriendjes worden met VB (ook niet VB.net) ik heb nu een aantal projecten in VB.NET gemaakt, maar zodra het kan probeer ik toch weer C# te gebruiken. De beroerde typesafety op bepaalde plekken in VB heeft me al aardig wat WTF momentjes opgeleverd. En dat terwijl de compiler zo strict mogelijk staat. Vooral met nullables laat VB geregeld steekjes vallen.
Overigens zou jouw voorbeeld wel nuttig zijn bij nullable booleans:
1
| someButton.Enabled = someBoolean ?? false; //If null just use false as value |
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Bij het interpreteren van code dien je inderdaad te weten op welk platform dit gebeurt. Soms kan het een probleem zijn vanwege het verschil tussen Little en Big-Endian.fleppuhstein schreef op donderdag 01 april 2010 @ 17:33:
[...]
Eigenlijk iscode:wel een "zwaardere" belasting dan
1 % 2code:(Check op first bit, die al gelijk even/oneven aangeeft)
1 & 1
Ook de interpretatie van floats en (signed) integers worden normaal aangenomen om op één bepaalde manier te worden opgeslagen. In het geval van signed integers vaak Two's Complement, maar dat kan natuurlijk ook Gray Code, waarbij het niet zo is dat i & 1 gelijk is aan het oneven of even zijn van i.
De compiler bemoeit zich daar ook niet mee, maar i % 2 heeft een grote kans om geoptimaliseerd te worden tot i & 1, aangezien de meeste systemen Two's Complement gebruiken.
Zo zou je in principe ook bit-wise operaties uit kunnen voeren op floating point getallen! Bitwise operaties zorgen er eigenlijk in alle gevallen voor dat code platform-afhankelijk wordt. In de meeste script-talen hoef je hier dus compleet geen rekening mee te houden, maar bij talen als C/C++ wel:
1
2
3
4
| unsigned int i; if(i == -1){ // do something } |
In het geval van Two's Complement wordt de hoogste waarde gepakt (allemaal 1'en), maar in unsigned Gray Code wordt dit iets compleet anders!
Helaas is het inderdaad zo dat modulo dan weer op verschillende systemen anders wordt geinterpreteerd, waardoor het mogelijk is dat je een negatief antwoord krijgt, afhankelijk van de taal/platform combinatie.
Oneven is gewoon "n % 2 != 0" ipv "n % 2 == 1".
Of je zet "n % 2 == 0" in een functie IsEven en je implementeert IsOdd als !IsEven.
Als ik aan complexere expressies denk, denk ik eerder aan Introduce Explaining Variable, niet of ik wel of geen if moet gebruiken.BM schreef op vrijdag 02 april 2010 @ 09:44:
[...]
Vind ik nu niet echt heel slecht. Sure, het 2e is korter, maar zodra die checks iets complexer worden is je 1e voorbeel imho stukken leesbaarder
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Dat is ook wel weer waar. Anders moet je waarschijnlijk een hele lap comments boven je return gooien om uit te leggen wat code doet. Goede code verklaart zichzelf en met een explaining variable kun je het inderdaad duidelijker maken.RayNbow schreef op vrijdag 02 april 2010 @ 11:57:
[...]
Als ik aan complexere expressies denk, denk ik eerder aan Introduce Explaining Variable, niet of ik wel of geen if moet gebruiken.
Goede tip!
Van die site had ik nog nooit gehoord, eens snuffelen of er meer leuke dingen op staan
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Klopt, maar dat was niet mijn punt (wat jij zegt stond ook in de wiki-link over modulo). Het gaat er meer over dat je bij bepaalde input en bepaalde structuren, gewoon meteen ziet wat er zou moeten gebeuren maar niet wat er daadwerkelijk gebeurt. Ik houd met dit soort 'afwijkingen' ook geen rekening in mijn code, omdat ik altijd voor maar één platform tegelijk programmeer. Maar dit is meer een waarschuwing dat de context van een systeem grote invloed kan hebben op de uiteindeljike uitvoer!Davio schreef op vrijdag 02 april 2010 @ 11:54:
Ja, maar dat je met modulo een negatief antwoord krijgt, is toch niet erg?
Oneven is gewoon "n % 2 != 0" ipv "n % 2 == 1".
Of je zet "n % 2 == 0" in een functie IsEven en je implementeert IsOdd als !IsEven.
De site hoort bij o.a. dit boek. Niet alles wat in het boek staat staat ook op de site. Het boek is prima leesbaar, zelfs al gebruikt het een oude versie Java om voorbeelden te bespreken..Gertjan. schreef op vrijdag 02 april 2010 @ 12:20:
Van die site had ik nog nooit gehoord, eens snuffelen of er meer leuke dingen op staan
* RayNbow heeft het boek ooit met korting op de kop getikt bij Donner *).
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Kijk zo steek ik nog eens wat opRayNbow schreef op vrijdag 02 april 2010 @ 12:36:
[...]
De site hoort bij o.a. dit boek. Niet alles wat in het boek staat staat ook op de site. Het boek is prima leesbaar, zelfs al gebruikt het een oude versie Java om voorbeelden te bespreken.
* RayNbow heeft het boek ooit met korting op de kop getikt bij Donner *).
Vond Code Complete wel een vrij duidelijk boek met leuke/goede voorbeelden. Niet heel veel van opgestoken, want bij veel dingen had ik vooral: "ja, duh.." en pas ik al toe in mijn dagelijkse development, maar het is altijd handig om voorbeelden te hebben als je bijvoorbeeld met juniors zou werken.
The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.
Ik heb Code Complete 2 niet gelezen, dus ik kan daar helaas geen uitspraak over doen..Gertjan. schreef op vrijdag 02 april 2010 @ 12:44:
Kijk zo steek ik nog eens wat op. Ik heb een vergelijkbaar boek gelezen "Code Complete 2", staan er in dit boek veel vernieuwende dingen of is het zonde van het geld als ik al CC2 in mijn kast heb staan.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
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.
Beide boeken zijn aanraders, ik heb ze beiden en sluiten elkaar zeker niet uit..Gertjan. schreef op vrijdag 02 april 2010 @ 12:44:
[...]
Kijk zo steek ik nog eens wat op. Ik heb een vergelijkbaar boek gelezen "Code Complete 2", staan er in dit boek veel vernieuwende dingen of is het zonde van het geld als ik al CC2 in mijn kast heb staan.
Vond Code Complete wel een vrij duidelijk boek met leuke/goede voorbeelden. Niet heel veel van opgestoken, want bij veel dingen had ik vooral: "ja, duh.." en pas ik al toe in mijn dagelijkse development, maar het is altijd handig om voorbeelden te hebben als je bijvoorbeeld met juniors zou werken.
Clean Code is overigens ook een aanrader.
[ Voor 5% gewijzigd door Michali op 02-04-2010 13:43 ]
Bitwise flags combineren met & ipv | ... What was I thinking!
Je bedoelt: What was & thinking!roy-t schreef op vrijdag 09 april 2010 @ 15:00:
En hierbij nomineer ik mijzelf! \[C#] EWX_FORCEIFHUNG afsluiten ook als programma crashed
Bitwise flags combineren met & ipv | ... What was I thinking!
FORCEIFHUNG klinkt trouwens best wel pr0n.
[/vrijdagmiddagflauw]
How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.
Nee, neem dan een koppeling die een kleine vier jaar geleden is gebouwd en waar ik deze week een aanpassing aan moest maken
Staat vol met dit soort dingen:
1
2
3
4
| string m_strServerAddress; string m_strUsername; string m_strPassword; string m_strDomain; |
Of een methode met 15 regels waarin allerlei onduidelijke dingen worden gedaan, zonder enig commentaar en dan op het eind dit:
1
2
| // update record updateRecord(); |
Of deze:
1
2
3
4
5
6
7
8
| if (value.Equals("false")) { boolean.Value = bool.Parse("false"); } else { boolean.Value = bool.Parse("true"); } |
Kater? Eerst water, de rest komt later
If money talks then I'm a mime
If time is money then I'm out of time
Ach, zulke naamgeving is niet echt een slecht programmeervoorbeeld. Er worden alleen conventies gebruikt die alweer gedateerd zijn.Haan schreef op vrijdag 09 april 2010 @ 15:08:
Foutje kan iedereen maken, dat maakt het niet meteen een slecht programmeervoorbeeld![]()
Nee, neem dan een koppeling die een kleine vier jaar geleden is gebouwd en waar ik deze week een aanpassing aan moest maken
Staat vol met dit soort dingen:
C#:
1 2 3 4 string m_strServerAddress; string m_strUsername; string m_strPassword; string m_strDomain;
![]()
[..]
Als je op de hoogte bent van de meeste stijl gerelateerde discussies en argumenten kun je het boek wat mij betreft de eerste 400 paginaas gewoon overslaan. De laatste 400 gaan over refactoren, optimizen, project groote, debuggen, testen et cetera. Meestal omschrijf ik het boek als dé samenvatting van alle programming gerelateerde flamewars.RayNbow schreef op vrijdag 02 april 2010 @ 12:53:
[...]
Ik heb Code Complete 2 niet gelezen, dus ik kan daar helaas geen uitspraak over doen.
[ Voor 20% gewijzigd door PrisonerOfPain op 09-04-2010 15:34 ]
(Waarschijnlijk is er ergens stiekem wel een nut voor iets als een doubleton of een tripleton, maar niet zoals het op deze manier geimplementeerd is, een n-eton lijkt me sowieso nutteloos).
[ Voor 24% gewijzigd door roy-t op 14-04-2010 20:43 ]
Geniaal, nu de uitwerkingen voor een sixtupliton :roy-t schreef op woensdag 14 april 2010 @ 20:37:
Mensen van the daily wtf zullen deze al gezien hebben als ze de comments van het artikel vandaag hebben doorgenomen. Maar zie hier: iemand die daadwerkelijk een serieuze implementatie van het doubleton pattern heeft gemaakt: http://www.codeproject.co...ignpattern_doubleton.aspx
If money talks then I'm a mime
If time is money then I'm out of time
Losse pols:Matis schreef op woensdag 14 april 2010 @ 20:39:
[...]
Geniaal, nu de uitwerkingen voor een sixtupliton :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Sixuptilon<T> implements Ningleton<T> { List<T> instances = new ArrayList<T>(6); int currentinstance = 0; public T getInstance() { if (currentinstance++ > 6) currentinstance = 0; T instance = instances.get(currentinstance); if (instance == null) { instance = new T(); // zal wel niet werken, ben lui. instances.put(currentinstance, instance); } return instance; } } |
zal wel niet werken. Ga ook een artikel maken over hoe je een Singleton kunt refactoren tot een Infiniton, waarbij je een onbeperkte* hoeveelheid instances van wat eerst een singleton was kunt maken. Ideaal voor als je applicatie ineens meer dan één databaseverbinding tegelijk op moet kunnen zetten. Ik denk zelfs dat dit zo vaak voor gaat komen (nadat ik mijn artikel schrijf, natuurlijk) dat het wel gepromoveerd kan worden tot een language feature. Wat dachten jullie van de 'nu' operator? DatabaseConnection conn = nu DatabaseConnection(params);. Lijkt me helemaal leip.
*: onbeperkt met een limiet van het aantal max object instanties op je systeem.
Verwijderd
Maak een applet met als doel dat deze de tafels print op het scherm. Wat er door iemand werd ingeleverd, was het volgende:
1
| String uitvoer = "1 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal) + /n +"2 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*2) + /n +"3 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*3) + /n +"4 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*4) + /n +"5 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*5) + /n +"6 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*6) + /n +"7 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*7) + /n +"8 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*8) + /n +"9 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*9) + /n +"10 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*10); |
En dit dus in één regel gepropt...
Iets anders, bij mij in de klas (5 VWO), ook bij een proefwerk java. Schrijf in een applet een manier waarbij van een reeks (array) enkel de even getallen zichtbaar zijn:
1
| if (willekeurigeArray[i] == 2 || willekeurigeArray[i] == 4 || willekeurigeArray[i] == 6 || willekeurigeArray[i] == 8 || willekeurigeArray[i] == 10 || willekeurigeArray[i] == 12 || willekeurigeArray[i] == 14 /* enz. tot aan de 150... */) |
Volgens mij was daar de modulo functie voor uitgevonden...
Dat zo iemand dan ook niet bij zichzelf denkt: "Hmm, als het nu groter is dan 150...? D'r moet een handigere manier zijn dan 100x copy-pasten...."Verwijderd schreef op maandag 19 april 2010 @ 17:36:
Proefwerk java (4 HAVO):
Maak een applet met als doel dat deze de tafels print op het scherm. Wat er door iemand werd ingeleverd, was het volgende:
Java:
1 String uitvoer = "1 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal) + /n +"2 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*2) + /n +"3 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*3) + /n +"4 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*4) + /n +"5 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*5) + /n +"6 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*6) + /n +"7 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*7) + /n +"8 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*8) + /n +"9 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*9) + /n +"10 x " + String.valueOf(tafelgetal) + " = " + String.valueOf(tafelgetal*10);
En dit dus in één regel gepropt...
Iets anders, bij mij in de klas (5 VWO), ook bij een proefwerk java. Schrijf in een applet een manier waarbij van een reeks (array) enkel de even getallen zichtbaar zijn:
Java:
1 if (willekeurigeArray[i] == 2 || willekeurigeArray[i] == 4 || willekeurigeArray[i] == 6 || willekeurigeArray[i] == 8 || willekeurigeArray[i] == 10 || willekeurigeArray[i] == 12 || willekeurigeArray[i] == 14 /* enz. tot aan de 150... */)
Volgens mij was daar de modulo functie voor uitgevonden...
Een 3 voor nadenken, een 8 voor 75x copy-pasten.
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 lijkt me al veel te complex als je gewoon geen idee hebt. Zo'n antwoord lijkt me echt een last resort omdat hij het echt niet wist, in de hoop nog wat puntjes bij elkaar te sprokkelen (hopelijk niet gelukt, maar je weet maar nooit...).oisyn schreef op maandag 19 april 2010 @ 18:46:
Idd, de meer typisch studenten oplossing zou zijn om er een string van te maken en dan te kijken of de achterste digit een 2, 4, 6, 8 of 0 is
Je kunt het toch in een loopje zetten?Davio schreef op maandag 19 april 2010 @ 18:25:
[...]
Dat zo iemand dan ook niet bij zichzelf denkt: "Hmm, als het nu groter is dan 150...? D'r moet een handigere manier zijn dan 100x copy-pasten...."
1
2
3
4
5
6
| for (int n = 0; n < Integer.MaxValue; n += 2)
{
if (willekeurigeArray[i] == n)
return "even";
}
return "oneven"; |
Wie ziet de bugNickThissen schreef op maandag 19 april 2010 @ 19:21:
[...]
Je kunt het toch in een loopje zetten?
code:
1 2 3 4 5 6for (int n = 0; n < Integer.MaxValue; n += 2) { if (willekeurigeArray[i] == n) return "even"; } return "oneven";
[ Voor 8% gewijzigd door CoolGamer op 19-04-2010 19:31 ]
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
Verwijderd
antwoord dient er als volgt uit te zien:
0 1
1 2
2 4
3 8
was er door iemand ingeleverd:
1
| printf("0\t1\n1\t2\n2\t4\n enz enz.."); |
die gast had de volle mep punten gekregen
1
2
| if (willekeurigearray[i] < 0) crash(); |
[ Voor 27% gewijzigd door Verwijderd op 19-04-2010 19:31 ]
Verwijderd
Niet echt...Verwijderd schreef op maandag 19 april 2010 @ 19:27:
[...]
code:
1 2 if (willekeurigearray\[i] < 0) crash();
Het eerste stukje vind ik handiger om debug redenen. Je kunt namelijk er zo met je debugger erdoorheen steppen en dan al zien wat de return waarde gaat zijn.roy-t schreef op vrijdag 02 april 2010 @ 09:40:
Wat betreft slechte programmeer voorbeelden: ik flik nog wel eens het volgende truukje:
C#:
1 2 3 4 5 6 if(someHardCondition && someOtherLongCondition) { return true; } return false;
Dan ben ik zo bezig met die check schrijven dat ik helemaal vergeet dat ik die check meteen kan returnen ala:
C#:
1 return someHardCondition && someOtherLongCondition
Wordt er redelijk vaak op gewezen als ik even snel een voorbeeld stukje code schrijf ofzo. Erg stom, maar gelukkig werkt het programma nog net zo goed.
Bij de onderste oplossing moet je nog maar zien wat de aanroepende methode met de return waarde gaat doen.
nope
Echt wel.
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
Verwijderd
Ik ging er even van uit dat Integer.MaxValue een correcte waarde was, maar zo niet dan loopt hij daar gelijk al stuk op?
Integer.MaxValue is 2147483647, is gewoon een correcte waarde.Verwijderd schreef op maandag 19 april 2010 @ 19:49:
[...]
Ik ging er even van uit dat Integer.MaxValue een correcte waarde was, maar zo niet dan loopt hij daar gelijk al stuk op?Als het een correcte waarde was, dan was het geen infinite loop, aangezien de "max value" niet infinite is.
Hint:
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
Waar komt die i vandaanTheCoolGamer schreef op maandag 19 april 2010 @ 19:23:
[...]
Wie ziet de bug(en dan bedoel ik niet de Integer.MAX_VALUE typefout.)
moet het dan niet zijn:
1
2
3
4
5
6
7
8
| for (int n = 0; n < Integer.MaxValue; n += 2) { for(int i = 0; i < willekeurigeArray.Length; i++) { if (willekeurigeArray[i] == n){ return "even"; } return "oneven"; |
overflows daargelaten
Verwijderd
Volgens mij moet het nooit iets zijn wat daar op lijkt.fiftyhillswest schreef op maandag 19 april 2010 @ 19:52:
[...]
Waar komt die i vandaan![]()
moet het dan niet zijn:
Java:
1 2 3 4 5 6 7 8 for (int n = 0; n < Integer.MaxValue; n += 2) { for(int i = 0; i < willekeurigeArray.Length; i++) { if (willekeurigeArray[i] == n){ return "even"; } return "oneven";
overflows daargelaten
Integer.MaxValue is trouwens ook een even getal en die wordt ook niet gecontroleerd.
[ Voor 51% gewijzigd door bobo1on1 op 19-04-2010 21:10 ]
Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.
En de bug is dat de laatste waarde die goed gaat 2147483646 is (== Integer.MaxValue - 1), en omdat die nog kleiner dan Integer.MaxValue is gaat hij nog eens 2 omhoog --> overflow.
Maar goed... Het was maar een grapje natuurlijk, niet serieus nemen
Ik hoop maar dat max int een oneven getal is, anders stort het universum in.bobo1on1 schreef op maandag 19 april 2010 @ 21:04:
Hoe zit het dan met negatieve getallen?
Integer.MaxValue is trouwens ook een even getal en die wordt ook niet gecontroleerd.
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 zo snel geen taal verzinnen die een overflow waarde heeft voor gehele getallen. Voor floating point getallen doen de talen het standaard wel.MBV schreef op maandag 19 april 2010 @ 21:34:
Hebben ze dan niet 1 getal gereserveerd om overflows te checken? zal vast wel een taal zijn die dat doet
Probeer het eens uit en probeer dan eens het antwoord te verklaren voor jezelf.
¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| public void saveAllCommerce(QuizDetails quiz, Connection connection) throws SQLException { if (isNotBlank(quiz.getPreloader().getMediaId())) { quiz.getPreloader().setQuizId(quiz.getId()); if (quiz.getPreloader().getId() > 0) { CommerceDAO.update(connection, quiz.getPreloader()); } else { CommerceDAO.insert(connection, quiz.getPreloader()); quiz.getPreloader().setId(CommerceDAO.getLastInsertedId(connection)); } } else { CommerceDAO.delete(connection, quiz.getPreloader()); quiz.setPreloader(new CommerceData(CommerceData.TYPE_PRELOADER)); } if (isNotBlank(quiz.getLargeImage().getMediaId())) { quiz.getLargeImage().setQuizId(quiz.getId()); if (quiz.getLargeImage().getId() > 0) { CommerceDAO.update(connection, quiz.getLargeImage()); } else { CommerceDAO.insert(connection, quiz.getLargeImage()); quiz.getLargeImage().setId(CommerceDAO.getLastInsertedId(connection)); } } else { CommerceDAO.delete(connection, quiz.getLargeImage()); quiz.setLargeImage(new CommerceData(CommerceData.TYPE_LARGEIMAGE)); } if (isNotBlank(quiz.getSmallImage().getMediaId())) { quiz.getSmallImage().setQuizId(quiz.getId()); if (quiz.getSmallImage().getId() > 0) { CommerceDAO.update(connection, quiz.getSmallImage()); } else { CommerceDAO.insert(connection, quiz.getSmallImage()); quiz.getSmallImage().setId(CommerceDAO.getLastInsertedId(connection)); } } else { CommerceDAO.delete(connection, quiz.getSmallImage()); quiz.setSmallImage(new CommerceData(CommerceData.TYPE_SMALLIMAGE)); } } |
* YopY is te lui en krijgt niet genoeg tijd om bovenstaande netjes op te lossen.
quiz.getPreloader()
quiz.getLargeImage()
quiz.getSmallImage()
Niet gewoon eenzelfde interface? Dan is het eenvoudig te refactoren naar
1
2
3
4
5
6
| public void saveAllCommerce(QuizDetails quiz, Connection connection) throws SQLException { doSomeWithSomeObject(quiz, connection, quiz.getPreloader(), CommerceData.TYPE_PRELOADER ); doSomeWithSomeObject(quiz, connection, quiz.getLargeImage(), CommerceData.TYPE_LARGEIMAGE ); doSomeWithSomeObject(quiz, connection, quiz.getSmallImage(), CommerceData.TYPE_SMALLIMAGE ); } |
“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.”
1
2
3
| $ip = $_SERVER['REMOTE_ADDR']; //ip adres van gebruiker $id = $_COOKIE['PHPSESSID']; //huidige session id $agent = $_SERVER['HTTP_USER_AGENT']; |
Vervolgens werden deze variabelen gewoon gebruikt in query's.
Stom dat ik deze niet eerder gezien heb, want het is een fijn lek zo.
En het lek is dan dat die user-agent niet werd escaped? Anders zie ik het probleem niet zo...dev10 schreef op vrijdag 23 april 2010 @ 14:04:
Net even een WTF-je tegengekomen van m'n voorganger.
[...]
Stom dat ik deze niet eerder gezien heb, want het is een fijn lek zo.
Regeren is vooruitschuiven
FTFY. Ook al worden session-id's door je appserver uitgedeeld, dan nog is het een kleine moeite om ze aan te passen. Cookies zijn cookies.T-MOB schreef op vrijdag 23 april 2010 @ 15:29:
[...]
En het lek is dan dat die user-agent en het session-id niet werd escaped? Anders zie ik het probleem niet zo...
Computer Science: describing our world with boxes and arrows.
Alle drie zijn door de gebruiker van je site aan te passen en moeten dus geescaped worden voor gebruik in een query.T-MOB schreef op vrijdag 23 april 2010 @ 15:29:
[...]
En het lek is dan dat die user-agent niet werd escaped? Anders zie ik het probleem niet zo...
Verder kun je deze:
1
| $id = $_COOKIE['PHPSESSID']; |
Beter vervangen door:
1
| $id = $_COOKIE[session_name()]; |
Of nog beter misschien, vervangen door:
1
| $id = session_id(); |
Want een session_id hoeft niet per se in een cookie te zitten, je kunt hem ook meegeven als GET parameter (wat realiteit wordt als nieuws: Cookies mogen volgend jaar alleen na toestemming internetter werkelijkheid wordt).
Verder moet ik nog zien of dat nieuwsbericht er door komt.
1
2
3
| public static object Nothing(this object obj) { return obj; } |
Gebruik dan gewoon de feature van je IDE.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Verwijderd
1
2
3
4
5
6
| <ul class="table"> <li class="header"><span class="colA">A</span> ... enz ... <span class="colZ">Z</span></li> <li><span class="colA">A</span> ... enz ... <span class="colZ">Z</span></li> <li><span class="colA">A</span> ... enz ... <span class="colZ">Z</span></li> <li><span class="colA">A</span> ... enz ... <span class="colZ">Z</span></li> </ul> |
Het gaat in dit geval gewoon om data, dus hier was een table dan weer wél op z'n plaats geweest... En om het nog leuker te maken.... Er zaten streepjes tussen de kolommen, alleen veranderde die niet mee op 't moment dat je de maten aanpast... Guess what,.. een background images met de streepjes!
Bleh, ranzig zeg...
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Verwijderd
Haha ja, het viel me nog mee dat dat niet gebruikt werd.Sebazzz schreef op vrijdag 23 april 2010 @ 22:39:
Net zoals die mensen die div's en spans in elkaar stacken en display: table-cell meegeven
Verwijderd
Het kan nog erger! In het zelfde project als de vorige post, sterker nog; op dezelfde pagina, wordt er nog iets moois gebruikt... Ik zag het in eerste instantie over het hoofd omdat het er op 't eerste gezicht heel normaal uit ziet ten opzichte van de eerder gepost code...Sebazzz schreef op vrijdag 23 april 2010 @ 22:39:
Net zoals die mensen die div's en spans in elkaar stacken en display: table-cell meegeven
Komt ie dan he:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <table> <caption>titeltje</caption> <tr> <td class="a">a</td> <td class="b">b</td> <td class="c">c</td> </tr> <tr> <td class="a">a</td> <td class="b">b</td> <td class="c">c</td> </tr> </table> |
Nu zou je denken "Daar is toch niks mis mee!?", aangezien het data is die in een table gegooid wordt..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| tr { display: inline; float: left; height: 20px; width: 200px; } td.a { display: inline; float: left; height: 20px; width: 50px; background: url('tableRow.jpg'); } td.b { display: inline; float: left; height: 20px; width: 50px; background: url('tableRow.jpg'); } td.c { display: inline; float: left; height: 20px; width: 100px; background: url('tableRow.jpg'); } |
.... wat moet ik daar nou nog over zeggen?
Mis ik iets geniaals?
wel kunne lachen om sommige voorbeelden!
Verwijderd
Ik heb die even zelf snel in html gegoten omdat ik me niet kon voorstellen wat daar visueel uitkwamVerwijderd schreef op maandag 26 april 2010 @ 21:54:
[...]
.... wat moet ik daar nou nog over zeggen?Ohja, de background is een border, waardoor het aanpassen van de breedtes nóg makkelijker gemaakt wordt...
Mis ik iets geniaals?
Het erge is dat hij geen rekening hield met de dikte van zijn border, anders had het resultaat er als een doodnormale tabel uitgezien...of was dit juist met opzet? God knows...
Verwijderd
Ja, het ziet er gewoon uit als een normale table, zowel op de pagina als in de html...Verwijderd schreef op dinsdag 27 april 2010 @ 00:15:
[...]
Ik heb die even zelf snel in html gegoten omdat ik me niet kon voorstellen wat daar visueel uitkwam![]()
Het erge is dat hij geen rekening hield met de dikte van zijn border, anders had het resultaat er als een doodnormale tabel uitgezien...of was dit juist met opzet? God knows...
Yup, maar ik ben te lui om te gaan refactoren, ;p. Alhoewel ik er vandaag weer even mee bezig ben.Woy schreef op woensdag 21 april 2010 @ 16:55:
Implementeren de resulterende objecten van:
quiz.getPreloader()
quiz.getLargeImage()
quiz.getSmallImage()
Niet gewoon eenzelfde interface? Dan is het eenvoudig te refactoren naar
Java:
1 2 3 4 5 6 public void saveAllCommerce(QuizDetails quiz, Connection connection) throws SQLException { doSomeWithSomeObject(quiz, connection, quiz.getPreloader(), CommerceData.TYPE_PRELOADER ); doSomeWithSomeObject(quiz, connection, quiz.getLargeImage(), CommerceData.TYPE_LARGEIMAGE ); doSomeWithSomeObject(quiz, connection, quiz.getSmallImage(), CommerceData.TYPE_SMALLIMAGE ); }
Edit: Of toch niet. Heb van CommerceData.TYPE_ETC maar even een enum gemaakt, en de commerce velden in Quiz maar generiek gemaakt (zodat in de toekomst ook andere vormen van commercie toegevoegd kunnen worden). Veel beter zo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public void saveAllCommerce(QuizDetails quiz, Connection connection) throws SQLException { for (CommerceData data : quiz.getCommerce()) { // only save the commerce if a media ID (read: an image) has been uploaded. if (isNotBlank(data.getMediaId())) { if (data.hasId()) { CommerceDAO.update(connection, data); } else { CommerceDAO.insert(connection, data); data.setId(CommerceDAO.getLastInsertedId(connection)); } // delete the commerce if the media ID is missing but it was persisted. // Note this is an exceptional case (such as a JCR corruption) // and this is only there to fix that corruption. } else if (data.getId() > 0) { CommerceDAO.delete(connection, data); } } } |
Edit #zoveel / subject change: Waarom krijg ik steeds meer een hekel aan defensief programmeren, dwz waarom vindt ik het nog steeds altijd nodig? Zie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public String getImageUrl(String imageId) { if (isBlank(imageId)) { LOG.log(Level.FINE, "Returning empty image URL, no image ID passed"); return StringUtils.EMPTY; } ImageEntity i = (ImageEntity) entityManager.find(new JcrWmId(imageId)); if (i == null) { LOG.log(Level.WARNING, "No ImageEntity found for ID " + imageId); return StringUtils.EMPTY; } String imageUrl = i.getImage().getURL(""); if (sessionManager != null && sessionManager.getActiveSession() != null) { imageUrl = "http://" + sessionManager.getActiveSession().getContext().getWebsite().getHostName() + imageUrl; } else { LOG.log(Level.WARNING, "Unable to get full image URL: SessionManager or active session is null"); } return imageUrl; } |
Kent iemand voor bovenstaand misschien alternatieven?
[ Voor 65% gewijzigd door YopY op 27-04-2010 12:51 ]
Je kan ook gewoon programmeren volgens contract (je verwacht dus correcte data in een klasse). Het nadeel is dan weer wel dat je je controles van de data ergens anders moet gaan doen. Nu ja, op zich, als het om interne data gaat, dwing je sowieso al een goede vorm af... het probleem zit 'em dan enkel om user input (dus files, GUI input, etc) juist af te handelen.YopY schreef op dinsdag 27 april 2010 @ 11:56:
[...]
Edit #zoveel / subject change: Waarom krijg ik steeds meer een hekel aan defensief programmeren, dwz waarom vindt ik het nog steeds altijd nodig? Zie:
[...]
Kent iemand voor bovenstaand misschien alternatieven?
[ Voor 31% gewijzigd door Styxxy op 27-04-2010 18:06 ]
Ja, zo zou het wel in een ideale situatie zijn. Helaas werk ik in dit geval met een library van de ontwikkelaars van het CMS die nogal vaak de neiging hebben om null terug te geven. Die EntityManager.find() zijn implementatie bijvoorbeeld, stukje daaruit (geknipt en wat namen veranderd, ik denk niet dat het officieel toegestaan is om zo gedecompliede code te copy / pasten):Styxxy schreef op dinsdag 27 april 2010 @ 18:06:
[...]
Je kan ook gewoon programmeren volgens contract (je verwacht dus correcte data in een klasse). Het nadeel is dan weer wel dat je je controles van de data ergens anders moet gaan doen. Nu ja, op zich, als het om interne data gaat, dwing je sowieso al een goede vorm af... het probleem zit 'em dan enkel om user input (dus files, GUI input, etc) juist af te handelen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| /* */ public Object find(SomeId primaryKey, SomeObject context) /* */ { /* 98 */ Object entityFromCache = getEntityCache().getEntityFromCache(primaryKey); /* 99 */ if (entityFromCache != null) { // null check. Niet eens heel erg verkeerd hier, maar zou ook vervangen kunnen worden met een hasKey() oid. /* 100 */ return entityFromCache; /* */ } /* */ /* 104 */ EntityDomain entityDomain = getEntityDomain(primaryKey.getClass().getName()); /* 105 */ if (entityDomain == null) { // null controle, getEntityDomain geeft dus ook null terug /* 106 */ LOG.log(Level.WARNING, "No EntityDomain known id class " + primaryKey.getClass().getName()); /* 107 */ return null; // return null -_- /* */ } /* */ /* 111 */ Object entity = entityDomain.find(primaryKey, context); /* */ /* 114 */ if (entity != null) { // nog een null controle /* 115 */ getEntityCache().addEntityToCache(entity); /* */ } /* */ /* 120 */ return entity; // entity kan ook null zijn als entityDomain.find null teruggeeft /* */ } |
Eerder in dit topic had ik het over NullObject, nu zal dat misschien niet echt een goed en bruikbaar design pattern zijn... maar ik wordt toch lichtelijk onpasselijk door al die null controles.
Edit: Bijgewerkt zoals ik het liever zou willen zien.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public Object find(SomeId primaryKey, SomeObject context) { // controleer of object in cache staat if (getEntityCache().contains(primaryKey)) { return getEntityCache.getEntityFromCache(primaryKey); } EntityDomain entityDomain = getEntityDomain(primaryKey.getClass().getName()); // neem aan dat getEntityDomain nooit null is. Zo ja, een NullPointerException // ipv een WARNING, null terugsturen, en een null controle in de aanroeper. Object entity = entityDomain.find(primaryKey, context); // addEntityToCache doet niets als entity null is. getEntityCache().addEntityToCache(entity); // entity kan hier wel null zijn indien er niks gevonden is. // Weet nog niet hoe je dat op zou kunnen lossen. return entity; } |
En het overdadige gebruik van Integer ipv gewoon int, aangezien er maar knap weinig gebruik gemaakt wordt van de functies die in het Integer object gebruikt worden, én er overal null-controles zijn op het Integer object gevolgd door een >0 check.
1
2
| Integer ding = doeIets(); if (ding != null && ding > 0) { // doe iets } |
-____-
Nu heb ik zelf een class gemaakt waar helemaal geen nulls teruggegeven worden, die effectief 'dichtgetimmerd' is - nulls komen er niet in (en als die opgestuurd worden, worden ze vervangen met een default waarde) en nulls komen er niet uit. Heel defensief, is ook meer een experiment.
1
2
3
4
5
6
7
8
9
10
| private void setQuestionAmount(int qamount) { if (qamount <= 0) { this.questionAmount = NO_QUESTION_AMOUNT; } else if (qamount > MAX_QUESTION_AMOUNT) { LOG.log(Level.WARNING, "Attempted to set question amount > " + qamount + ", defaulted to " + MAX_QUESTION_AMOUNT); this.setMaxQuestionAmount(); } else { this.questionAmount = qamount; } } |
...en ik praat te veel, ik hou me weer even stil. Of moet ik over dit soort dingen gaan bloggen?
[ Voor 12% gewijzigd door YopY op 28-04-2010 09:47 ]
Mijn WTF moment had ik toen mij gevraagd werd om een bug op te sporen. Er moeten bestanden geüpload kunnen worden, maar ze kwamen niet meer aan. Nergens een logmelding oid te vinden natuurlijk
In het hele project wordt verder nergens iets gelogd, en try/catch blokken met lege catch zijn ook niet zeldzaam aanwezig, dus je bent gewoon vreselijk aan de beurt als er iets aan de hand is zoals nu.
Ik vraag me serieus af hoe het kan dat dit project ooit is geaccepteerd.
Kater? Eerst water, de rest komt later
Ik vind de volgende constructie altijd wat netter met zelf beheerde caches:YopY schreef op woensdag 28 april 2010 @ 09:41:
[...]
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public Object find(SomeId primaryKey, SomeObject context) { // controleer of object in cache staat if (getEntityCache().contains(primaryKey)) { return getEntityCache.getEntityFromCache(primaryKey); } EntityDomain entityDomain = getEntityDomain(primaryKey.getClass().getName()); // neem aan dat getEntityDomain nooit null is. Zo ja, een NullPointerException // ipv een WARNING, null terugsturen, en een null controle in de aanroeper. Object entity = entityDomain.find(primaryKey, context); // addEntityToCache doet niets als entity null is. getEntityCache().addEntityToCache(entity); // entity kan hier wel null zijn indien er niks gevonden is. // Weet nog niet hoe je dat op zou kunnen lossen. return entity; }
En het overdadige gebruik van Integer ipv gewoon int, aangezien er maar knap weinig gebruik gemaakt wordt van de functies die in het Integer object gebruikt worden, én er overal null-controles zijn op het Integer object gevolgd door een >0 check.
Java:
1 2 Integer ding = doeIets(); if (ding != null && ding > 0) { // doe iets }
-____-
Nu heb ik zelf een class gemaakt waar helemaal geen nulls teruggegeven worden, die effectief 'dichtgetimmerd' is - nulls komen er niet in (en als die opgestuurd worden, worden ze vervangen met een default waarde) en nulls komen er niet uit. Heel defensief, is ook meer een experiment.
Java:
1 2 3 4 5 6 7 8 9 10 private void setQuestionAmount(int qamount) { if (qamount <= 0) { this.questionAmount = NO_QUESTION_AMOUNT; } else if (qamount > MAX_QUESTION_AMOUNT) { LOG.log(Level.WARNING, "Attempted to set question amount > " + qamount + ", defaulted to " + MAX_QUESTION_AMOUNT); this.setMaxQuestionAmount(); } else { this.questionAmount = qamount; } }
...en ik praat te veel, ik hou me weer even stil. Of moet ik over dit soort dingen gaan bloggen?
1
2
3
4
5
6
7
8
9
10
| // controleer of object in cache staat, zo niet adden if (!getEntityCache().contains(primaryKey)) { EntityDomain entityDomain = getEntityDomain(primaryKey.getClass().getName()); Object entity = entityDomain.find(primaryKey, context); getEntityCache().addEntityToCache(entity); } // return object in cache return getEntityCache.getEntityFromCache(primaryKey); } |
Altijd eerst even checken of de key in de cache zit en added als dit dit niet zo is, om vervolgens daarna altijd de waarde uit de cache te returnen. Verder ben ik het wel met je eens dat in sommige gevallen je juist zou willen dat er een npe komt bij null waarden. Dat is wel zo duidelijk als je een stacktrace leest
Verder leent de setQuestionAmount zich uitstekend voor Math.min en Math.max
tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN
Ai, dat is krap lastig met zo'n library.YopY schreef op woensdag 28 april 2010 @ 09:41:
[...]
Ja, zo zou het wel in een ideale situatie zijn. Helaas werk ik in dit geval met een library van de ontwikkelaars van het CMS die nogal vaak de neiging hebben om null terug te geven.
[...]
Edit: Bijgewerkt zoals ik het liever zou willen zien.
[...]
Persoonlijk ben ik eerder van van (pseudo-code):
1
| public boolean find(SomeId primaryKey, SomeObject context, out SomeObjectToReturn returnObjct) |
Ik vind dat eigenlijk nog een properdere oplossing dan een null te gaan returnen (uiteraard als find() false geeft, dan is returnObjct ook null).
Gebrekkige kwaliteitscontrole, slechts gebruikers die het geheel aan de voorkant 'testen' door er even doorheen te klikken... d'r zijn genoeg redenen te bedenken. Meestal is het gewoon luiheid of gierigheid.[b][message=33907563,noline]Ik vraag me serieus af hoe het kan dat dit project ooit is geaccepteerd.
Als ik ooit (mede) verantwoordelijk wordt voor het outsourcen van een project ga ik flink de code nazi uithangen.
Eensch, alhoewel je hierbij wel altijd die cache aanroept (als je echt kritisch op performance bent, alhoewel dit bij een map eigenlijk marginaal is).quote: TubbyIk vind de volgende constructie altijd wat netter met zelf beheerde caches:
Ik haat wiskunde, maar je hebt gelijkquote: TubbyVerder leent de setQuestionAmount zich uitstekend voor Math.min en Math.max (los van de (waarschijnlijk) wenselijke log warning)
1
| this.questionAmount = Math.max(Math.min(qamount, MAX_QUESTION_AMOUNT), NO_QUESTION_AMOUNT); |
Mogelijk is dit fout, het ontbreekt me nog aan rekenkundig inzicht.
Waarom eigelijk?Styxxy schreef op woensdag 28 april 2010 @ 13:14:
[...]
Ai, dat is krap lastig met zo'n library.
Persoonlijk ben ik eerder van van (pseudo-code):
code:
1 public boolean find(SomeId primaryKey, SomeObject context, out SomeObjectToReturn returnObjct)
Ik vind dat eigenlijk nog een properdere oplossing dan een null te gaan returnen (uiteraard als find() false geeft, dan is returnObjct ook null).
Wat is er mis met null returnen als er niets is gevonden, en iets in een out parameter steken als er iets gevonden?
Qua code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| out SomeObjectToReturn result = null; if(find(..., ..., out result)) { // doe iets met result } else { // niets gevonden } // of SomeObjectToReturn result = find(..., ...); if(null != result) { // doe iets met result } else { // niets gevonden } |
Dan toch liever de 2de
Going for adventure, lots of sun and a convertible! | GMT-8
Er is niets mis meeSnake schreef op woensdag 28 april 2010 @ 13:20:
[...]
Waarom eigelijk?
Wat is er mis met null returnen als er niets is gevonden, en iets in een out parameter steken als er iets gevonden?
Die vuistregel zou je in je eigen code ook kunnen hanteren. Zolang maar goed gedocumenteerd is wat het gedrag is
[ Voor 6% gewijzigd door Haan op 29-04-2010 08:44 ]
Kater? Eerst water, de rest komt later
1
2
3
4
5
| $aProducts = array_keys($aBasket); foreach ($aProducts as &$sKey) { $sKey = (int)$sKey; // haal alle extra info uit de key } unset($sKey); |
Na enig zoekwerk kwam ik erachter dat die keys (ongeveer) zo opgebouwd zijn: productid{num}anderid
En hier was alleen het productid noodzakelijk (deze lijst komt bij de browser vandaan) voor verdere verwerking. Dus werd er gecast naar een int zodat de rest weg viel.
Aangezien ik ook code zoveel mogelijk probeer te checken voordat het livegezet/getest wordt las ik hier eerst een stuk code wat niks deed, maar na goed kijken zag ik dat de $sKey een reference was en dat ik tevens het stukje commentaar verkeerd las
Uiteraard direct de betreffende devver gebeld en gevraagd hoe dit nu werkte (wist eerst ook niet dat die keys zo opgebouwd waren) en vervolgens heeft hij het prima verbeterd (vooral een beter stuk commentaar), maar ik wilde het jullie niet onthouden
Maar krijg je dan niet dat je in je returnObject (indien die 'gevuld' moet worden met gegevens zoals ik denk dat je bedoelt) ook logica in moet vullen dat aangeeft dat hij 'leeg' is? (dwz nullobject of een variant daarop)Styxxy schreef op woensdag 28 april 2010 @ 13:14:
Persoonlijk ben ik eerder van van (pseudo-code):
code:
1 public boolean find(SomeId primaryKey, SomeObject context, out SomeObjectToReturn returnObjct)
Ik vind dat eigenlijk nog een properdere oplossing dan een null te gaan returnen (uiteraard als find() false geeft, dan is returnObjct ook null).
De null controle,quote: SnakeWat is er mis met null returnen als er niets is gevonden, en iets in een out parameter steken als er iets gevonden?
1
2
3
4
5
6
| List<SomeObject> result = getSomeObject(param); if (result != null) { for (SomeObject o : result) { // iets } } |
versus
1
2
3
| for (SomeObject o : getSomeObject(param) { // iets } |
Daarom probeer ik methodes die een List terugsturen ook altijd als zodanig te implementeren:
1
2
3
4
5
6
7
| function List<SomeObject> getSomeObject(int param) { List<SomeObject> result = Collections.<SomeObject>emptyList(); if (param > 0) { result = someDao.findById(param); } return result; } |
bijvoorbeeld. En natuurlijk in de documentatie aangeven dat 'ie nooit null teruggeeft.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| void Color::colortransform(int colorcode,float shade) { float redc,greenc,bluec; if(colorcode == 0) { redc = colorcodered[0]; greenc = colorcodegreen[0]; bluec = colorcodeblue[0]; } else if(colorcode == 1) { redc = colorcodered[1]; greenc = colorcodegreen[1]; bluec = colorcodeblue[1]; } else if(colorcode == 2) { redc = colorcodered[2]; greenc = colorcodegreen[2]; bluec = colorcodeblue[2]; } else if(colorcode == 3) { redc = colorcodered[3]; greenc = colorcodegreen[3]; bluec = colorcodeblue[3]; } else if(colorcode == 4) { redc = colorcodered[4]; greenc = colorcodegreen[4]; bluec = colorcodeblue[4]; } else if(colorcode == 5) { redc = colorcodered[5]; greenc = colorcodegreen[5]; bluec = colorcodeblue[5]; } else if(colorcode == 6) { redc = colorcodered[6]; greenc = colorcodegreen[6]; bluec = colorcodeblue[6]; } else if(colorcode == 7) { redc = colorcodered[7]; greenc = colorcodegreen[7]; bluec = colorcodeblue[7]; } else if(colorcode == 8) { redc = colorcodered[8]; greenc = colorcodegreen[8]; bluec = colorcodeblue[8]; } if ((redc+shade) > 1.0f) { float scalecolor = (redc+shade) - 1.0f; redc-=scalecolor; } if ((greenc+shade) > 1.0f) { float scalecolor = (greenc+shade) - 1.0f; greenc-=scalecolor; } if ((bluec+shade) > 1.0f) { float scalecolor = (bluec+shade) - 1.0f; bluec-=scalecolor; } glColor3f(redc+shade,greenc+shade,bluec+shade); } |
Het ergste is nog wel dat in dezelfde source file nog 5 kopieën van deze functie staan, waarbij alleen de laatste paar regels iets anders zijn...
1
2
3
4
5
6
7
| void Color::colortransform(int colorcode,float shade) { glColor3f( std::min(colorcodered[colorcode]+shade, 1.f), std::min(colorcodegreen[colorcode]+shade, 1.f), std::min(colorcodeblue[colorcode]+shade, 1.f)); } |
Ik bedoel, hoe ingewikkeld ook
1
2
3
4
5
| if ((redc+shade) > 1.0f) { float scalecolor = (redc+shade) - 1.0f; redc-=scalecolor; } |
Als hij groter is dan 1, dan reken we uit hoeveel hij erover is gegaan, en dat trekken we er vanaf. Ja, drol, zet 'm dan gewoon op 1! En dan hebben we het nog niet eens over de compleet foute benaming van "scalecolor" (da's een bias, geen scale)
[ Voor 41% gewijzigd door .oisyn op 29-04-2010 11:57 ]
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.
Alleen nog even de check toevoegen dat colorcode tussen 0 en 8 moet zijn.oisyn schreef op donderdag 29 april 2010 @ 11:54:
Tjezus dat gaat echt nergens over. If I may...
C++:
1 2 3 4 5 6 7 void Color::colortransform(int colorcode,float shade) { glColor3f( std::min(colorcodered[colorcode]+shade, 1.f), std::min(colorcodegreen[colorcode]+shade, 1.f), std::min(colorcodeblue[colorcode]+shade, 1.f)); }
[ Voor 22% gewijzigd door .oisyn op 29-04-2010 12:25 ]
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 mag ik hopen.oisyn schreef op donderdag 29 april 2010 @ 12:23:
De code doet dan ook vermoeden dat colorcode altijd tussen 0 en 8 ligt.
Wellicht compileert dit tot iets wat sneller draait? Behalve het eind misschien. Ik kan me zo voorstellen dat dit compileert naat iets van constanten, aangezien er geen lookup in de array's gedaan wordt.d4nn7 schreef op donderdag 29 april 2010 @ 11:46:
Een tijdje terug kwam ik dit tegen:
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 void Color::colortransform(int colorcode,float shade) { float redc,greenc,bluec; if(colorcode == 0) { redc = colorcodered[0]; greenc = colorcodegreen[0]; bluec = colorcodeblue[0]; } else if(colorcode == 1) { redc = colorcodered[1]; greenc = colorcodegreen[1]; bluec = colorcodeblue[1]; } else if(colorcode == 2) { redc = colorcodered[2]; greenc = colorcodegreen[2]; bluec = colorcodeblue[2]; } else if(colorcode == 3) { redc = colorcodered[3]; greenc = colorcodegreen[3]; bluec = colorcodeblue[3]; } else if(colorcode == 4) { redc = colorcodered[4]; greenc = colorcodegreen[4]; bluec = colorcodeblue[4]; } else if(colorcode == 5) { redc = colorcodered[5]; greenc = colorcodegreen[5]; bluec = colorcodeblue[5]; } else if(colorcode == 6) { redc = colorcodered[6]; greenc = colorcodegreen[6]; bluec = colorcodeblue[6]; } else if(colorcode == 7) { redc = colorcodered[7]; greenc = colorcodegreen[7]; bluec = colorcodeblue[7]; } else if(colorcode == 8) { redc = colorcodered[8]; greenc = colorcodegreen[8]; bluec = colorcodeblue[8]; } if ((redc+shade) > 1.0f) { float scalecolor = (redc+shade) - 1.0f; redc-=scalecolor; } if ((greenc+shade) > 1.0f) { float scalecolor = (greenc+shade) - 1.0f; greenc-=scalecolor; } if ((bluec+shade) > 1.0f) { float scalecolor = (bluec+shade) - 1.0f; bluec-=scalecolor; } glColor3f(redc+shade,greenc+shade,bluec+shade); }
Het ergste is nog wel dat in dezelfde source file nog 5 kopieën van deze functie staan, waarbij alleen de laatste paar regels iets anders zijn...
blijft een beetje een vreemd gezicht en premature optimalisatie
Assumptions are the mother of all fuck ups | iRacing Profiel
Jij zier hier geen lookup in arrays?Salandur schreef op donderdag 29 april 2010 @ 12:53:
aangezien er geen lookup in de array's gedaan wordt.
1
2
3
4
5
6
| if(colorcode == 0) { redc = colorcodered[0]; greenc = colorcodegreen[0]; bluec = colorcodeblue[0]; } |
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 goede compiler vervangt de lookup misschien door een constante..oisyn schreef op donderdag 29 april 2010 @ 12:59:
[...]
Jij zier hier geen lookup in arrays?
C++:
1 2 3 4 5 6 if(colorcode == 0) { redc = colorcodered[0]; greenc = colorcodegreen[0]; bluec = colorcodeblue[0]; }
De zin had moeten zijn: 'dan worden er geen array lookups meer uitgevoerd'. Maar goed, ben niet zo heel erg thuis in C++ en compilers.
Assumptions are the mother of all fuck ups | iRacing Profiel
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
| char *texts[NUM_TEXT] = { (char*)"constant blabla", (char*)"blabla", (char*)"blabla, } |
Inderdaad doe het dan zo.oisyn schreef op donderdag 29 april 2010 @ 11:54:
En dan hebben we het nog niet eens over de compleet foute benaming van "scalecolor" (da's een bias, geen scale)
1
2
3
4
5
| if ((redc+shade) > 1.0f) { float scalecolor = 1.0f/(redc+shade); redc*=scalecolor; } |
Dan klopt de naamgeving wel
Al heeft de code dan niet hetzelfde resultaat
Ik bedoelde meer zoiets
1
2
3
4
5
6
7
| bluec += shade; if (bluec > 1.0f) { float scalecolor = 1.0f / bluec; bluec*=scalecolor; } glColor3f(redc,greenc,bluec); |
[ Voor 25% gewijzigd door Woy op 06-05-2010 15:04 ]
“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.”
Tja, een string literal is nou eenmaal impliciet converteerbaar naar char*, die warning is dus stukEddoH schreef op donderdag 06 mei 2010 @ 14:50:
Zucht......het vakkundig 'verhelpen' van een 'invalid conversion from char * to const char* .....' warning
C:
1 2 3 4 5 6 char *texts[NUM_TEXT] = { (char*)"constant blabla", (char*)"blabla", (char*)"blabla, }
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 moet dan ons land gaan besturen. Een WiP welke al publiekelijk is en nog net niet met Lorem Ipsum gevuld staat.
Kansloos!
If money talks then I'm a mime
If time is money then I'm out of time
staat ook nog mooi in hun verkiezingsprogramma:Matis schreef op vrijdag 07 mei 2010 @ 12:17:
Ik weet niet of het onder slechte programmeervoorbeelden valt, maar wat een slechte site: http://lijst17.nl/.....
7 mei 2010.
Voorlopige versie: Opmaak en voorblad worden nog binnen 48 uur onder
handen genomen...................
Het is ons een eer en genoegen om na ampel beraad
@hieronder over ampel, ai big failure van mijn kant uit, weer iets geleerd...
[ Voor 32% gewijzigd door korgakos op 07-05-2010 13:23 ]
Verwijderd
Een beetje student had het pas 8 Juni 23:59 opgeleverdVerwijderd schreef op vrijdag 07 mei 2010 @ 12:43:
Tsja. Het past wel bij studenten: dingen opleveren die eigenlijk nog helemaal niet af zijn
“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.”
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| Shared Function ReturnDagText(ByVal Datum As Date) As String Dim Maand As String Dim Result As String Select Case Datum.Month Case 1 Maand = "Januari" Case 2 Maand = "Februari" Case 3 Maand = "Maart" Case 4 Maand = "April" Case 5 Maand = "Mei" Case 6 Maand = "Juni" Case 7 Maand = "Juli" Case 8 Maand = "Augustus" Case 9 Maand = "September" Case 10 Maand = "Oktober" Case 11 Maand = "November" Case 12 Maand = "December" End Select Dim Dag As String Select Case Datum.DayOfWeek Case DayOfWeek.Monday Dag = "Maandag" Case DayOfWeek.Tuesday Dag = "Dinsdag" Case DayOfWeek.Wednesday Dag = "Woensdag" Case DayOfWeek.Thursday Dag = "Donderdag" Case DayOfWeek.Friday Dag = "Vrijdag" Case DayOfWeek.Saturday Dag = "Zaterdag" Case DayOfWeek.Sunday Dag = "Zondag" End Select Result = Dag & " " & Datum.Day & " " & Maand & " " & Datum.Year Return Result End Function |
De code werd verder nergens meer gebruikt, maar altijd mooi om te zien hoe dom ik toen bezig was.
Zolang het maar minimaal een 5,6 oplevert jaWoy schreef op vrijdag 07 mei 2010 @ 12:48:
( Of liever nog later )
Ik ben nooit geen studiepikkie geweest ofzo, maar alles <6.5 voelde voor mij altijd al als een onvoldoende
[ Voor 37% gewijzigd door RobIII op 07-05-2010 13:22 ]
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
Leuk plaatje ook bij Legaal maken van Softdrugs:Matis schreef op vrijdag 07 mei 2010 @ 12:17:
Ik weet niet of het onder slechte programmeervoorbeelden valt, maar wat een slechte site: http://lijst17.nl/
Dat moet dan ons land gaan besturen. Een WiP welke al publiekelijk is en nog net niet met Lorem Ipsum gevuld staat.
Kansloos!
Ziet er vooral positief uit, doen!
Verwijderd
Er is inderdaad altijd nog de herkansing!Woy schreef op vrijdag 07 mei 2010 @ 12:48:
[...]
Een beetje student had het pas 8 Juni 23:59 opgeleverd( Of liever nog later )
Goed, voorzover mijn OT-bijdrage.
Verwijderd
Kan volgens mij wel handig zijn als je dag- en maandnamen onafhankelijk van locale-settings wilt gebruiken. Ik heb althans nog nooit een mogelijkheid gevonden om in VBA in de formattering te specificeren dat het resultaat altijd in een specifieke taal (NL) moet zijn. Weet niet of dat in VB.Net wel wordt ondersteund?Verwijderd schreef op vrijdag 07 mei 2010 @ 13:18:
Kwam deze laatst tegen toen ik een site van asp.net 1.1 naar asp.net 3.5 aan het omzetten was. Ik had toen volgens mij nog nooit gehoord van dingen als datetime formats.
Visual Basic .NET:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 Shared Function ReturnDagText(ByVal Datum As Date) As String Dim Maand As String Dim Result As String Select Case Datum.Month Case 1 Maand = "Januari" Case 2 Maand = "Februari" Case 3 Maand = "Maart" Case 4 Maand = "April" Case 5 Maand = "Mei" Case 6 Maand = "Juni" Case 7 Maand = "Juli" Case 8 Maand = "Augustus" Case 9 Maand = "September" Case 10 Maand = "Oktober" Case 11 Maand = "November" Case 12 Maand = "December" End Select Dim Dag As String Select Case Datum.DayOfWeek Case DayOfWeek.Monday Dag = "Maandag" Case DayOfWeek.Tuesday Dag = "Dinsdag" Case DayOfWeek.Wednesday Dag = "Woensdag" Case DayOfWeek.Thursday Dag = "Donderdag" Case DayOfWeek.Friday Dag = "Vrijdag" Case DayOfWeek.Saturday Dag = "Zaterdag" Case DayOfWeek.Sunday Dag = "Zondag" End Select Result = Dag & " " & Datum.Day & " " & Maand & " " & Datum.Year Return Result End Function
De code werd verder nergens meer gebruikt, maar altijd mooi om te zien hoe dom ik toen bezig was.
Dat wordt ondersteund jaVerwijderd schreef op vrijdag 07 mei 2010 @ 14:07:
Weet niet of dat in VB.Net wel wordt ondersteund?
[ Voor 20% gewijzigd door RobIII op 07-05-2010 14:12 ]
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
Verwijderd
Ze staat gewoon een sigaret of joint te roken...CyCloneNL schreef op vrijdag 07 mei 2010 @ 13:36:
[...]
Leuk plaatje ook bij Legaal maken van Softdrugs:
[afbeelding]
Ziet er vooral positief uit, doen!
Ach, zo erg is dat nog niet. Het doet tenminste zijn werk goed. De kans dat we op termijn de dagen een andere naam gaan geven is zo groot nog niet. Hier zit ik met een stuk code waar men van allerlei datatypes door elkaar gebruikt, met een boel errors als gevolg. Veel smeriger.Verwijderd schreef op vrijdag 07 mei 2010 @ 13:18:
Kwam deze laatst tegen toen ik een site van asp.net 1.1 naar asp.net 3.5 aan het omzetten was. Ik had toen volgens mij nog nooit gehoord van dingen als datetime formats.
Visual Basic .NET:
1.....
De code werd verder nergens meer gebruikt, maar altijd mooi om te zien hoe dom ik toen bezig was.
http://hawvie.deviantart.com/
Datatypes datatypes.. Je moet niet zo in hokjes denken joh!HawVer schreef op vrijdag 07 mei 2010 @ 15:06:
[...]
Ach, zo erg is dat nog niet. Het doet tenminste zijn werk goed. De kans dat we op termijn de dagen een andere naam gaan geven is zo groot nog niet. Hier zit ik met een stuk code waar men van allerlei datatypes door elkaar gebruikt, met een boel errors als gevolg. Veel smeriger.
(volgens mij denken heel veel PHPers wel op die manier helaas.. En veel C#-ers denken alsnog zo, maar dan wanneer het aankomt op de semantiek van een datatype)
IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;
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.