Το κακό GOTO |
Η πρόταση goto εκτελεί μιά διακλάδωση χωρίς συνθήκη. Η πρόταση goto παραπέμπει στις γλώσσες επιπέδου assembly αφού αποτελεί ευθεία υλοποίηση εντολών γλώσσας μηχανής του τύπου jump label, όπου label είναι κάποια δεδομένη διεύθυνση μνήμης. Η προφανής χρησιμότητα της εντολής αυτής εξηγεί και την εξ΄ ίσου ευθεία υλοποίησή της στις πρώτες γλώσσες υψηλού επιπέδου (Fortran, Basic). Η επiκράτηση του δομημένου προγραμματισμού έχει σαν αποτέλεσμα την ανάπτυξη των δομών ελέγχου που συνατήσαμε παραπάνω. Οι δομές αυτές, σε συνεργασία με τις συναρτήσεις και τις διαδικασίες ( δηλαδή του τμηματικού προγραμματισμού) βοηθούν στην οργανωμένη έκφραση όλων σχεδών των διανοητικών ακροβασιών που μπορεί να σκεφτεί ένας προγραμματιστής. Επιπλέον οι δομές αυτές είναι μαθηματικά ελέγξιμες όσον αφορά στην ορθότητα του κώδικα που παράγουν. Έτσι στο σύγχρονο προγραμματισμό το goto σίγουρα δεν έχει βασική θέση. Παραμένει μόνο σαν μιά τελευταία λύση, σε καταστάσεις απρόβλεπτες. Το πρόγραμμα GOTOEX.C δίνει μιά ιδέα της 'καλής' και της 'κακής' χρήσης του goto. Κατ΄ αρχήν η σύνταξη του goto είναι απλή. Η πρόταση έχει τη μορφή goto label; όπου το label είναι ένα όνομα που εμανίζεται σε κάποια γραμμή του προγράμματος ακολουθοούμενο από άνω-κατω τελεία. Στο σημείο αυτό μεταφέρεται η εκτέλεση του προγράμματος όταν εκτελεστεί η πρόταση goto. Η 'καλή' χρήση του goto φαίνεται στην επανάληψη for και αντιστοιχεί περίπου με αυτή του break, δηλαδή επιτρέπει την πρόωρη έξοδο από κάποια επανάληψη. Το πλεονέκτημά του σε σχέση με το break είναι οτι επιτρέπει την έξοδο από πολλαπλά επίπεδα επαναλήψεων καθώς επίσης και τη μεταφορά του ελέγχου όχι απαραίτητα στη πρώτη εντολή που ακολουθεί αλλά οπουδήποτε στο πρόγραμμα. Να σημειωθεί οτι ενώ επιτρέπεται η αυθαίρετη έξοδος από μία ή περισσότερες επαναλήψεις με τη βοήθεια του goto δεν επιτρέπεται η αυθαίρετη είσοδος σε κάποια επενάληψη. Αυτή μπορεί να γίνει μόνον από την αρχική της πρόταση και μόνο με τη κανονική αρχικοποίηση. Η 'κακή' χρήση του goto έγκειται ακριβώς στο γεγονός οτι ο έλεγχος του προγράμματος μπορεί να μεταφερθεί ανά πάσα στιγμή οπουδήποτε, μέσα στα πλαίσια μιας συνάρτησης. Αυτό μπορεί να οδηγήσει σε προγράμματα δαιδαλώδη, τα οποία κατά τη στιγμή της συγγραφής έχουν κάποιο νόημα γιά τον προγραμματιστή αλλά συνήθως καταλήγουν να είναι ιδιαίτερα δυσνόητα γιά οποιονδήποτε άλλο. Η έννοια της ακολουθίας εκτέλεσης των προτάσεων παύει να είναι συνδεμένη με την έννοια της συγγραφικής (και αναγνωστικής) ακολουθίας των προτάσεων. Γιά να παρακολουθήσει κανείς τις συχνές αλλαγές του σημείου ελέγχου πρέπει να ενώσει με μιά συνεχόμενη γραμμή τα διάφορα label's. Τέτοια προγράμματα ονομάζονται κοροιδευτικά 'κώδικας σπαγγέτι'. Προσπαθείστε, σαν άσκηση, να αναδομήσετε το παραπάνω πρόγραμμα έτσι ώστε να παράγει το ίδιο αποτέλεσμα χωρίς να χρησιμοποιεί τη πρόταση goto. Το αποτέλεσμα της εκτέλεσης του προγράμματος δίνεται αμέσως. Dog = 1 Cat = 1 Pig = 1 Dog = 1 Cat = 1 Pig = 2 Dog = 1 Cat = 1 Pig = 3 Dog = 1 Cat = 2 Pig = 1 Dog = 1 Cat = 2 Pig = 2 Dog = 1 Cat = 2 Pig = 3 Dog = 1 Cat = 3 Pig = 1 Dog = 1 Cat = 3 Pig = 2 Dog = 1 Cat = 3 Pig = 3 Dog = 1 Cat = 4 Pig = 1 Dog = 1 Cat = 4 Pig = 2 Dog = 1 Cat = 4 Pig = 3 Dog = 1 Cat = 5 Pig = 1 Dog = 1 Cat = 5 Pig = 2 Dog = 1 Cat = 5 Pig = 3 Those are enough animals for now. This is the first line out of the spaghetti code. This is the second line of the spaghetti code. This is the third line of spaghetti. This is another line of the mess. This is the last line of this mess. |
![]() |
![]() |
![]() |