Op zaterdag 16 november 2024 17:43:33 schreef henri62:
[...] Ja dat bedoelde ik ook precies.
Als opschrijven in 1 regel kan, dan heeft het weinig zin om te verwijzen naar elders. Zo leert iedere voorbijganger wat er aan de hand is. En omdat we hier allemaal nederlands doen, is het makkelijk omdat je "soort" kan gebruiken terwijl het voor een engels sprekende lastiger is om het onderscheid duidelijk te maken.
Op zaterdag 16 november 2024 17:43:33 schreef henri62:
[...] Moet je naar de linux kernel kijken, daar zaten volgens mijn laaste telling een paar jaar geleden > 120.000 goto's in (is geen typefout!).
Wat in een kernel heel belangrijk is, dat is de foutafhandeling. Enerzijds, alles wat fout /kan/ gaan gaat ook fout. Anderzijds, dat moet je echt goed afhandelen, anders gaat het nog erger fout in de toekomst.
Er is veel code waarbij dus een aantal stappen goed moeten gaan voordat je aan het uiteindelijke werk toekomt. Omdat enerzijds in 99.99% van de gevallen ieder van die stappen wel goed gaat en je dat dus snel wil hebben, maar anderzijds omdat je bij een fout in stap 2 ook stap 1 ongedaan moet maken, krijg je
if (! stap2_ok() ) {
undo stap 1 ;
return error;
}
do_stap3 ();
if (! stap3_ok() ) {
undo stap 2 ;
undo stap 1 ;
return error;
}
Dat escaleert en is foutgevoelig: De "undo stap1" komt 4x voor als er 5 stappen zijn. Als de compiler niet ziet dat ie de undo 4, undo 3 undo 2 undo 1 van stap5 kan hergebruiken door daar halverwege in te springen is dat met een paar gotos geregeld. Dit is de ENIGE geldige reden om goto te gebruiken.
Dat hergebruiken is tricky omdat als je het "fout" uitschrijft zoals hierboven, dan wordt het:
if (! stap3_ok ()) {
undo stap2;
undo stap1;
return STAP3_FAILED;
}
Door die return statement is iedere keer dat stuk anders. In de praktijk staat er dan:
if (! stap3_ok ()) {
returncode = STAP3_FAILED;
goto undo_2_1;
}
[Bericht gewijzigd door
rew
op zondag 17 november 2024 10:49:54
(64%)