Quindi mi sono imbattuto in un vecchio post di blog di Robert Martin (Zio Bob) che parla di come la disciplina della Programmazione strutturata abbia convinto i programmatori a prendere l'istruzione GOTO
dal loro codice, anche quando è implicita solo in questo esempio che ha dato:
if (a>10)
b++;
else
b--;
Ha detto che era una cattiva pratica perché fondamentalmente sarebbe correlata a questo codice se scritto in FORTRAN:
IF (A-10) 20,20,30
20 B = B - 1
GOTO 40
30 B = B + 1
40 ...
Per me, questo ha senso. Un blocco If
agisce essenzialmente come un'istruzione GOTO
sotto il cofano, quindi perché usarlo. (Naturalmente, nella parte posteriore della mia mente, sto pensando che non c'è modo di aggirare un qualche tipo di istruzione JUMP
nel linguaggio assembly sottostante, che è fondamentalmente un'istruzione GOTO
, ma ho ignorato quel pensiero e spostato on.)
Ma poi ha detto:
you could restrict your program to three different control structures: Sequence, Selection, and Iteration
e quello con una struttura Selection
, potresti scrivere un codice come questo:
if (someBooleanValue())
doThisStep();
else
doOtherStep();
Questa dovrebbe essere una versione migliore di un blocco If
rispetto alla versione GOTO
che ho menzionato sopra perché utilizzava una struttura Selection
. Tuttavia, non vedo davvero la differenza tra loro. Qual è la differenza fondamentale?
L'unica cosa che posso capire è che ha qualcosa a che fare con ciò che ha detto qui:
Dijkstra's argument was that a structured program can be easily analyzed because the state of the system at any line of code, depends only on the boolean values being tested by selection and iteration, and the list of calling procedures on the stack.
In qualche modo sembra che ci sia un principio più profondo qui che mi manca. Ho capito che puoi tenere traccia dello stato di un programma usando le variabili booleane, ma cosa c'entra questo con questi due blocchi If
?