Programiranje

Ustvarjanje kode z uporabo Javadoca

Samodejna generacija kode je vse pogostejša pri razvoju programske opreme, kar je posledica potrebe po skrivanju zapletenosti pred razvijalcem programske opreme in sprejemanja različnih standardnih in dejanskih standardnih vmesnikov za programiranje aplikacij. Skrivanje zapletenosti pred razvijalcem lahko dokažemo z ustvarjanjem razredov škrbine in okostja v CORBA iz opisov njihovih jezikovnih definicij vmesnikov in z nekaterimi objektno usmerjenimi bazami podatkov, ki ustvarijo potrebno vmesniško kodo za vztrajanje in pridobivanje predmetov iz baze podatkov.

Java vsebuje veliko API-jev, ki jih razvijalci Java dejansko štejejo za standarde. Zapletenost teh API-jev je od tistih, ki predstavljajo "jedro" jezika Java, do tistih, ki jih najdemo v platformi Java 2, Enterprise Edition. Na primer, Java Database Connectivity API predstavlja poenoteni vmesnik za interakcijo s podatkovnimi bazami različnih podjetij. Recimo, da želite, da se objekt Java lahko vztraja v zbirki podatkov z izvajanjem preprostega shrani () metoda, ki preslika atribute predmeta v tabelo baze podatkov. Ta metoda bi ekstrahirala atribute iz predmeta in uporabila API JDBC za izdelavo stavka JDBC, ki se izvrši proti bazi podatkov. Po izvedbi shrani () za nekaj razredov začnete videti podobnosti v strukturi kode in ponavljajočo se naravo izvajanja te metode. Pogosto je treba osnovne atribute predmeta transliterirati in "priključiti" na ustrezen Java API. Takrat je lahko generator kode uporabno orodje, ki ga imate v svoji programski orodjarni.

Z uporabo generatorja kode lahko avtomatizirate postopek nekaterih dolgočasnih, ponavljajočih se in k napakam nagnjenih nalog. Dejstvo, da priklopite na znane API-je, povečuje uporabnost takega orodja, saj je uporabno za široko občinstvo razvijalcev. Poleg tega se lahko nekateri tipično "interni" ogrodji, specifični za domeno, štejejo tudi za fiksne cilje API-jev za generatorje kod.

Generator kod je lahko orodje za prihranek časa, ki poveča kakovost kode in uvede bolj formalni in avtomatiziran pristop k delu razvojnega cikla. Druga prednost samodejnega ustvarjanja kode je sinhronizacija definicij objektov v različnih programskih jezikih. V mnogih tesno vezanih aplikacijah mora biti isti poslovni objekt (na primer naročilo za nakup delnic) dosledno predstavljen v C ++, Java in SQL. Zmožnost prikazovanja različnih predstav iz skupnega modela je na voljo v različnih orodjih za modeliranje; vendar se mi je zdelo nerodno uporabljati ta orodja za dosego zahtevane ravni prilagajanja. Namenski generator kod po meri je dovolj preprost za ustvarjanje in vas ne veže v določeno orodje za modeliranje.

Pot do Javadoca

Pot, ki jo je moja ekipa izbrala Javadoc za namene generiranja kode, je bila nekoliko dolga in verjetno običajna. V zgodnjih izvedbah smo s pomočjo Perlovih skriptov razčlenili slovnico metapodatkov po meri v besedilni datoteki. To je bila priložnostna rešitev in dodajanje dodatnih izhodnih formatov je bilo težko. Naš drugi, kratkotrajni poskus je bil spremeniti obstoječi prevajalnik IDL, ki temelji na Javi. Kmalu smo ugotovili, da je treba uvesti dodatne ključne besede IDL za pošiljanje namigov generatorju kod. Razširitev IDL-ja ali celo začeti od začetka z orodji, kot sta lex in yacc (ki izvorno datoteko razdelijo na žetone in definirajo kodo, ki se prikliče za vsak prepoznan žeton), osebno ni bilo všeč. (Za več informacij glejte Viri.)

Tretja bolj obetavna rešitev je bila opis metapodatkov razreda z uporabo XML. Določitev sheme XML DTD in ustvarjanje dokumentov XML za opis razredov se je zdelo naravno. Datoteko je bilo nato mogoče preveriti in enostavno razčleniti. Da bi se izognil začetku iz nič, sem ugotovil, da je nekdo poskusil ustvariti podoben XML DTD, in kmalu sem naletel na XMI. XMI je popoln opis UML z uporabo XML in se zdaj uporablja kot oblika izmenjave med orodji UML. (Za več informacij glejte Viri.)

Vendar pa so bili dokumenti XML, ki so opisovali razrede, zelo podrobni in jih je bilo težko ročno urejati. Preprosto preveč navidezno odvečnih oznak in opisov, da bi lahko spremenili en atribut razreda. Tudi manipuliranje datotek XML na ravni domene aplikacije je lahko precej dolgočasno. IBM alphaWorks izdela nabor orodij XMI, ki olajša obdelavo dokumentov XML, ki temeljijo na XMI, vendar je API orodij XMI za obdelavo opisov razredov zelo podoben API-ju Java Reflection ali Doclet. S tem v mislih se je moja organizacija odločila za pristop doclet, ki je bil uspešen.

Predstavljamo Javadoc

Javadoc je program, ki se uporablja za ustvarjanje dokumentacije Java API v obliki HTML. Razdeljen je kot del Java SDK, njegova izhodna stopnja pa je zasnovana tako, da jo je mogoče razširiti z ustvarjanjem doclet. API Doclet ponuja infrastrukturo za dostop do vseh vidikov datoteke izvorne kode Java, ki jo je razčlenil Javadoc. Z uporabo API-ja Doclet, ki je podoben API-ju Reflection, se lahko sprehodite po opisu razreda Java, dostopate do oznak Javadoc po meri in zapisujete izhodne datoteke. Standardni dokument, ki se uporablja za izdelavo dokumentacije HTML, počne prav to; zapisuje datoteke HTML, ko prečka vso izvorno kodo Java. Podrobnejše informacije o Javadocu najdete v virih.

Z ustvarjanjem preprostih razredov Java, ki vsebujejo atribute in nekatere Javadoc oznake po meri, jim omogočite, da služijo kot preprost opis metapodatkov za generiranje kode. Javadoc razčleni te razrede metapodatkov in doclets po meri dostopajo do informacij o razredu metapodatkov, da ustvarijo konkretne izvedbe razreda metapodatkov v določenih programskih jezikih, kot so Java, C ++ ali SQL. Ustvarite lahko tudi različice standardnega docleta, ki ustvari preproste tabele HTML, ki opisujejo razred metapodatkov, kar bi bilo primerno vključiti v dokument za obdelavo besedil. Ti razredi Java metapodatkov imajo isti namen kot opis IDL, katerega sintaksa je podobna C ++.

Uporaba Javadoca kot orodja za ustvarjanje kode ima več prednosti:

  • Ni vam treba pisati nobene kode za razčlenjevanje; razčlenjevanje metapodatkovnih razredov izvaja Javadoc in je predstavljen v enostavnem API-ju.
  • Z uporabo oznak Javadoc po meri dodate ravno toliko prilagodljivosti, da lahko med generiranjem kode definirate posebne kljuke.
  • Ker so vrste Java dobro definirane, je int 32 bitov; zato vam ni treba uvesti dodatnih ključnih besed primitivnega tipa, da dosežete to raven jasnosti.
  • V razredih metapodatkov Java za sintakso in druge napake lahko preverite s prevajanjem.

Predstavljamo doclets

Preden skočim v dokument, ki se uporablja za ustvarjanje kode, bom predstavil preprost primer "Hello World", ki razkriva ustrezne dele, kako ustvariti, zagnati in igrati z API-jem Doclet. Vzorčna koda za SimpleDoclet je podano spodaj. (Izvorno kodo za ta članek lahko dobite v programu Resources.) Če menite, da je ta koda nekoliko daljša za pravi program "Hello World", spletno mesto Sun ponuja še preprostejši dokument, ki vam bo pomagal začeti. (Glej vire.)

paket codegen.samples; uvoz com.sun.javadoc. *; uvoz java.text. *; javni statični logični začetek (RootDoc ​​root) {// ponavljanje po vseh razredih. ClassDoc [] razredi = root.classes (); for (int i = 0; i <classes.length; i ++) {// pregleduje vse metode in natisne njihova imena. MethodDoc [] metode = razredi [i] .methods (); out ("Metode"); ven ("-------"); za (int j = 0; j

Zgornji dokument natisne opisne informacije o razredih, metodah, poljih in nekatere informacije o oznakah Javadoc za razred SimpleOrder.java navedeno spodaj:

javni razred SimpleOrder {public SimpleOrder () {} javni niz getSymbol () {return Symbol; } public int getQuantity () {{opisna vrnitev Količina; } / ** * Veljaven simbol zaloge. * * @ glej veliko knjigo veljavnih simbolov za več informacij. * / zasebni simbol v nizu; / ** * Skupni obseg naročila. * * @mytag Moja oznaka po meri. * / private int Količina; private String OrderType; zasebni plovec Cena; trajanje zasebnega niza; private int AccountType; private int TransactionType; } 

Po prevajanju teh datotek prikličete orodje Javadoc s tem ukazom:

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

The -privatni Možnost pove Javadocu, da razkrije informacije o zasebnem polju in metodi, in -doclet Možnost Javadoc-u pove, kateri dokument naj prikliče. Zadnji parameter je datoteka, ki jo je treba razčleniti. Rezultat programa je naslednji:

Nalaganje izvorne datoteke SimpleOrder.java ... Oblikovanje informacij Javadoc ... Metode ------- Metoda: name = getSymbol Metoda: name = getQuantity Polja ------ Polje: name = Simbol, komentar = Veljaven simbol delnice., type = java.lang.String; Ime oznake polja = @see Vrednost oznake polja = Velika knjiga veljavnih simbolov za več informacij. Polje: ime = Količina, komentar = Skupna količina naročila., Vrsta = int; Ime oznake polja = @mytag Vrednost oznake polja = Moja oznaka po meri. Polje: ime = vrsta naročila, komentar =, vrsta = java.lang.String; Polje: ime = Cena, komentar =, vrsta = float; Polje: ime = Trajanje, komentar =, vrsta = java.lang.String; Polje: ime = vrsta računa, komentar =, vrsta = int; Polje: ime = TransactionType, komentar =, type = int; 

Vzorčna koda kaže, da je v paketu API Doclet com.sun.javadoc. Ker ste priključeni na orodje Javadoc in ne ustvarjate samostojne aplikacije, Javadoc pokliče vaš dokument iz metode javni statični logični začetek (RootDoc ​​root).

Ko je začetek metoda se izvaja, RootDoc vsebuje vse podatke, ki jih je razčlenil Javadoc. Nato lahko začnete hoditi po vseh razčlenjenih razredih tako, da prikličete metodo razredi () na RootDoc. Ta metoda vrne a ClassDoc polje, ki opisuje vse razčlenjene razrede. ClassDoc pa vsebuje metode, kot so polja () in metode (). Te metode se vrnejo FieldDoc in MethodDoc polja, ki opisujejo vsa polja in metode razčlenjenega razreda. Vsi razredi "Doc" vsebujejo metodo oznake, ki vrne a Oznaka polje, ki opisuje oznake po meri in standard Javadoc. Standardna oznaka, uporabljena v tem primeru, je @ glej.

The ven () metoda preprosto zavije standardni izhod in MessageFormat class pomaga oblikovati izhod v skladu s fiksno predlogo.

Razredi za večkratno uporabo za generiranje kode

V luči zgornjega primera upam, da se strinjate, da je ustvarjanje lastnih docletov in pridobivanje podatkov o razredu z API-jem Doclet enostavno. Naslednji korak pri razčlenjevanju razredov Java in ustvarjanju kode v datoteki je razmeroma preprost. Da bi olajšal ustvarjanje docletov za generiranje kode, sem razvil majhen nabor vmesnikov in abstraktnih osnovnih razredov. Diagram razredov teh razredov uporabnosti je prikazan spodaj.

Vmesnik Ustvarjalec definira podpis metode javna razveljavitev (ClassDoc classdoc) ki jih boste uporabili za interakcijo s svojimi generatorji kod. Abstraktni razred CodeMaker ponuja privzete izvedbe za manipulacijo datotek in zamikov, ki so skupne vsem generatorjem kod. Posebni generatorji kode podedujejo iz abstraktnega osnovnega razreda in zagotavljajo izvedbo naredite metoda. The naredite metoda ima razred ClassDoc kot argument, ne RootDoc. To povzroča Ustvarjalec za vnos logike generiranja kode na ravni razreda.

Vsi razredi, ki jih je razčlenil Javadoc, so v metodi vtičnikov doclets zaokroženi začetek. Primer, kako se to naredi (opisano v datoteki SimpleMakerDoclet.java), je prikazan spodaj:

javni statični logični začetek (RootDoc ​​root) {ClassDoc [] classes = root.classes (); // Nastavitev CodeMakerjev za zagon programa Maker simplemaker = new SimpleCodeMaker ("Maker opisov"); // Iteracija skozi vse razrede in izvedba metode "make", za katero je izdelovalec (int i = 0; i <classes.length; i ++) {ClassDoc classdoc = classes [i]; simplemaker.make (classdoc); } vrni true; } 

Sledijo deli kode preprostega generatorja kod, ki se imenuje SimpleCodeMaker, ki izvaja enako nalogo kot SimpleDoclet prej navedeni. Namesto da pošljete izhod na zaslon, SimpleCodeMaker shrani v datoteko v podimeniku genclasses. Izvajanje naredite metoda postaja tudi bolj strukturirana z ločenimi metodami za obdelavo polj in metod. Samo metode naredite in processMethods so tukaj navedeni za kratkost.

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