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.
Ja, dat was idd een leuke verrassing nadat ik de code had ge-copy/paste....oisyn schreef op vrijdag 11 juli 2008 @ 17:00:
Ik mag trouwens hopen dat in die code E iig wel een gedefinieerde copy ctor had die óók de counter ophoogt, itt wat hier in de topic staat.
Is ook de reden waarom ik óf geen enorme resoluties gebruik, óf de standaard lettertypen van code aanpas naar een groter font en alles op bold. Is een stuk leesbaarder. Kan ook zijn dat ik een bril nodig heb of teveel naar beeldschermen staar. Overigens is het limiteren van de hoeveelheid code die je in de breedte zelf kunt zien ook handig om die breedte in te perken, om zo onleesbare structuren of te diepe nestings te voorkomen.Hydra schreef op vrijdag 11 juli 2008 @ 16:35:
[...]
Dat vond ik dus ook. Op 1920x1200 zie je die puntkomma's nauwelijks.
En ik vraag mijzelf ook af waardoor compilers dat soort structuren (ifs afgesloten met puntkomma's) nog goedkeuren. Oké, het is verder geen vreemde structuur (de basisregels van de grammatica van een programmeertaal zijn immers meestal eenvoudig), maar functioneel doet het niks. Op z'n minst zou ik een warning verwachten.
YopY schreef op vrijdag 11 juli 2008 @ 20:33:
En ik vraag mijzelf ook af waardoor compilers dat soort structuren (ifs afgesloten met puntkomma's) nog goedkeuren.
1>.\main.cpp(51) : warning C4390: ';' : empty controlled statement found; is this the intent?
Besteed een keer een halve vrijdag aan het zoeken en kiezen van een goed coding font, bijvoorbeeld Bitstream Vera Sans Mono of ProFont ofzo. Dat zal een boel schelen.Hydra schreef op vrijdag 11 juli 2008 @ 16:35:
[...]
Dat vond ik dus ook. Op 1920x1200 zie je die puntkomma's nauwelijks. Pas toen ik dat stuk code teruggebracht had naar if(false); {} en hij nog steeds het stuk tussen accolades uitvoerde viel me opeens op dat er een puntkomma stond. Een collega zag 'em ook niet.
Tja. Vrijdagen
En over die puntcomma, het gebeurd je waarschijnlijk maar 1x in je leven dat je er een vrijdag aan kwijtraakt. De volgende keer is het een dinsdag.
[ Voor 4% gewijzigd door DaCoTa op 12-07-2008 01:08 ]
En de fout niet gevonden!
1
2
3
4
5
6
7
8
9
10
11
12
| function url_werkt_niet($key,$value) { $params = array($key=>$value); # Combine parameters $params = array_merge($_GET,$params); # Merge all parameters, dupes are overwriten $params_arr = array(); foreach($params as $key=>$value ); { $params_arr[] = $key.'='.urlencode($value); } return '?' . implode('&',$params_arr); } |
Ik had er een topic voor geopend:
[php] foreach ..?
Zelf dacht ik echt dat er een probleem was met de interne pointer ofzo. Dit geeft , wat ook logisch is, namelijk geen enkele foutmelding.
Uiteraard als de fout eenmaal is gevonden dan kan je makkelijk zeggen dat dit forumbevuiling is. Toch wil ik de mensen danken die me hebben beantwoord.
BTW: Ook vrijdag morge.. is dit toeval of heeft dit te maken met EM-golven die uit het heelal de atmosfeer van de aarde binnendringen of iets als telepathie lolz
[ Voor 26% gewijzigd door g4wx3 op 12-07-2008 09:21 ]
achter je foreach staat ie ...
als je gewoon je code regel per regel naleest zie je die toch staan ?
(of ne search en dan next ...
ps: daar is dit topic niet echt voor bedoeld, maar anderzijds ook een leuk voorbeeld
en in je vorig topic wordt het ook al 2x gezegd ... lezend begrijpen begrijpend lezen aub...
ik zet in PHP en andere talen waar nodig de '{' altijd vlak achter de if, foreach, while-voorwaarde ter voorkoming dat ik er ook puntcomma's tussen zet. code wordt mss iets minder duidelijk, maar daar gebruik ik dan indents voor.
//edit: zelf nog niet wakker: sorry boven- en onderbuur
[ Voor 66% gewijzigd door soulrider op 12-07-2008 11:50 ]
Begrijpend lezen leert je dat g4wx3 de fout inmiddels al door had.soulrider schreef op zaterdag 12 juli 2008 @ 11:37:
en in je vorig topic wordt het ook al 2x gezegd ... lezend begrijpen aub...
{signature}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php if($blah == "nee") { echo "Blah is hetzelfde als nee!"; } else if($blah == "ja") { echo "Blah is hetzelfde als ja!"; } else { echo "Praat gewoon niet."; } function mooie_functie($begin, $eind) { return $begin." ".$eind; } echo mooie_functie("Hallo", "Doei"); ?> |
Je snapt wel dat dit een onzin voorbeeld is, maar gewoon om te laten zien hoe een beetje mijn stijl is. Ik zie tegenwoordig steeds meer dingen als
if()
{
//bla
}
else
{
Dat vind ik pas onoverzichtelijk. Of dingen als:
}
else {
Dat snap ik dan ook niet.
Uiteraard, maar daarom zeg ik ook specifieke accolade stijl. Alhoewel indenting daar natuurlijk sterk aan gerelateerd is. Maar ik wou het niet voer álle stijl regels hebben, want sommige stijlen zijn gewoon wel foutgevoelig en compleet k*t.
[ Voor 30% gewijzigd door Voutloos op 12-07-2008 12:47 ]
{signature}
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
Nu zet ik accolades op de zelfde hoogte, het behoort samen, dus moet het op de zelfde intend staan. Daarnaast creeert het meer witruimte, waardoor compacte programmercode veel aangenamer te lezen is.
Verder maak ik me niet druk wat een stijl iemand gebruikt, wel kan ik van de stijl *soms* afleiden hoe profesioneel een programma is.
een goed begin vind je hier:
http://www.evolt.org/arti...lines/18/60247/index.html
en hier helemaal uitgebreid: (EDIT: bij nader inzien niet wat ik verwachte...)
http://ludit.kuleuven.be/pahupa/
(ik heb er toch veel van opgestoken)
helaas doe ik volgens het boekje nog veel fout, zoals tabs ipv spaties, variablen zijn onduidelijk (willekeurig zelfs) en nog meer "slechte" dingen. Maar aan de andere kant blijft het een eeuwige discusie spaties - tabs ed.
Toch is het voor iedereen intressant om een stijlcursus te lezen.
EDIT: Een halfuur gezocht naar deze stijlcursussen...
[ Voor 6% gewijzigd door g4wx3 op 12-07-2008 13:08 ]
Als een collega dat tegen jou zegt is er geen consistente stijl, dus is er een probleem. Wie er bijdraait maakt op zicht niet heel veel uit, alhoewel het toch ook niet complete rocket science moet zijn om een tab breedte te wijzigen.Niekk schreef op zaterdag 12 juli 2008 @ 12:48:
WAAROM? TAB IS VEEL HANDIGER? hoor ik dan altijd meteen. Dit komt omdat ik veel via vi(m) moet doen.
Generaliserende halve waarheid: Dan is die functie te groot.waar al 5 keer is ingesprongen, met tabs ipv 4 spaces, dan loopt dat al over 2 regels.
{signature}
of je doet :set ts=4Niekk schreef op zaterdag 12 juli 2008 @ 12:48:
inderdaad. Daar heb ik ook een hekel aan, mensen die niet inspringenpersoonlijk spring ik in met 4 spaties. (in mijn editor ingesteld als tab). WAAROM? TAB IS VEEL HANDIGER? hoor ik dan altijd meteen. Dit komt omdat ik veel via vi(m) moet doen. En een tab is daar echt huge. als ik dan in een groot stuk code zit, waar al 5 keer is ingesprongen, met tabs ipv 4 spaces, dan loopt dat al over 2 regels.
De echte WTF is hier denk ik toch wel het niet gebruiken van http_build_query()...g4wx3 schreef op zaterdag 12 juli 2008 @ 09:14:
ik had hetzelfde probleem met een stomme punt komma.
En de fout niet gevonden!
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 function url_werkt_niet($key,$value) { $params = array($key=>$value); # Combine parameters $params = array_merge($_GET,$params); # Merge all parameters, dupes are overwriten $params_arr = array(); foreach($params as $key=>$value ); { $params_arr[] = $key.'='.urlencode($value); } return '?' . implode('&',$params_arr); }
Ik had er een topic voor geopend:
[php] foreach ..?
Zelf dacht ik echt dat er een probleem was met de interne pointer ofzo. Dit geeft , wat ook logisch is, namelijk geen enkele foutmelding.
Uiteraard als de fout eenmaal is gevonden dan kan je makkelijk zeggen dat dit forumbevuiling is. Toch wil ik de mensen danken die me hebben beantwoord.
BTW: Ook vrijdag morge.. is dit toeval of heeft dit te maken met EM-golven die uit het heelal de atmosfeer van de aarde binnendringen of iets als telepathie lolz
Zo kan je die code hierboven namelijk ombouwen naar:
1
2
3
4
| function url_werkt_niet($key,$value) { return http_build_query(array_merge($_GET, array($key=>$value)), null, '&'); } |
En die ? zet je er natuurlijk buiten de url_werkt_niet() functie voor.
[ Voor 9% gewijzigd door Tanuki op 12-07-2008 13:14 ]
PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?
klopt, maar wel onhandig als je op tig verschillende systemen werkt. dan is het makkelijker vind ik om op mijn desktop in Anjuta (voor C) in te stellen dat mijn tab knop 4 spaties genereerd, en als ik op backspace klik ze ook allemaal weg gaan. Als die files dan later naar SVN geschreven worden, heb ik dat probleem niet meer.R_W schreef op zaterdag 12 juli 2008 @ 12:56:
Tabbreedte is gewoon in te stellen in Vim.
Wil hier nu geen discussie om gaan beginnen, maar de meeste programmeren op die tweede manier omdat het dan minder in een blok samenkleeft en er meer nadruk is op de condities. Maar niet iedereen leest de code op dezelfde manier (leuk om dat te bestuderenNiekk schreef op zaterdag 12 juli 2008 @ 12:18:
Misschien een kleine offtopic, maar wordt deze manier van programmeren dan als "onduidelijk" beschouwd ? Ik programmeer zoals weinig mensen doen, maar vind het wel lekker werken.
1
2
3
4
5
6
7
8
9
10
11
12
13
| void bla(int i) { // "Functies" op deze manier } int main() { if() { while(true) { en if's en while's weer zo. (en dan dus ook for etc, en ook } else {) } } } |
[ Voor 3% gewijzigd door Niekk op 12-07-2008 13:28 ]
Verwijderd
Dus omdat hij een blijkbaar bestaande functie aan het herschrijven is, waar hij wellicht nog iets van opsteekt ook, is het gelijk foutl0c4lh0st schreef op zaterdag 12 juli 2008 @ 13:07:
[...]
De echte WTF is hier denk ik toch wel het niet gebruiken van http_build_query()...
Zo kan je die code hierboven namelijk ombouwen naar:
PHP:
1 2 3 4 function url_werkt_niet($key,$value) { return http_build_query(array_merge($_GET, array($key=>$value)), null, '&'); }
En die ? zet je er natuurlijk buiten de url_werkt_niet() functie voor.
Dat het dubbel werk is ben ik met je eens, maar niet per definitie fout.
Verwijderd
Deze is zelfs, uiteraard in een iets andere vorm, ooit eens ingeschoten als bug in de java runtimeg4wx3 schreef op zaterdag 12 juli 2008 @ 09:14:
foreach($params as $key=>$value );
{
$params_arr[] = $key.'='.urlencode($value);
}
[/code]
.. ?Verwijderd schreef op zaterdag 12 juli 2008 @ 18:04:
[...]
Deze is zelfs, uiteraard in een iets andere vorm, ooit eens ingeschoten als bug in de java runtimeJe bent dus lang niet de enige die een dergelijke fout ooit eens heeft gemaakt
Dat stukje was PHP, dus waarom praat jij dan over JAVA? Ik volg het even niet meer.
Hij geeft aan dat zulke fouten vaker voorkomen, bijvoorbeeld in Java.Niekk schreef op zaterdag 12 juli 2008 @ 19:56:
[...]
.. ?
Dat stukje was PHP, dus waarom praat jij dan over JAVA? Ik volg het even niet meer.
Het valt me op dat do..while loops weinig gebruikt worden. Dan zie je zoiets:
1
2
3
4
5
6
7
| /* skip header */ string line; line = file.readLine(); while (isHeader(line)) { line = file.readLine(); } |
Met een do..while zonder code duplicatie:
1
2
3
4
5
| /* skip header */ string line; do { line = file.readLine(); } while (isHeader(line)); |
Verwijderd
Ik heb er mijn allereerste C# (e)book nog eens op nageslagen (het eerste boek waaruit wij op het HBO programmeerles kregen), daarin zie je ook alleen de eerste constructie terug.
In het volgende boek staat deze constructie wel, maar dan slaan we de basis natuurlijk over...waardoor de meeste studenten het dus alsnog niet leren kennen.
[ Voor 28% gewijzigd door Verwijderd op 12-07-2008 20:45 ]
Kater? Eerst water, de rest komt later
Zie dit nog wel regelmatig, is ook geleerd tijdens programeren met C++, While is voorwaarde controle vooraf, DoWhile is voorwaarde controle achterafJanDM schreef op zaterdag 12 juli 2008 @ 20:37:
[...]
Hij geeft aan dat zulke fouten vaker voorkomen, bijvoorbeeld in Java.
Het valt me op dat do..while loops weinig gebruikt worden. Dan zie je zoiets:
C++:
1 2 3 4 5 6 7 /* skip header */ string line; line = file.readLine(); while (isHeader(line)) { line = file.readLine(); }
Met een do..while zonder code duplicatie:
C++:
1 2 3 4 5 /* skip header */ string line; do { line = file.readLine(); } while (isHeader(line));
1
2
3
4
5
6
7
8
9
10
| do { foo(); } while (conditie); == while (true) { foo(); if (!conditie) break; } |
[ Voor 45% gewijzigd door Chip. op 12-07-2008 21:50 ]
ook heb ik de switch graag:
Dit stukje komt uit het eerste bestand dat ik open had staan:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| <?php switch (true) { case isset($_POST['delete']): $query = 'DELETE FROM `store` WHERE `id` = '.$productid.' LIMIT 1;'; $db->query($query); break; case isset($_POST['update']): $query = 'SELECT * FROM `store` WHERE id='.$productid.' LIMIT 1;'; $db->query($query); $product = $db->fetch(); $title = $product['title']; $description = $product['description']; $ref = $product['ref']; $price = $product['price']; include('resources/apps/store/product_p1.php'); break; } ?> |
Zoiets kan dus ook met if, of if elseif, maar ik vind het overzichtelijker, en flexibeler zo.
[ Voor 4% gewijzigd door g4wx3 op 12-07-2008 22:40 ]
Verwijderd
1
2
| switch (string.charAt(index)) { } |
Maar jou ding: Wat als zowel update als delete is gezet <gerommel met input waarschijnlijk>, maar toch. Vind dit nou juist niet overzichtelijker en flexibeler dan ifs.
Enige keren dat ik een switch gebruik is wanneer meerdere condities dezelfde uitvoer moeten geven, voor de rest altijd elseif's. Als je dan een accolade vergeet heb je tenminste nog een parse-error
[ Voor 12% gewijzigd door frickY op 12-07-2008 23:22 ]
Verwijderd
Ik vind het vreselijk.g4wx3 schreef op zaterdag 12 juli 2008 @ 22:36:
hmm, ik heb waarschijnlijk een eigenaardige hersenkronkel, maar maak wel graag gebruik vaak do-while, op gepast moment uiteraard.
ook heb ik de switch graag:
Dit stukje komt uit het eerste bestand dat ik open had staan:
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php switch (true) { case isset($_POST['delete']): $query = 'DELETE FROM `store` WHERE `id` = '.$productid.' LIMIT 1;'; $db->query($query); break; case isset($_POST['update']): $query = 'SELECT * FROM `store` WHERE id='.$productid.' LIMIT 1;'; $db->query($query); $product = $db->fetch(); $title = $product['title']; $description = $product['description']; $ref = $product['ref']; $price = $product['price']; include('resources/apps/store/product_p1.php'); break; } ?>
Zoiets kan dus ook met if, of if elseif, maar ik vind het overzichtelijker, en flexibeler zo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php // ... if ( $contract= $model->contract->getRecordById ( $request->contract_id ) ) ) { switch ( $request->action ) { case 'edit': $this->handleEditRequest ( $request, $contract ); break; case 'resign': $this->handleResignRequest ( $request, $contract ); break; } } // ... ?> |
Beter nog (want weg is je switch):
1
2
3
4
5
6
7
8
9
10
| <?php // ... if ( $contract= $model->contract->getRecordById ( $request->contract_id ) ) ) { call_user_func ( array ( $this, sprintf ( 'handle%sRequest', convert::dash2camel ( $request->action ) ) ), array ( $request, $contract ) ); } // ... ?> |
En dan natuurlijk functies als:
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
| <?php // ... /** * Blah blah * * @param Request $request The request object that is to be handled. * @param ContractRecord $contract The contract object that is to be resigned if possible. * @return boolean TRUE if the contract could be resigned, FALSE otherwise. */ public function handleResignRequest ( Request $request, ContractRecord $contract ) { $model = $this->getModel (); $view = $this->getView (); if ( $result = $contract->resign ( $model, $request->resign_date ) ) { $message = "Het contract is opgezegd per %s."; } else { $message = "Het contract kan pas worden opgezegd per %s."; } $view->message = sprintf ( nls::translate ( $message ), $contract->getDisplayValue ( $contract->entity->resign_date ) ); return $result; } // ... ?> |
Iets dergelijks is een stuk eleganter dan overal strooien met mysql_query, $db->query, $_POST en allerlei low-level stuff. Daar wil je je op applicatieniveau toch helemaal niet meer mee bezighouden? Uiteraard was dit even snel ingeklopte code, maar het gaat om het idee.
1
2
3
| int nice_stuff(int i, int j) { /* deze line bedoel ik dan */ return i + j; } |
maar kent PHP dat ? want PHP is een taal zonder types, toch ?!
[ Voor 6% gewijzigd door Niekk op 13-07-2008 11:45 ]
Sinds PHP5 kan je opgeven of parameters arrays of objecten zijn. De andere standaard types kan je stupide genoeg nog niets mee.Niekk schreef op zondag 13 juli 2008 @ 11:35:
maar kent PHP dat ? want PHP is een taal zonder types, toch ?!
Verder kent PHP wél types en kan je wél casten. Anders is de conversie tussen standaard types automagisch, maar die is vaak genoeg ongewenst (string '123abc' wordt int 123

[ Voor 3% gewijzigd door Voutloos op 13-07-2008 11:46 ]
{signature}
In PHP:
Hoeveel is 'appel' + 'peer'? Antwoord: 0.
Hoeveel is 'appel' + '42'? Antwoord: 42.
Hoeveel is 'appel' + 42? Antwoord: 42.
In Python:
1
2
3
4
5
6
7
8
| >>> 'appel' + 'peer' 'appelpeer' >>> 'appel' + '42' 'appel42' >>> 'appel' + 42 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects |
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
Verwijderd
Numeriek optellen: +
Concat strings: .
In alle overige genoemde talen hangt het dus van de objecten links en rechts van de + af wat er gebeurt, en wanneer er geen match gevonden wordt krijg je een exception.
Bij PHP gaat ie gewoon alles op proberen te tellen

{signature}
Klopt. Ik vind dat PHP een taal zou moeten zijn die zich wel eits aantrekt van types. Dit voorkomt zoveel fouten. je kan opgeven of iets een array of object moet zijn, maar dit vind ik nutteloos. Waarom niet int vs string o.i.d. ? Dat is juist waar PHP "moeite" mee heeft. (zoals dat 123 voorbeeld dat je gaf)Voutloos schreef op zondag 13 juli 2008 @ 11:46:
[...]
Sinds PHP5 kan je opgeven of parameters arrays of objecten zijn. De andere standaard types kan je stupide genoeg nog niets mee.
Verder kent PHP wél types en kan je wél casten. Anders is de conversie tussen standaard types automagisch, maar die is vaak genoeg ongewenst (string '123abc' wordt int 123). Anyway, ga je mond spoelen en lees het hoofdstuk over data types nog een keer.
{signature}
je hebt wel gelijk, ik moet zeggen dat ik er niet zo erg veel last van heb. Maar 't is niet goed vind ik.Voutloos schreef op zondag 13 juli 2008 @ 13:00:
Het is halfbakken en het voorkomt hiipe features als method overloading. Het string '123abc' is natuurlijk net zo geforceerd als wat ik in voorgaande post zei.
In deze lijn kan ook snel de volgende fout gemaakt worden:Jaap-Jan schreef op zondag 13 juli 2008 @ 12:10:
Leuke vergelijking:
In PHP:
Hoeveel is 'appel' + 'peer'? Antwoord: 0.
Hoeveel is 'appel' + '42'? Antwoord: 42.
Hoeveel is 'appel' + 42? Antwoord: 42.
In Python:
code:Ik weet wel wat ik logischer vind.
1 2 3 4 5 6 7 8 >>> 'appel' + 'peer' 'appelpeer' >>> 'appel' + '42' 'appel42' >>> 'appel' + 42 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects
1
2
3
4
5
6
7
| <?php if (0 == "") { echo "This is wrong!"; } ?> |
Dan vergeet je voor het gemak dat PHP een string concatenation operator heeft?Jaap-Jan schreef op zondag 13 juli 2008 @ 12:10:
Leuke vergelijking:
In PHP:
Hoeveel is 'appel' + 'peer'? Antwoord: 0.
Hoeveel is 'appel' + '42'? Antwoord: 42.
Hoeveel is 'appel' + 42? Antwoord: 42.
In Python:
code:Ik weet wel wat ik logischer vind.
1 2 3 4 5 6 7 8 >>> 'appel' + 'peer' 'appelpeer' >>> 'appel' + '42' 'appel42' >>> 'appel' + 42 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects
En je laat het leukste voorbeeld weg
1
| echo "40 appels" + "50 peren"; |
Geeft 90
[ Voor 4% gewijzigd door Creepy op 13-07-2008 14:13 ]
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
Ik heb er opzich geen last van, maar vind het wel een onlogica dat je appelen en peren (zogezegd) bij elkaar kan optellen, dat zou een fout moeten geven, net als if('1'==1) false zou moeten returnen. Dan weet je pas of je programma zonder flaws is geschreven
@hierboven HAHAHA, die is geweldig!
[ Voor 24% gewijzigd door g4wx3 op 13-07-2008 14:24 ]
Stuks fruit natuurlijk
More than meets the eye
There is no I in TEAM... but there is ME
system specs
Iedereen weet dat de peer de tegenpool is van de appel. Het antwoord dat PHP dus geeft is dus fout. Het juiste antwoord moet zijn: "10 peren".Creepy schreef op zondag 13 juli 2008 @ 14:12:
En je laat het leukste voorbeeld weg
PHP:
1 echo "40 appels" + "50 peren";
Geeft 90
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Officiele C regels? Kom op zegNiekk schreef op zaterdag 12 juli 2008 @ 13:28:
de officiele regels voor C zijn nog raarder vind ik.
Nee, dat is het niet. Een continue in de loop zal in het eerste geval conditie opnieuw checken, maar in het tweede geval niet.Wouser schreef op zaterdag 12 juli 2008 @ 21:48:
Inderdaad daarmee verzorg je dus dat je code na do { altijd 1x word uitgevoerd. Maar do while loop is ook equivalent aan:
C++:
1 2 3 4 5 6 7 8 9 10 do { foo(); } while (conditie); == while (true) { foo(); if (!conditie) break; }
Ik vind dat allesbehalve beter. Als er een keer een foute waarde in $request->action staat ben je de sjaak (zeker als die foute waarde toevallig ook nog eens resulteert in een daadwerkelijke functie). Met een switch is je code duidelijker en veiliger.Verwijderd schreef op zaterdag 12 juli 2008 @ 23:59:
Beter nog (want weg is je switch):
PHP:
1 2 3 4 5 6 7 8 <?php // ... if ( $contract= $model->contract->getRecordById ( $request->contract_id ) ) ) { call_user_func ( array ( $this, sprintf ( 'handle%sRequest', convert::dash2camel ( $request->action ) ) ), array ( $request, $contract ) ); }
Als je dat wilt dan kun je === en !== gebruiken - die controleert ook of de typen overeen komen. Op zich vind ik het niet raar dat "1"==1 gelijk is aan true. Ik vind het wel raar dat "boom" == 0 gelijk is aan true.g4wx3 schreef op zondag 13 juli 2008 @ 14:21:
Ik heb er opzich geen last van, maar vind het wel een onlogica dat je appelen en peren (zogezegd) bij elkaar kan optellen, dat zou een fout moeten geven, net als if('1'==1) false zou moeten returnen. Dan weet je pas of je programma zonder flaws is geschreven
[ Voor 97% gewijzigd door .oisyn op 13-07-2008 17:32 ]
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.
ok, de benaming "officiele" was misschien ietsje overdreven, maar ik verwees hiermee inderdaad naar K&R. Dit wordt door de meeste programmeurs tochwel als "de standaard" gezien. (ikzelf houd me er ook niet aan.oisyn schreef op zondag 13 juli 2008 @ 17:18:
[...]
Officiele C regels? Kom op zeg. Er is K&R style, maar er zijn geen officiele regels voor C.
Sterker nog, wat is de uitkomst van deze expressie:fleppuhstein schreef op zondag 13 juli 2008 @ 13:58:
[...]
In deze lijn kan ook snel de volgende fout gemaakt worden:
PHP:
1 2 3 4 5 6 7 <?php if (0 == "") { echo "This is wrong!"; } ?>
1
| in_array("hello", array(0,1,2)); |
Dit is een (versimpelde) versie van wat wij vandaag tegenkwamen in een stuk code. In PHP gaat dit dus compleet mis:
1
2
| 0 == "hi"; 0 == "test"; |
1
2
3
4
5
6
7
| iAantalArchief = 0 while oRS.Eof=false if oRS.EOF=false then iAantalArchief=iAantalArchief+1 end if oRs.MoveNext wend |
Het RecordSet hierboven wordt gevuld door deze SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| if (@iTabsel=1) begin select MeldingID, Datum, Omschrijving, Notitie, tblMeldingType.Type, AntwoordOpMelding, tblGebruikers.VolledigeNaam, ObjectType, ObjectID, tblMelding.Datum_ingevoerd from ((tblMelding left join tblMeldingType on tblMelding.MeldingType = tblMeldingType.MeldingTypeID) left join tblGebruikers on tblMelding.Gebruiker_Ingevoerd=tblGebruikers.GebruikerID) join tblMeldingOntvanger on tblMelding.MeldingID=tblMeldingOntvanger.Melding where tblMelding.AntwoordOpMelding is null and tblMelding.Datum_Verwijderd is null and tblMelding.KlantID=@iKlantID and tblMeldingOntvanger.Gebruiker=@iGebruikerID and not (tblMeldingOntvanger.Gelezen is null) and getdate()>=tblMelding.Datum order by tblMelding.Datum_ingevoerd DESC, omschrijving end else begin SELECT tblMelding.MeldingID, tblMelding.Datum, tblMelding.Omschrijving, tblMelding.Notitie, tblMeldingType.Type, tblMelding.AntwoordOpMelding, tblGebruikers.VolledigeNaam, tblMelding.ObjectType, tblMelding.ObjectID, tblMelding.Datum_Ingevoerd FROM tblMelding LEFT OUTER JOIN tblGebruikers ON tblMelding.Gebruiker_Ingevoerd = tblGebruikers.GebruikerID LEFT OUTER JOIN tblMeldingType ON tblMelding.MeldingType = tblMeldingType.MeldingTypeID WHERE (tblMelding.Gebruiker_Ingevoerd = @iGebruikerID) AND (tblMelding.KlantID = @iKlantID) AND (tblMelding.AntwoordOpMelding IS NULL) and (getdate()>=tblMelding.Datum) order by tblMelding.Datum_ingevoerd DESC, omschrijving end |
Heeft blijkbaar nog nooit van een COUNT gehoord
En ook deze (Kon 'm zo snel niet meer vinden, maar het kwam hierop neer):
1
2
3
4
5
| while (conditie<10) if (conditie<10) then 'code hier end if wend |

"Military intelligence is a contradiction in terms." - Groucho Marx, American Comedian, Actor and Singer, 1890-1977
Tja mischie heeft na de controle in de while een andere thread conditie wel veranderdYeroon1986 schreef op dinsdag 15 juli 2008 @ 15:00:
Visual Basic:
1 2 3 4 5 while (conditie<10) if (conditie<10) then 'code hier end if wend
“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.”
Dan zou die thread dat ook na de if controle kunnen doenrwb schreef op dinsdag 15 juli 2008 @ 16:22:
[...]
Tja mischie heeft na de controle in de while een andere thread conditie wel veranderd
[ Voor 6% gewijzigd door Zyppora op 15-07-2008 16:44 ]
Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290
Als er verder niets meer met condition gebeurt, heb je ook een mooie endless loop
Kater? Eerst water, de rest komt later
Verwijderd
Niet al binnen die loop wordt gewacht op input of als de loop wordt gebroken op een bepaalde value van de conditie of wat dan ook. Hoe vaak ik al nietHaan schreef op dinsdag 15 juli 2008 @ 17:04:
[...]
Als er verder niets meer met condition gebeurt, heb je ook een mooie endless loop
1
2
3
4
5
| while True: if condition == 0: break if condition == 1: continue |
Heb meegemaakt
-- edit
goedemorgen, als er inderdaad niks mee gebeurd is ie endless
[ Voor 20% gewijzigd door Verwijderd op 15-07-2008 17:11 ]
Dat voorbeeld is imho ook vrij ranzige codeVerwijderd schreef op dinsdag 15 juli 2008 @ 17:08:
[...]
Niet al binnen die loop wordt gewacht op input of als de loop wordt gebroken op een bepaalde value van de conditie of wat dan ook. Hoe vaak ik al niet
code:
1 2 3 4 5 while True: if condition == 0: break if condition == 1: continue
Heb meegemaaktDaarbij kan de loop gebroken worden met een exception of andersoortige interventie. Als dit binnen een thread draait kan de thread gewoon gesloten worden etc etc etc.
Kater? Eerst water, de rest komt later
Ach als er wel thread gebruikt werden zou het nog net zo fout zijn.Yeroon1986 schreef op woensdag 16 juli 2008 @ 09:07:
haha, er worden geen threads gebruikt. Bestaat ook niet in ASP (VBscript dus) voor zover ik weet! In de while-loop wordt wel wat met die conditite gedaan, Ik liet het voorbeeld zien om dat er een dubbele check werd gedaan die volstrekt overbodig is.
“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.”
Wat denk je dat hier uit komt?chris schreef op maandag 14 juli 2008 @ 15:32:
[...]
Sterker nog, wat is de uitkomst van deze expressie:
PHP:
1 in_array("hello", array(0,1,2));
Dit is een (versimpelde) versie van wat wij vandaag tegenkwamen in een stuk code. In PHP gaat dit dus compleet mis:
PHP:
1 2 0 == "hi"; 0 == "test";
1
| in_array("hello", array(0,1,2), true); |
1
2
3
4
5
6
7
8
| if (tblZoek.Visible == false) { // Doe iets } else if (tblZoek.Visible == true) { // Doe iets anders } |
1
2
3
4
5
| if (!tblZoek.Visible){ // Doe iets } else { // Doe iets anders } |
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
1
2
3
4
5
6
7
| if (expression) { } else { doeIets(); } |
En dan ook geen stukje commentaar of iets.
Dan zou ik er eerder
1
2
3
4
5
| if (tblZoek.Visible){ // Doe iets anders } else { // Doe iets } |
van maken. De negatie zie je snel over het hoofd.
@super-muffin:
Soms wordt in de code-guidelines opgegeven dat je niet met een negatie mag werken om de reden die ik hierboven noem. Dan krijg je inderdaad dergelijke constructies. Echt fout zou ik ze niet willen noemen (tenzij het een gevolg is van een ontwikkelaar die helemaal geen negatie kent)
Ik zou echter wel een stukje commentaar in het lege blok opnemen. Iets als '\\do nothing'.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Gereserveerd voor toekomstige uitbreidingensuper-muffin schreef op woensdag 16 juli 2008 @ 10:21:
Of deze
code:
1 2 3 4 5 6 7 if (expression) { } else { doeIets(); }
En dan ook geen stukje commentaar of iets.
Ook leuk:
1
2
3
4
5
| $x = 0100; if ( $x == 100 ) { // Code die nooit uitgevoerd wordt. } |
Developer Accused Of Unreadable Code Refuses To Comment
En wat als tblZoek.Visible Null is?Mozin schreef op woensdag 16 juli 2008 @ 10:06:
Kwam ik tegen in een van onze projecten, het is niet echt fout, maar wel een beetje omslachtig.
code:
1 2 3 4 5 6 7 8 if (tblZoek.Visible == false) { // Doe iets } else if (tblZoek.Visible == true) { // Doe iets anders }
Programmer - an organism that turns coffee into software.
Nee, dit is een voorbeeldNiekk schreef op woensdag 16 juli 2008 @ 10:29:
Stond daar letterlijk "code die nooit uitgevoerd wordt" of wat moet ik me er van voorstellen ?
[ Voor 7% gewijzigd door Icelus op 16-07-2008 10:37 ]
Developer Accused Of Unreadable Code Refuses To Comment
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
| private static bool IsBool( string arg ) { try { Convert.ToBoolean(arg); return true; } catch { return false; } } |
Dat moet toch eenvoudiger kunnen
Verwijderd
Is op zich wel slim. De method ToBoolean geeft een boolean, die je in principe direct kan returnen, maar vergeet de ConversionException niet.Verwijderd schreef op woensdag 16 juli 2008 @ 11:32:
Ik kwam zojuist een mooie tegen:
C#:
1 2 3 4 5 6 7 8 9 10 11 12 private static bool IsBool( string arg ) { try { Convert.ToBoolean(arg); return true; } catch { return false; } }
Dat moet toch eenvoudiger kunnen
Nope. de functie is IsBool. Er word dus alleen gecontrolleerd of the waarde een boolean of waarde die geconverteerd kan worden naar boolen bevat.Verwijderd schreef op woensdag 16 juli 2008 @ 11:41:
[...]
Is op zich wel slim. De method ToBoolean geeft een boolean, die je in principe direct kan returnen, maar vergeet de ConversionException niet.
Als bedoeling zou zijn om waarde van de boolean terug te geven, dan is de functie fout en werkt hij niet correct.
Programmer - an organism that turns coffee into software.
Dan zou ik zelf eerder iets gebruiken zoalsJanoz schreef op woensdag 16 juli 2008 @ 10:24:
@super-muffin:
Soms wordt in de code-guidelines opgegeven dat je niet met een negatie mag werken om de reden die ik hierboven noem. Dan krijg je inderdaad dergelijke constructies. Echt fout zou ik ze niet willen noemen (tenzij het een gevolg is van een ontwikkelaar die helemaal geen negatie kent)
Ik zou echter wel een stukje commentaar in het lege blok opnemen. Iets als '\\do nothing'.
1
2
3
4
| if (tblZoek.Visible == false) { //do iets } |
Doe hetzelfde als de negative, is alleen wat meer verboze.
Zag vanochtend trouwens ook een zeer slecht voorbeeld
1
2
3
4
5
6
7
8
9
10
| try { cmd.Connection.Open(); cmd.ExecuteNonQuery(); } catch { //just ignore exception.. } finally { cmd.Connection.Close(); } |
Persoonlijk ga ik al als een stier tekeer als een developer een statement als catch(Exception ex) gebruikt (je behoort alleen fouten af te vangen welke je verwacht), echter na het zien van bovenstaande code (van een ervaren programmeur) ben ik even 10 minuten buiten gaan staan.
Het negeren van excepties is een echte no-no in mijn boek. Ook was deze developer 'vergeten' logging te gebruiken. Ook geen controle of er wel records zijn veranderd (ExecuteNonQuery geeft het aantal gewijzigde records terug).
De developer in kwestie mag vanavond in zijn vrije tijd alsnog een juiste implementatie schrijven.
If it isn't broken, fix it until it is..
Boolean.TryParse is veel handiger en heeft ingebouwde foutcontrole.Verwijderd schreef op woensdag 16 juli 2008 @ 11:41:
[...]
Is op zich wel slim. De method ToBoolean geeft een boolean, die je in principe direct kan returnen, maar vergeet de ConversionException niet.
1
2
3
4
5
6
| function IsBool(string arg) { bool result; return Boolean.TryParse(arg, out result); } |
If it isn't broken, fix it until it is..
Een probleem is wel dat dit een ander resultaat geeft:Niemand_Anders schreef op woensdag 16 juli 2008 @ 11:54:
[...]
Boolean.TryParse is veel handiger en heeft ingebouwde foutcontrole.
C#:
1 2 3 4 5 6 function IsBool(string arg) { bool result; return Boolean.TryParse(arg, out result); }
Tryparse geeft ook false terug als de bool waarde van wat gechecked word false is.When this method returns, if the conversion succeeded, contains true if value is equivalent to TrueString or false if value is equivalent to FalseString. If the conversion failed, contains false.
Death smiles at us all, all a man can do is smile back.
PSN
Toch moet ik zeggen dat ik dat nog wel in mijn code ergens heb zitten, maar het gaat dan wel over een heel specifiek geval. Het is dan wel zo dat ik een specifieke exception afvang en in commentaar heb staan dat hij geignored kan worden. Hierbij valt te denken (ik praat over java) aan de verplichte InteruptedException wanneer je sleep gebruikt en het niet uitmaakt of iets onderbroken wordt of volledig de gestelde pauze doorloopt.Niemand_Anders schreef op woensdag 16 juli 2008 @ 11:45:
Het negeren van excepties is een echte no-no in mijn boek. Ook was deze developer 'vergeten' logging te gebruiken. Ook geen controle of er wel records zijn veranderd (ExecuteNonQuery geeft het aantal gewijzigde records terug).
Of bijvoorbeeld het volgende stukje code:
1
2
3
4
5
6
| int result = DEFAULT; try { result = Integer.parseInt(someString); } catch (NumberFormatException nfe) { //do nothing } |
Maar in alle andere gevallen wil ik inderdaad minimaal een
LOG.warn("beschrijvende melding",throwable);
in de catch body staan.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Zelfs in dit geval zou je toch een melding willen geven dat de ingevoerde string geen juiste invoer was en dat je dus maar een default waarde gebruikt. Nu gaat hij een standaard waarde stilletjes gebruiken zonder dat je weet dat er foute invoer was...Janoz schreef op woensdag 16 juli 2008 @ 12:13:
[...]
Toch moet ik zeggen dat ik dat nog wel in mijn code ergens heb zitten, maar het gaat dan wel over een heel specifiek geval. Het is dan wel zo dat ik een specifieke exception afvang en in commentaar heb staan dat hij geignored kan worden. Hierbij valt te denken (ik praat over java) aan de verplichte InteruptedException wanneer je sleep gebruikt en het niet uitmaakt of iets onderbroken wordt of volledig de gestelde pauze doorloopt.
Of bijvoorbeeld het volgende stukje code:
Java:
1 2 3 4 5 6 int result = DEFAULT; try { result = Integer.parseInt(someString); } catch (NumberFormatException nfe) { //do nothing }
Maar in alle andere gevallen wil ik inderdaad minimaal een
LOG.warn("beschrijvende melding",throwable);
in de catch body staan.
Afhankelijk van de situatie kan ik me indenken dat je niet altijd een melding wilt geven, een gebruiker zit er vaak niet op te wachten, en een logfile vullen met dat soort meldingen is ook niet echt superhandig. Maar nogmaals, afhankelijk van de situatieMarcj schreef op woensdag 16 juli 2008 @ 12:25:
[...]
Zelfs in dit geval zou je toch een melding willen geven dat de ingevoerde string geen juiste invoer was en dat je dus maar een default waarde gebruikt. Nu gaat hij een standaard waarde stilletjes gebruiken zonder dat je weet dat er foute invoer was...
Noem eens een voorbeeld?Erkens schreef op woensdag 16 juli 2008 @ 12:28:
[...]
Afhankelijk van de situatie kan ik me indenken dat je niet altijd een melding wilt geven, een gebruiker zit er vaak niet op te wachten, en een logfile vullen met dat soort meldingen is ook niet echt superhandig. Maar nogmaals, afhankelijk van de situatie
Er wordt niets met 'result' zelf gedaan. Het gaat puur om de return value van TryParse en die geeft alleen maar aan of de conversie is gelukt.De geconverteerde waarde wordt via de tweede parameters (out result) terug gegeven.YakuzA schreef op woensdag 16 juli 2008 @ 12:10:
[...]
Een probleem is wel dat dit een ander resultaat geeft:
[...]
Tryparse geeft ook false terug als de bool waarde van wat gechecked word false is.
Het resultaat is dus niet anders.
Uit de MSDN (System.Boolean.TryParse):
Return Value
Type: System..::.Boolean
true if value was converted successfully; otherwise, false.
If it isn't broken, fix it until it is..
Verwijderd
Dit duid dus echt op een beginnende programmeur, die totaal geen overzicht heeft over boolean logica en if/else constructies...want als je dat wel snapt, ga je dit niet voor de lol zo neerzetten.Mozin schreef op woensdag 16 juli 2008 @ 10:06:
Kwam ik tegen in een van onze projecten, het is niet echt fout, maar wel een beetje omslachtig.
code:
1 2 3 4 5 6 7 8 if (tblZoek.Visible == false) { // Doe iets } else if (tblZoek.Visible == true) { // Doe iets anders }
Dat zal deze nooit uit zichzelf zijn. Default value van de Visible propertie is true, en alleen wanneer jij deze in runtime op null zet kan deze null worden.
[ Voor 22% gewijzigd door Verwijderd op 16-07-2008 12:58 ]
Je geeft niet voor niets een default value op, dus er zal wel een situatie te bedenken zijn dat je een string wilt gebruiken als integer en als dat niet kan een "default" value wilt gebruiken en no questions asked
Maar als het was geschreven als:
1
2
3
4
5
6
| int result; try { result = Integer.parseInt(someString); } catch (NumberFormatException nfe) { result = DEFAULT; } |
Had je er geen probleem mee gehad?
Verwijderd
Mwah toch zie je dat soort constructies wel veel hoor, zeker op embedded systemen waarbij geheugen beperkt is en je dus variabelen geen waarde geeft tenzij echt nodig.Verwijderd schreef op woensdag 16 juli 2008 @ 12:56:
[...]
Dit duid dus echt op een beginnende programmeur, die totaal geen overzicht heeft over boolean logica en if/else constructies...want als je dat wel snapt, ga je dit niet voor de lol zo neerzetten.
[...]
Dat zal deze nooit uit zichzelf zijn. Default value van de Visible propertie is true, en alleen wanneer jij deze in runtime op null zet kan deze null worden.
Dan is het vrij standaard dat iets null kan zijn en kom je er dus met een simpele if niet uit. Al zou ik dan gewoon een switch gebruiken en geen if. (Afhankelijk van de taal en de compiler, sommige compilers zijn hier niet super efficient mee, zeker als je een default of een null waarde hebt waarin je verder niets doet)
Wel is het duidelijk dat dit niet aan de orde was in het voorbeeld, maar ik heb genoeg code gezien waarbij veel if statements op die manier in elkaar zitten.
Als ik anders probeer .Visible van een control op null te zetten krijg ik mooi de volgene error van Visual StudioVerwijderd schreef op woensdag 16 juli 2008 @ 12:56:
[...]
Dat zal deze nooit uit zichzelf zijn. Default value van de Visible propertie is true, en alleen wanneer jij deze in runtime op null zet kan deze null worden.
1
| Cannot convert null to 'bool' because it is a value type |
Edit:
Bovenstaand verhaal maakt het natuurlijk wel iets anders
[ Voor 6% gewijzigd door BM op 16-07-2008 13:09 ]
Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three
Zoals aangegeven had ik al aangegeven dat verwachte excepties zoals de interupt bij een tread gewoon afgevangen mogen worden. Echter blind het generieke exception afvangen en daar niets mee doen is een doodzonde. Op het moment dat een developer de generieke exceptie wrapped in een custom exception, dan heb ik er (veel) minder problemen mee.Janoz schreef op woensdag 16 juli 2008 @ 12:13:
[...]
Toch moet ik zeggen dat ik dat nog wel in mijn code ergens heb zitten, maar het gaat dan wel over een heel specifiek geval. Het is dan wel zo dat ik een specifieke exception afvang en in commentaar heb staan dat hij geignored kan worden. Hierbij valt te denken (ik praat over java) aan de verplichte InteruptedException wanneer je sleep gebruikt en het niet uitmaakt of iets onderbroken wordt of volledig de gestelde pauze doorloopt.
Alle variabelen welke via input van derden (input controls) komt dient te worden gevalideerd. Dus het formulier had het ongeldige nummer al moeten afvangen.Of bijvoorbeeld het volgende stukje code:
Java:
1 2 3 4 5 6 int result = DEFAULT; try { result = Integer.parseInt(someString); } catch (NumberFormatException nfe) { //do nothing }
Gewoon stoïcijns doorgaan en met default waardes verder werken kan ervoor zorgen dat het resultaat uiteindelijk anders is dan verwacht. Wij zijn voornamelijk actief in de financiele sector en afgegeven (lening/lease) offertes zijn bindend. Een adviseur moet er vanuit kunnen gaan dat de offerte correct wordt berekend, ook als hij ongeldige waardes invoert. Hij hoort dan op zijn fouten gewezen te worden.
Juist dit soort excepties op basis van externe waardes loggen wij zodat hierover later analyses kunnen worden losgelaten. Als heel veel adviseurs dezelfde invoer fouten maken, dan wil je dat als development bedrijf weten. Hier kun je dan op inspringen.
Ik heb zelfs programmeurs gehad welke aangaven geen logging te gebruiken vanwege de negatieve impact op de performance. Ook onze final releases worden gewoon met debug symbols verscheept. Bij productie fouten is een leesbare stacktrace van onschatbare waarde. De ingeleverde performance neem ik dan heel erg graag voor lief als ik dan bij een probleem weet dat het probleem optrad in bestand x.cs op regel y in plaats van 'RenderReport() +631'.Maar in alle andere gevallen wil ik inderdaad minimaal een
LOG.warn("beschrijvende melding",throwable);
in de catch body staan.
If it isn't broken, fix it until it is..
Verwijderd
Dat is inderdaad een ander verhaal...want hier was het inderdaad niet aan de orde. Hier is het blijkbaar ook geen nullable property (je kan best een nullable bool aanmaken), dat wist ik nog nietVerwijderd schreef op woensdag 16 juli 2008 @ 13:04:
[...]
Mwah toch zie je dat soort constructies wel veel hoor, zeker op embedded systemen waarbij geheugen beperkt is en je dus variabelen geen waarde geeft tenzij echt nodig.
Dan is het vrij standaard dat iets null kan zijn en kom je er dus met een simpele if niet uit. Al zou ik dan gewoon een switch gebruiken en geen if. (Afhankelijk van de taal en de compiler, sommige compilers zijn hier niet super efficient mee, zeker als je een default of een null waarde hebt waarin je verder niets doet)
Wel is het duidelijk dat dit niet aan de orde was in het voorbeeld, maar ik heb genoeg code gezien waarbij veel if statements op die manier in elkaar zitten.
Waarom hoor je alleen fouten af te vangen welke je verwacht? Wat als er een fout optreed die je niet verwacht?!? Ik bedoel: Kan je dit voor mij beredeneren?Niemand_Anders schreef op woensdag 16 juli 2008 @ 11:45:
[...]
*knip*
Persoonlijk ga ik al als een stier tekeer als een developer een statement als catch(Exception ex) gebruikt (je behoort alleen fouten af te vangen welke je verwacht), echter na het zien van bovenstaande code (van een ervaren programmeur) ben ik even 10 minuten buiten gaan staan.
"Military intelligence is a contradiction in terms." - Groucho Marx, American Comedian, Actor and Singer, 1890-1977
Inleveren van performance is ook onzine als je je log statements tussen if statements zet. Dan merk je er runtime niets van als je je loglevel op error of warn hebt staan. Maar voor debuggen is het erg fijn als je je loglevel even kan aanpassen naar debugNiemand_Anders schreef op woensdag 16 juli 2008 @ 13:55:
[...]
Ik heb zelfs programmeurs gehad welke aangaven geen logging te gebruiken vanwege de negatieve impact op de performance. Ook onze final releases worden gewoon met debug symbols verscheept. Bij productie fouten is een leesbare stacktrace van onschatbare waarde. De ingeleverde performance neem ik dan heel erg graag voor lief als ik dan bij een probleem weet dat het probleem optrad in bestand x.cs op regel y in plaats van 'RenderReport() +631'.
1
2
3
4
| if(log.isDebugEnabled()) { log.debug("dump van grote collection var: "+hugeCollection); } |
tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN
Hangt er een beetje vanaf waar/hoe vaak die logging code aangeroepen wordt, natuurlijk.Niemand_Anders schreef op woensdag 16 juli 2008 @ 13:55:
Ik heb zelfs programmeurs gehad welke aangaven geen logging te gebruiken vanwege de negatieve impact op de performance.
De aanwezigheid/afwezigheid van debug symbols maakt voor performance niet echt uit, je moet alleen grotere binaries doorsturen/opslaan/inladen, en daarom is het "netter" om ze in een productieomgeving achterwege te laten. Voor sommige mensen speelt ook nog dat de aanwezigheid van debuginformatie cracking/reverse engineering eenvoudiger maakt.Ook onze final releases worden gewoon met debug symbols verscheept. Bij productie fouten is een leesbare stacktrace van onschatbare waarde.
Maar je weet hopelijk wel dat je b.v. een coredump van een gestripte binary prima kunt debuggen met de originele niet-gestripte variant? Je kunt een build mét debug symbols maken, een gestripte versie deployen, en coredumps uit de productieomgeving lokaal analyseren zonder enige verlies van functionaliteit. (Betekent wel dat je inderdaad in de productieomgeving geen stacktraces kunt generen, maar debuggen wil je daar toch niet doen.)
Een groter probleem is dat core dumps lastiger te analyseren worden naarmate je meer optimalisaties toepast. (Optimalisatienivo's waarbij de stack frames niet volledig worden opgebouwd zijn bijvoorbeeld heel irritant) Je zou dan eigenlijk met weinig/geen optimalisaties willen builden, maar dat heeft natuurlijk wél een significant effect op de performance.
Fouten die je niet verwacht moeten gewoon doorkomen tot het hoogste nivo en alleen eventueel opgevangen te worden in een uncaught exception handler die een dikke vette foutmelding, of minstens een grote rode log wegschrijft.daanmsvl schreef op woensdag 16 juli 2008 @ 14:36:
[...]
Waarom hoor je alleen fouten af te vangen welke je verwacht? Wat als er een fout optreed die je niet verwacht?!? Ik bedoel: Kan je dit voor mij beredeneren?
Fouten dienen namenlijk afgehandeld te worden, en als je niet weet wat er fout is gegaan kun je het ook niet goed afhandelen. Als er een fout optreed waar je niet op gerekend had dan is er blijkbaar wat mis met het programma.
“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.”
Omdat je voor fouten die je niet verwacht ook geen afhandeling kan geven. Dit zal dus ook niet door jouw laag afgehandeld moeten worden, maar door de laag er boven (of hoger) tot het uiteindelijk door de GUI, VM o.i.d. wordt afgevangen, die er wel wat mee kan. (Melding naar gebruiker geven, VM plat gooien) Fouten opslokken of half afvangen heeft niemand wat aan.daanmsvl schreef op woensdag 16 juli 2008 @ 14:36:
[...]
Waarom hoor je alleen fouten af te vangen welke je verwacht? Wat als er een fout optreed die je niet verwacht?!? Ik bedoel: Kan je dit voor mij beredeneren?
Dit soort constructie "verbergt" ook vaak andere, programmeer, fouten, zoals NullPointerExceptions.
Bijvoorbeeld:
1
2
3
4
5
6
| Product product = productDAO.getProduct(); try { product.verwerk(); } catch (Exception exception) { throw new ProductNotFoundException(); } |
Dit is in ieder geval netter (en ook efficienter):
1
2
3
4
5
6
| Product product = productDAO.getProduct(); if (product == null) { throw new ProductNotFoundException(); } else { product.verwerk(); } |
Zeker als product.verwerk() ook nog een exceptie kan gooien. Bij het eerste voorbeeld slok je deze dus op met een ProductNotFoundException. Bij het tweede voorbeeld zou je deze exceptie wel expliciet te zien krijgen.
'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'
Dat mijn stukje invoer van een gebruiker zou afhandelen en de gebruiker daardoor geen melding zou krijgen is een aanname die jullie doen en die helemaal niet uit mijn code voorbeeld blijkt
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
[ Voor 38% gewijzigd door daanmsvl op 16-07-2008 15:37 . Reden: vergeten ]
"Military intelligence is a contradiction in terms." - Groucho Marx, American Comedian, Actor and Singer, 1890-1977
1
2
3
4
5
| antw = vbNo While antw = vbNo antw = MsgBox("Geen invoer records, dus geen exportbestand. ", _ vbYesNo + vbDefaultButton2 + vbCritical, App.EXEName) Wend |
Waarom iemand hier een vbYesNo neerzet en bij vbNo de msg opnieuw laat zien is mij een raadsel.

Ik neem aan dat je applicatie zelf getallen niet als string doorgeeft, dus is de aanname dat de invoer van buitenaf (url parameters, form post, command line arguments, etc) komt zeer plausibel.Janoz schreef op woensdag 16 juli 2008 @ 15:25:
@MarcJ & Niemand_Anders:
Dat mijn stukje invoer van een gebruiker zou afhandelen en de gebruiker daardoor geen melding zou krijgen is een aanname die jullie doen en die helemaal niet uit mijn code voorbeeld blijkt.
Conversie fouten mogen gewoon niet genegeerd worden. In het minste geval moet de fout worden gelogged (bijvoorbeeld bij een automatische import van een product lijst).
If it isn't broken, fix it until it is..
Daarom vroeg ik ook om een voorbeeld te geven. Wanneer ga je een String parsen als int (of een ander type), welke geen gebruikersinvoer is op een of andere manier?Janoz schreef op woensdag 16 juli 2008 @ 15:25:
@MarcJ & Niemand_Anders:
Dat mijn stukje invoer van een gebruiker zou afhandelen en de gebruiker daardoor geen melding zou krijgen is een aanname die jullie doen en die helemaal niet uit mijn code voorbeeld blijkt.
Ha ha, en dan ook nog de vbNo default maken...denheer schreef op woensdag 16 juli 2008 @ 15:45:
In een financieel pakket kwam ik o.a. dit juweeltje tegen:
Visual Basic:
1 2 3 4 5 antw = vbNo While antw = vbNo antw = MsgBox("Geen invoer records, dus geen exportbestand. ", _ vbYesNo + vbDefaultButton2 + vbCritical, App.EXEName) Wend
Waarom iemand hier een vbYesNo neerzet en bij vbNo de msg opnieuw laat zien is mij een raadsel.
If it isn't broken, fix it until it is..
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.
