Come faccio a distinguere tra una versione "GOTO" di un blocco IF e una versione "Strutturata" di un blocco IF?

3

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 ?

    
posta BarrettNashville 27.07.2017 - 20:27
fonte

1 risposta

7

What is the fundamental difference?

Non ce n'è uno.

Il motivo per cui l'argomento del tuo amico va in pezzi è perché qualsiasi if-else può essere riscritto usando goto . Infatti, a livello di processore, l'istruzione di ramo ogni (compresi i condizionali) è un goto .

La programmazione strutturata è l'atto di utilizzare un linguaggio di programmazione strutturato per scrivere codice strutturato, senza riflettere su quale sia il codice equivalente in un'altra lingua o su ciò che sta accadendo sotto il linguaggio.

    
risposta data 27.07.2017 - 20:36
fonte

Leggi altre domande sui tag