Maasluip schreef op woensdag 17 juli 2013 @ 11:35:
[...]
Als er while (true) staat hoef je alleen maar te zoeken naar alle plekken waar een break staat. Als er while (!guessed) staat moet je alle plekken waar guessed gezet wordt gaan opzoeken. guessed kan ook gebruikt worden in een andere statements, dus niet alle keren dat je guessed vindt wordt het ook gezet.
Ik ga hier absoluut niet mee akkoord.
Als er while (true) staat, weet je bij doorlezen van de loop (en hij is best lang) helemaal niet wat de exit-conditie is en wat de loop doet. Je moet dan ook op zoek(!!!) naar alle break statements om dan alle bijhorende if-statements (en dat kunnen er veel zijn) te gaan interpreteren.
Als er staat while (!guessed), dan weet je direct dat de bedoeling van de loop is dat er iets geraden wordt en dat er meteen uit de loop gesprongen wordt als iets geraden is. Je exit-condities in de while () clause schrijven geeft iemand die de code leest dus _VEEL_ meer info over wat nou de bedoeling is.
Persoonlijk motto: jouw code heeft maar 2 stakeholders:
- de gebruiker ervan
- degene die na jou in de code wijzigingen moet aanbrengen (dit kan jijzelf over 2 jaar zijn...)
Voor de eerste moet de code correct zijn, voor de 2de moet hij leesbaar en onderhoudbaar zijn.
Zoals ik hierboven aantoon is while (!guessed) veel leesbaarder dan while (true) met dan een tiental breaks in de body.
Ik vind het ook cleaner om while (true) te gebruiken.
Om een break met een goto te vergelijken getuigt van weinig ervaring met BASIC. Met goto's maak je spaghetticode en kun je naar elk willekeurig stukje code springen. Met een break beëindig je alleen de loop.
break is ook een goto, net zoals continue dit is.
continue is wat mij betreft ook enkel in te zetten als guard clause direct in het begin van de loop:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
| while (i < 100) {
if (complexfunction(objects[i])
{
log("error: XXX");
continue; // goed
}
// andere
// logica
// hier
if (something)
continue; // fout
// nog logica hier
} |
Bemerk: dit zijn persoonlijk guidelines die ik aanhoud - er zullen altijd wel goede uitzonderingen zijn
In het geval van een game-loop, lijkt me een while (true) ook niet zo fout, deze springt er namelijk direct uit. Iedereen die in de code van een game kijkt zal meteen de game-loop herkennen.