Se diamo un'occhiata al protothread vediamo che la macro non sta creando un goto ma usando un'istruzione switch-case. Quindi i protothread non sono goto.
Il protothread crea più punti di uscita. Un singolo punto di uscita di una funzione non è obbligatorio, ma è una buona regola pratica che quando la funzione richiede più punti di uscita o molte indentazioni, si può presumere che la funzione che hai scritto sia troppo grande. Devi considerare entrambi perché puoi evitare il rientro usando molti punti di uscita o puoi avere un punto di uscita scrivendo complesse istruzioni if, cicli e usando gotos. Nessuno di questi è buono.
Il motivo per cui goto è negativo non è dovuto ai punti di uscita. Se diamo un'occhiata al ciclo while
o for
vediamo che tutti i ponticelli di cui stiamo parlando stanno eliminando le mani del programmatore. Se lo si desidera o meno, il programmatore non ha il controllo su questi ponticelli nascosti, viene posizionato e indicizzato dinamicamente per il programmatore durante la compilazione. Se diamo un'occhiata a un'istruzione if, che è un'istruzione jump ahead, vedremo la stessa cosa. In nessuna parte del codice c'è un goto definito dal programmatore ma creato dalla lingua. Questo è il motivo principale per cui i goto sono considerati dannosi. Gotos sta rompendo il design del linguaggio di programmazione con la possibilità di interrompere il programma pur sapendo che il linguaggio di programmazione è progettato per occuparsene in modo impeccabile.