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

Δημιουργία κώδικα χρησιμοποιώντας Javadoc

Η αυτόματη δημιουργία κώδικα γίνεται όλο και πιο συχνή στην ανάπτυξη λογισμικού, αποτέλεσμα της ανάγκης απόκρυψης της πολυπλοκότητας από τον προγραμματιστή λογισμικού και της αποδοχής διαφόρων τυπικών και de facto τυπικών διεπαφών προγραμματισμού εφαρμογών. Η απόκρυψη της πολυπλοκότητας από τον προγραμματιστή μπορεί να αποδειχθεί δημιουργώντας κλάσεις stub και σκελετών στο CORBA από τις περιγραφές γλώσσας ορισμού διεπαφής και από ορισμένες αντικειμενοστρεφείς βάσεις δεδομένων που δημιουργούν τον απαραίτητο κώδικα προσαρμογέα για να διατηρούν και να ανακτούν αντικείμενα από τη βάση δεδομένων.

Η Java περιέχει πολλά API τα οποία οι προγραμματιστές Java θεωρούν de facto πρότυπα. Η πολυπλοκότητα αυτών των API κυμαίνεται από εκείνες που αποτελούν τον «πυρήνα» της γλώσσας Java έως εκείνες που βρίσκονται στην πλατφόρμα Java 2, Enterprise Edition. Για παράδειγμα, το Java Database Connectivity API παρουσιάζει μια ενοποιητική διεπαφή για αλληλεπίδραση με βάσεις δεδομένων από διάφορες εταιρείες. Ας υποθέσουμε ότι θέλετε ένα αντικείμενο Java να μπορεί να παραμείνει σε μια βάση δεδομένων εφαρμόζοντας ένα απλό σώσει() μέθοδος που χαρτογραφεί τα χαρακτηριστικά του αντικειμένου σε έναν πίνακα βάσης δεδομένων. Αυτή η μέθοδος θα εξαγάγει τα χαρακτηριστικά από το αντικείμενο και θα χρησιμοποιήσει το API JDBC για να δημιουργήσει μια δήλωση JDBC που εκτελείται έναντι της βάσης δεδομένων. Μετά την εφαρμογή του σώσει() μέθοδος για μερικές κλάσεις, αρχίζετε να βλέπετε τις ομοιότητες στη δομή κώδικα και την επαναλαμβανόμενη φύση της εφαρμογής αυτής της μεθόδου. Συχνά τα βασικά χαρακτηριστικά ενός αντικειμένου πρέπει να μεταγραφούν και να "συνδεθούν" στο κατάλληλο Java API. Αυτό είναι όταν μια γεννήτρια κώδικα μπορεί να είναι ένα χρήσιμο εργαλείο για να έχετε στην εργαλειοθήκη προγραμματισμού σας.

Χρησιμοποιώντας μια γεννήτρια κώδικα μπορείτε να αυτοματοποιήσετε τη διαδικασία ορισμένων κουραστικών, επαναλαμβανόμενων και επιρρεπείς σε σφάλματα εργασίες κωδικοποίησης. Το γεγονός ότι συνδέεστε σε γνωστά API αυξάνει τη χρησιμότητα ενός τέτοιου εργαλείου, καθώς ισχύει για ένα ευρύ κοινό προγραμματιστών. Επιπλέον, ορισμένα τυπικά "εσωτερικά" πλαίσια ειδικά για τον τομέα μπορούν επίσης να θεωρηθούν ως σταθεροί στόχοι API για τους δημιουργούς κώδικα.

Μια γεννήτρια κώδικα μπορεί να είναι ένα εργαλείο εξοικονόμησης χρόνου που αυξάνει την ποιότητα του κώδικα και εισάγει μια πιο επίσημη και αυτοματοποιημένη προσέγγιση σε μέρος του κύκλου ανάπτυξης. Ένα άλλο πλεονέκτημα της αυτόματης δημιουργίας κώδικα είναι ο συγχρονισμός ορισμών αντικειμένων σε διάφορες γλώσσες προγραμματισμού. Σε πολλές αυστηρά συνδεδεμένες εφαρμογές, το ίδιο επιχειρηματικό αντικείμενο (για παράδειγμα, μια εντολή αγοράς μετοχής) πρέπει να αντιπροσωπεύεται με συνέπεια σε C ++, Java και SQL. Η δυνατότητα παραγωγής διαφορετικών αναπαραστάσεων από ένα κοινό μοντέλο είναι διαθέσιμη σε διάφορα εργαλεία μοντελοποίησης. Ωστόσο, το βρήκα περίεργο να χρησιμοποιήσω αυτά τα εργαλεία για να επιτύχω το απαιτούμενο επίπεδο προσαρμογής. Μια αποκλειστική γεννήτρια προσαρμοσμένου κώδικα είναι αρκετά απλή για να δημιουργήσει και δεν σας συνδέει με ένα συγκεκριμένο εργαλείο μοντελοποίησης.

Το μονοπάτι προς το Javadoc

Το μονοπάτι που πήρε η ομάδα μου στην επιλογή του Javadoc για σκοπούς δημιουργίας κώδικα ήταν κάπως μακρύ και πιθανότατα κοινό. Σε πρώιμες υλοποιήσεις, χρησιμοποιήσαμε σενάρια Perl για την ανάλυση προσαρμοσμένης γραμματικής μεταδεδομένων σε ένα αρχείο κειμένου. Αυτή ήταν μια ad hoc λύση και η προσθήκη πρόσθετων μορφών εξόδου ήταν δύσκολη. Η δεύτερη, βραχύβια προσπάθειά μας ήταν να τροποποιήσουμε έναν υπάρχοντα μεταγλωττιστή IDL που βασίζεται σε Java. Σύντομα συνειδητοποιήσαμε ότι θα πρέπει να εισαχθούν πρόσθετες λέξεις-κλειδιά IDL για την αποστολή συμβουλών στη δημιουργία κώδικα. Η πραγματοποίηση μιας επέκτασης στο IDL ή ακόμη και ξεκινώντας από το μηδέν με εργαλεία όπως το lex και το yacc (τα οποία χωρίζουν ένα αρχείο προέλευσης σε διακριτικά και ορίζουν κώδικα που καλείται για κάθε αναγνωρισμένο διακριτικό) δεν ήταν προσωπικά εύγευστα. (Δείτε πόρους για περισσότερες πληροφορίες.)

Μια τρίτη πιο πολλά υποσχόμενη λύση ήταν να περιγράψουμε τα μεταδεδομένα τάξης χρησιμοποιώντας XML. Ο καθορισμός σχήματος XML DTD και η δημιουργία εγγράφων XML για την περιγραφή τάξεων φαινόταν φυσική εφαρμογή. Το αρχείο θα μπορούσε στη συνέχεια να επαληθευτεί και να αναλυθεί εύκολα. Για να αποφύγω το ξεκίνημα από το μηδέν, κατάλαβα ότι κάποιος πρέπει να έχει προσπαθήσει να δημιουργήσει ένα παρόμοιο XML DTD και σύντομα συνάντησα το XMI. Το XMI είναι μια πλήρης περιγραφή του UML χρησιμοποιώντας XML και τώρα χρησιμοποιείται ως μορφή ανταλλαγής μεταξύ εργαλείων UML. (Δείτε πόρους για περισσότερες πληροφορίες.)

Ωστόσο, τα έγγραφα XML που περιέγραψαν μαθήματα ήταν εξαιρετικά λεπτομερή και δύσκολο να επεξεργαστούν χειροκίνητα. Υπάρχουν απλά πάρα πολλές φαινομενικά περιττές ετικέτες και περιγραφές για να ξεπεράσετε για να αλλάξετε ένα χαρακτηριστικό κλάσης. Επίσης, ο χειρισμός αρχείων XML σε επίπεδο τομέα-εφαρμογής μπορεί να είναι αρκετά κουραστικός. Το IBM alphaWorks παράγει μια εργαλειοθήκη XMI που καθιστά την επεξεργασία εγγράφων XML που βασίζονται σε XMI πολύ πιο εύκολη, αλλά το API εργαλειοθήκης XMI για χειρισμό περιγραφών κλάσης είναι εξαιρετικά παρόμοιο με το Java Reflection ή το Doclet API. Έχοντας αυτό υπόψη, ο οργανισμός μου αποφάσισε να χρησιμοποιήσει την προσέγγιση doclet, η οποία ήταν επιτυχής.

Σας παρουσιάζουμε το Javadoc

Το Javadoc είναι το πρόγραμμα που χρησιμοποιείται για τη δημιουργία τεκμηρίωσης Java API μορφής HTML. Διανέμεται ως μέρος του Java SDK και το στάδιο εξόδου του έχει σχεδιαστεί ώστε να είναι επεκτάσιμο μέσω της δημιουργίας doclet. Το Doclet API παρέχει την υποδομή για πρόσβαση σε όλες τις πτυχές ενός αρχείου πηγαίου κώδικα Java που έχει αναλυθεί από το Javadoc. Χρησιμοποιώντας το Doclet API, το οποίο είναι παρόμοιο με το Reflection API, μπορείτε να διαβάσετε μια περιγραφή κλάσης Java, να αποκτήσετε πρόσβαση σε προσαρμοσμένες ετικέτες Javadoc και να γράψετε έξοδο σε ένα αρχείο. Το τυπικό έγγραφο που χρησιμοποιείται για την παραγωγή τεκμηρίωσης HTML κάνει ακριβώς αυτό. Καταγράφει αρχεία HTML καθώς διασχίζει όλο τον πηγαίο κώδικα Java. Αναλυτικότερες πληροφορίες για το Javadoc μπορείτε να βρείτε στο Resources.

Δημιουργώντας απλές κλάσεις Java που περιέχουν χαρακτηριστικά και ορισμένες προσαρμοσμένες ετικέτες Javadoc, επιτρέπετε σε αυτές τις κλάσεις να λειτουργούν ως μια απλή περιγραφή μεταδεδομένων για τη δημιουργία κώδικα. Το Javadoc αναλύει αυτές τις κλάσεις μεταδεδομένων και τα προσαρμοσμένα φυλλάδια έχουν πρόσβαση στις πληροφορίες κλάσης μεταδεδομένων για να δημιουργήσουν συγκεκριμένες υλοποιήσεις της κλάσης μεταδεδομένων σε συγκεκριμένες γλώσσες προγραμματισμού όπως Java, C ++ ή SQL. Μπορείτε επίσης να δημιουργήσετε παραλλαγές του τυπικού εγγράφου που παράγει απλούς πίνακες HTML που περιγράφουν την κλάση μεταδεδομένων, οι οποίες θα ήταν κατάλληλες να συμπεριληφθούν σε ένα έγγραφο επεξεργασίας κειμένου. Αυτές οι κλάσεις μεταδεδομένων Java εξυπηρετούν τον ίδιο σκοπό με μια περιγραφή IDL της οποίας η σύνταξη είναι παρόμοια με το C ++.

Η χρήση του Javadoc ως εργαλείου δημιουργίας κώδικα έχει πολλά οφέλη:

  • Δεν χρειάζεται να γράψετε κώδικα ανάλυσης. Η ανάλυση των τάξεων μεταδεδομένων πραγματοποιείται από το Javadoc και παρουσιάζεται σε ένα εύχρηστο API.
  • Χρησιμοποιώντας προσαρμοσμένες ετικέτες Javadoc, προσθέτετε αρκετή ευελιξία για να ορίσετε ειδικά αγκίστρια κατά τη δημιουργία κώδικα.
  • Δεδομένου ότι οι τύποι Java είναι καλά καθορισμένοι, ένα int είναι 32 bits. Επομένως, δεν χρειάζεται να εισαγάγετε πρόσθετες λέξεις-κλειδιά πρωτόγονου τύπου για να επιτύχετε αυτό το επίπεδο σαφήνειας.
  • Μπορείτε να ελέγξετε τις κλάσεις μεταδεδομένων Java για σύνταξη και άλλα σφάλματα κατά τη συλλογή.

Παρουσιάζοντας ντοκιμαντέρ

Πριν μεταβείτε στο έγγραφο που χρησιμοποιείται για τη δημιουργία κώδικα, θα παρουσιάσω ένα απλό παράδειγμα "Hello World" που εκθέτει τα σχετικά μέρη του τρόπου δημιουργίας, εκτέλεσης και παιχνιδιού με το API του Doclet. Το δείγμα κώδικα για SimpleDoclet δίνεται παρακάτω. (Μπορείτε να λάβετε τον πηγαίο κώδικα για αυτό το άρθρο στους πόρους.) Εάν θεωρείτε ότι αυτός ο κωδικός είναι αρκετά χρονοβόρος για ένα πραγματικό πρόγραμμα "Hello World", ο ιστότοπος της Sun παρουσιάζει ένα ακόμη απλούστερο έγγραφο για να σας βοηθήσει να ξεκινήσετε. (Δείτε πόρους.)

πακέτο codegen.samples; εισαγωγή com.sun.javadoc. *; εισαγωγή java.text. *; δημόσια στατική boolean έναρξη (RootDoc ​​root) {// επαναλάβετε όλες τις τάξεις. ClassDoc [] class = root.classes (); για (int i = 0; i <class.length; i ++) {// επαναλάβετε όλες τις μεθόδους και εκτυπώστε τα ονόματά τους. MethodDoc [] μεθόδους = τάξεις [i]. Μέθοδοι (); έξω ("Μέθοδοι"); έξω("-------"); για (int j = 0; j

Το παραπάνω έγγραφο εκτυπώνει περιγραφικές πληροφορίες για τις τάξεις, τις μεθόδους, τα πεδία και ορισμένες πληροφορίες ετικέτας Javadoc της τάξης SimpleOrder.java παρατίθενται παρακάτω:

δημόσια τάξη SimpleOrder {public SimpleOrder () {} public String getSymbol () {return Symbol; } public int getQuantity () {{περιγραφική επιστροφή Ποσότητα; } / ** * Ένα έγκυρο σύμβολο μετοχής. * * @see Ένα μεγάλο βιβλίο με έγκυρα σύμβολα για περισσότερες πληροφορίες. * / ιδιωτικό σύμβολο συμβολοσειράς; / ** * Ο συνολικός όγκος παραγγελιών. * * @mytag Η προσαρμοσμένη ετικέτα μου. * / private int Quantity; ιδιωτικό String OrderType; ιδιωτική τιμή Διάρκεια ιδιωτικής συμβολοσειράς; ιδιωτικός τύπος λογαριασμού; Private int TransactionType; } 

Αφού συντάξετε αυτά τα αρχεία, επικαλέστε το εργαλείο Javadoc χρησιμοποιώντας αυτήν την εντολή:

javadoc -private -doclet codegen.samples.SimpleDoclet SimpleOrder.java 

ο -ιδιωτικός Η επιλογή λέει στον Javadoc να εκθέτει πληροφορίες για το ιδιωτικό πεδίο και τη μέθοδο, και το -έπιπλο Η επιλογή λέει στον Javadoc τι doclet να επικαλεσθεί. Η τελευταία παράμετρος είναι το αρχείο προς ανάλυση. Η έξοδος του προγράμματος είναι η ακόλουθη:

Φόρτωση αρχείου πηγής SimpleOrder.java ... Κατασκευή πληροφοριών Javadoc ... Μέθοδοι ------- Μέθοδος: name = getSymbol Μέθοδος: name = getQuantity Fields ------ Πεδίο: name = Symbol, comment = A valid σύμβολο μετοχής., type = java.lang.String; Field Tag Name = @see Field Tag Value = Ένα μεγάλο βιβλίο με έγκυρα σύμβολα για περισσότερες πληροφορίες. Πεδίο: όνομα = Ποσότητα, σχόλιο = Ο συνολικός όγκος παραγγελίας., Type = int; Όνομα ετικέτας πεδίου = @mytag Τιμή ετικέτας πεδίου = Η προσαρμοσμένη ετικέτα μου. Πεδίο: name = OrderType, comment =, type = java.lang.String; Πεδίο: name = Price, comment =, type = float; Πεδίο: όνομα = Διάρκεια, σχόλιο =, type = java.lang.String; Πεδίο: name = AccountType, comment =, type = int; Πεδίο: name = TransactionType, comment =, type = int; 

Το δείγμα κώδικα δείχνει ότι το API Doclet περιέχεται στο πακέτο com.sun.javadoc. Δεδομένου ότι συνδέεστε στο εργαλείο Javadoc και δεν δημιουργείτε αυτόνομη εφαρμογή, το Javadoc καλεί το έγγραφο σας από τη μέθοδο δημόσια στατική boolean έναρξη (RootDoc ​​root).

Μόλις το αρχή η μέθοδος εκτελεί, RootDoc κατέχει όλες τις πληροφορίες που αναλύθηκαν από τον Javadoc. Στη συνέχεια, μπορείτε να ξεκινήσετε να περπατάτε σε όλες τις αναλυμένες κατηγορίες, κάνοντας χρήση της μεθόδου τάξεις () επί RootDoc. Αυτή η μέθοδος επιστρέφει ένα ClassDoc πίνακας που περιγράφει όλες τις αναλυμένες κατηγορίες. ClassDoc με τη σειρά του περιέχει μεθόδους όπως πεδία () και μέθοδοι (). Αυτές οι μέθοδοι επιστρέφουν FieldDoc και Μέθοδος Doc πίνακες που περιγράφουν όλα τα πεδία και τις μεθόδους της κατηγορίας ανάλυσης. Όλες οι τάξεις "Doc" περιέχουν τη μέθοδο ετικέτες, που επιστρέφει a Ετικέτα πίνακας που περιγράφει τόσο τις προσαρμοσμένες όσο και τις τυπικές ετικέτες Javadoc. Η τυπική ετικέτα που χρησιμοποιείται σε αυτό το παράδειγμα είναι @βλέπω.

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

Επαναχρησιμοποιήσιμες κλάσεις για δημιουργία κώδικα

Υπό το φως του παραπάνω παραδείγματος, ελπίζω να συμφωνήσετε ότι η δημιουργία των δικών σας φυλλαδίων και η εξαγωγή των πληροφοριών τάξης χρησιμοποιώντας το Doclet API είναι εύκολη. Το επόμενο βήμα για την ανάλυση των κλάσεων Java και τη δημιουργία κώδικα σε ένα αρχείο είναι σχετικά απλό. Για να διευκολύνω τη δημιουργία εγγράφων δημιουργίας κώδικα, ανέπτυξα ένα μικρό σύνολο διεπαφών και αφηρημένων βασικών κλάσεων. Το διάγραμμα τάξης αυτών των τάξεων χρησιμότητας φαίνεται παρακάτω.

Η διεπαφή Κατασκευαστής ορίζει την υπογραφή της μεθόδου δημόσιο άκυρο μάρκα (ClassDoc classdoc) που θα χρησιμοποιήσετε για να αλληλεπιδράσετε με τους δημιουργούς κώδικα. Η αφηρημένη τάξη CodeMaker παρέχει προεπιλεγμένες εφαρμογές για χειρισμό αρχείων και εσοχών, οι οποίες είναι κοινές σε όλες τις συσκευές δημιουργίας κώδικα. Οι συγκεκριμένοι δημιουργοί κώδικα κληρονομούν από την αφηρημένη βασική κλάση και παρέχουν μια εφαρμογή του φτιαχνω, κανω μέθοδος. ο φτιαχνω, κανω μέθοδος έχει την τάξη ClassDoc ως επιχείρημα, όχι RootDoc. Αυτό προκαλεί το Κατασκευαστής για να εισαγάγετε τη λογική δημιουργίας κωδικών σε επίπεδο κλάσης.

Όλες οι τάξεις που αναλύονται από τον Javadoc περνούν με τη μέθοδο προσθήκης doclets αρχή. Ένα παράδειγμα για το πώς γίνεται αυτό (περιγράφεται στο αρχείο SimpleMakerDoclet.java) εμφανίζεται παρακάτω:

δημόσια στατική boolean έναρξη (RootDoc ​​root) {ClassDoc [] class = root.classes (); // Ρύθμιση του CodeMakers για εκτέλεση του Maker simplemaker = νέο SimpleCodeMaker ("Description Maker"); // Επαναλάβετε όλες τις τάξεις και εκτελέστε τη μέθοδο "make" του Maker για (int i = 0; i <class.length; i ++) {ClassDoc classdoc = class [i]; simplemaker.make (classdoc); } επιστροφή αληθινή; } 

Ακολουθούν τμήματα του κώδικα από μια απλή γεννήτρια κώδικα που ονομάζεται SimpleCodeMaker, που εκτελεί την ίδια εργασία με το SimpleDoclet προηγουμένως αναφέρονται. Αντί να στείλετε την έξοδο στην οθόνη, SimpleCodeMaker το αποθηκεύει σε ένα αρχείο στον υποκατάλογο γυαλιά ηλίου. Η εφαρμογή του φτιαχνω, κανω Η μέθοδος γίνεται επίσης πιο δομημένη με ξεχωριστές μεθόδους για την επεξεργασία πεδίων και μεθόδων. Μόνο οι μέθοδοι φτιαχνω, κανω και μέθοδοι μεθόδων αναφέρονται εδώ για συντομία.

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