Προγραμματισμός

Η Java πήγε

Υπάρχει ένα παλιό αστείο προγραμματιστή που πηγαίνει κάπως έτσι: Ένας προγραμματιστής θυμωμένος λέει στον δεύτερο προγραμματιστή, "Go to Hell!" Ο δεύτερος προγραμματιστής απαντά σε προφανή απωστία, "Αχ, χρησιμοποιήσατε το Goto!" Το σημείο αυτού του ανόητου χιούμορ είναι ότι σε πολλούς προγραμματιστές, η χρήση του "goto" είναι ακριβώς το χειρότερο αδίκημα που μπορεί να διαπράξει.

Υπάρχουν αρκετοί λόγοι για τους οποίους το goto θεωρείται σε τόσο χαμηλή εκτίμηση μεταξύ των προγραμματιστών λογισμικού. Η εφημερίδα του Edsger W. Dijkstra A Case Against the GO TO Statement είναι μια σχετικά πρώιμη πραγματεία σχετικά με τα κακά της κατάχρησης του GOTO. Σε αυτό το άρθρο, ο Ντιζκστρά δηλώνει, "[έγινα πεπεισμένος ότι η μετάβαση στη δήλωση πρέπει να καταργηθεί από όλες τις γλώσσες προγραμματισμού" υψηλότερου επιπέδου "." Η επισήμανση του Dijkstra's Go To Statement θεωρείται επιβλαβής όχι μόνο χάρη στη δήλωση goto, αλλά ξεκίνησε επίσης μια δημοφιλή τάση της επιστήμης των υπολογιστών με τη χρήση της φράσης "θεωρείται επιβλαβής" (αν και αυτές οι δύο λέξεις προφανώς χρησιμοποιήθηκαν εκτός του προγραμματισμού πριν από αυτό).

Πολλοί προγραμματιστές από τότε που η Dijkstra έχουν δαγκωθεί από ορισμένα από τα προβλήματα συντηρησιμότητας που σχετίζονται με τη χρήση δηλώσεων goto σε ορισμένες γλώσσες. Άλλοι προγραμματιστές έχουν ακούσει αυτές τις ιστορίες ή είχαν το "Μην χρησιμοποιείτε το goto" χτυπημένο σε αυτές τόσο πολύ που δεν χρειάζεται να βιώσουν τα μειονεκτήματά του από πρώτο χέρι για να πιστέψουν ότι δεν πρέπει να χρησιμοποιούν το GOTO.

Αν και η δήλωση goto φαίνεται να έχει γενικά κακή φήμη, δεν είναι χωρίς τους υποστηρικτές της. Ο Φρανκ Ρούμπιν έγραψε μια απάντηση στις απαντήσεις της Ντιζκστρά Μετάβαση στη δήλωση θεωρείται επιβλαβής (Μάρτιος 1968) που ονομάζεται GOTO θεωρηθεί επιβλαβής «θεωρείται επιβλαβής (Μάρτιος 1987). Σε αυτή την επιστολή, ο Ρούμπιν έγραψε για την επιστολή της Ντιζκστρά που έχει επίδραση στους προγραμματιστές τόσο δραματική που «η ιδέα ότι το GOT0 είναι επιβλαβές γίνεται αποδεκτή σχεδόν καθολικά, χωρίς αμφιβολία ή αμφιβολία». Από αυτήν την παρατήρηση, ο Ρούμπιν έγραψε, "Αυτό προκάλεσε ανυπολόγιστη βλάβη στον τομέα του προγραμματισμού, το οποίο έχασε ένα αποτελεσματικό εργαλείο. Είναι σαν κρεοπωλεία που απαγορεύουν τα μαχαίρια επειδή οι εργαζόμενοι μερικές φορές κόβονται." Σημειώστε ότι η Dijkstra απάντησε στην επιστολή του Rubin με το On a Somewhat Disappointing Correspondence. Η σελίδα Cunningham & Cunningham Wiki Go To το λέει σχετικά με τη δήλωση goto: "Ο μαθητευόμενος το χρησιμοποιεί χωρίς σκέψη. Ο ταξιδιώτης το αποφεύγει χωρίς να σκέφτεται. Ο πλοίαρχος το χρησιμοποιεί σκεπτικά."

Υπάρχουν πολλοί άλλοι πόροι που καλύπτουν τα πλεονεκτήματα και τα μειονεκτήματα της χρήσης της δήλωσης goto. Δεν σκοπεύω να επαναλάβω αυτήν τη συζήτηση εδώ εκτός από τη σύντομη παρουσίαση της πρώιμης ιστορίας της διαμάχης που έχει ήδη καλυφθεί. Έχω ακούσει ορισμένους προγραμματιστές Java να δηλώνουν ότι η Java δεν έχει μια δήλωση goto και αυτό είναι που θέλω να συζητήσω στο υπόλοιπο αυτής της ανάρτησης ιστολογίου.

Η Java διατηρεί το "goto" ως δεσμευμένη λέξη-κλειδί. Ωστόσο, είναι μια λέξη-κλειδί που δεν χρησιμοποιείται. Αυτό σημαίνει ότι παρόλο που η λέξη-κλειδί δεν κάνει τίποτα παραγωγικό, είναι επίσης μια λέξη που δεν μπορεί να χρησιμοποιηθεί στον κώδικα για ονόματα μεταβλητών ή άλλες κατασκευές. Για παράδειγμα, ο ακόλουθος κωδικός δεν θα μεταγλωττιστεί:

πακέτο dustin.example; / ** * Κατηγορία που δείχνει τη λειτουργικότητα που μοιάζει με Java. * / Δημόσια τάξη JavaGotoFunctionality {/ ** * Κύρια εκτελέσιμη λειτουργία. * * Ορίσματα @param Ορίσματα γραμμής εντολών: δεν αναμένεται κανένα. * / public static void main (final επιχειρήματα String []) {final String goto = "Go to bed!"; }} 

Εάν προσπαθήσω να μεταγλωττίσω αυτόν τον κώδικα, βλέπω ένα σφάλμα όπως αυτό που εμφανίζεται στο επόμενο στιγμιότυπο οθόνης.

Το μήνυμα σφάλματος "αναμενόμενο" με ένα δείκτη στο διάστημα πριν από το "goto" δίνει στον έμπειρο προγραμματιστή Java αρκετή ένδειξη για να συνειδητοποιήσει γρήγορα ότι υπάρχει κάτι λάθος σχετικά με τη χρήση του "goto". Ωστόσο, μπορεί να μην είναι τόσο προφανές σε κάποιον νέο στη Java.

Γενικά δεν χρησιμοποιώ το goto build, αλλά επίσης αναγνωρίζω ότι υπάρχουν καταστάσεις στις οποίες η χρήση του κάνει κώδικα που είναι πιο ευανάγνωστος και χρησιμοποιεί λιγότερο τρελές λύσεις από το να μην το χρησιμοποιώ. Στην Java, αυτό έχει πραγματοποιηθεί και παρέχεται υποστήριξη για ορισμένες από τις πιο κοινές καταστάσεις στις οποίες μια δήλωση goto θα ήταν πιο χρήσιμη και μάλλον θα ήταν προτιμότερη από τις εναλλακτικές. Τα πιο προφανή παραδείγματα αυτού είναι η επισήμανση Διακοπή και επισημαίνονται να συνεχίσει δηλώσεις. Αυτά συζητούνται και επιδεικνύονται στην ενότητα Java Tutorials Branching Statements.

Η ικανότητα επισήμανσης μιας συγκεκριμένης δήλωσης και έπειτα να έχει το Διακοπή ή να συνεχίσει ισχύουν για αυτήν τη δήλωση και όχι για την πιο άμεση δήλωσή της (ως μη επισημασμένη Διακοπή ή να συνεχίσει είναι) είναι ιδιαίτερα χρήσιμο σε περιπτώσεις όπου οι ένθετοι βρόχοι διαφορετικά θα απαιτούσαν περισσότερο κώδικα και πιο περίπλοκο κώδικα για να επιτευχθεί το ίδιο πράγμα. Διαπίστωσα ότι συχνά μπορώ να επανασχεδιάσω τις δομές δεδομένων και τον κώδικα μου για να αποφύγω τέτοιες καταστάσεις, αλλά αυτό δεν είναι πάντα πρακτικό.

Ένας άλλος καλός πόρος που σχετίζεται με τη χρήση λειτουργιών που μοιάζουν με goto στην Java είναι οι 13 Ιουνίου 2000 JDC Tech Tip Goto Statements και Java Programming. Όπως επισημαίνει αυτή η συμβουλή, οι ετικέτες μπορούν πραγματικά να χρησιμοποιηθούν σε οποιοδήποτε μπλοκ και δεν περιορίζονται σε αυτά Διακοπή και να συνεχίσει. Ωστόσο, είναι η εμπειρία μου που είναι απαραίτητη αυτή η προσέγγιση εκτός του Διακοπή και να συνεχίσει είναι πολύ λιγότερο κοινό.

Μια σημαντική παρατήρηση σχετικά με τις ετικέτες είναι ότι η εκτέλεση κώδικα δεν επιστρέφει κυριολεκτικά σε αυτήν την ετικέτα όταν το σπάσε τη σωστή ετικέτα εκτελείται. Αντ 'αυτού, η ροή εκτέλεσης πηγαίνει στη δήλωση αμέσως μετά την ετικέτα. Για παράδειγμα, αν είχα ένα εξωτερικό Για βρόχος που ονομάζεται "dustin:", τότε ένα διάλειμμα σε αυτό θα πήγαινε στην πρώτη εκτελέσιμη δήλωση μετά το τέλος αυτής της ετικέτας Για βρόχος. Με άλλα λόγια, λειτουργεί περισσότερο σαν μια εντολή "μετάβαση στη δήλωση ακολουθώντας την ετικέτα δήλωσης".

Δεν παρέχω παραδείγματα χρήσης αυτών των ετικετών Διακοπή ή με ετικέτα να συνεχίσει δηλώσεις εδώ επειδή υπάρχουν πολλά καλά παραδείγματα που βρίσκονται εύκολα στο διαδίκτυο. Συγκεκριμένα, οι δύο πόροι που έχω ήδη αναφέρει (Java Tutorials Branching Statements and Goto Statements and Java Programming Tech Tip) περιλαμβάνουν απλά παραδείγματα.

Όσο περισσότερο εργάζομαι στη βιομηχανία ανάπτυξης λογισμικού, τόσο πιο πεπεισμένος γίνω ότι υπάρχουν λίγα απόλυτα στην ανάπτυξη λογισμικού και ότι οι εξτρεμιστικές θέσεις θα είναι σχεδόν πάντα λάθος σε ένα σημείο ή άλλο. Σε γενικές γραμμές αποφεύγω τη χρήση του κώδικα goto ή παρόμοιου κώδικα, αλλά υπάρχουν φορές που είναι ο καλύτερος κώδικας για τη δουλειά. Παρόλο που η Java δεν έχει άμεση υποστήριξη goto, παρέχει υποστήριξη τύπου goto που ικανοποιεί τις περισσότερες από τις σχετικά σπάνιες ανάγκες μου για τέτοια υποστήριξη.

Αυτή η ιστορία, "Java's goto" δημοσιεύθηκε αρχικά από το JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found