Ohjelmointi

Koodin luominen Javadocin avulla

Automaattinen koodinmuodostus on yleistymässä ohjelmistokehityksessä, mikä johtuu tarpeesta piilottaa monimutkaisuus ohjelmistokehittäjältä ja erilaisten standardien ja tosiasiallisesti sovellusten ohjelmointirajapintojen hyväksymisestä. Monimutkaisuuden piilottaminen kehittäjältä voidaan osoittaa luomalla tynkä- ja luurankoluokkia CORBA: ssa niiden käyttöliittymämäärittelykielen kuvauksista ja joillakin olio-orientoiduilla tietokannoilla, jotka luovat tarvittavan sovituskoodin objektien säilyttämiseksi ja noutamiseksi tietokannasta.

Java sisältää monia sovellusliittymiä, joita Java-kehittäjät pitävät tosiasiallisesti standardeina. Näiden sovellusliittymien monimutkaisuus vaihtelee niistä, jotka muodostavat Java-kielen "ytimen", Java 2 -alustan Enterprise Edition -versioon. Esimerkiksi Java Database Connectivity API tarjoaa yhdistävän käyttöliittymän vuorovaikutukseen eri yritysten tietokantojen kanssa. Oletetaan, että haluat Java-objektin pystyvän pysymään tietokannassa toteuttamalla yksinkertaisen Tallentaa() menetelmä, joka kartoittaa objektin määritteet tietokantataulukkoon. Tuo menetelmä purkaa attribuutit objektista ja rakentaa JDBC-sovellusliittymän avulla tietokantaan suoritettavan JDBC-käskyn. Toteuttamisen jälkeen Tallentaa() muutamalle luokalle, alat nähdä samanlaisuuden koodirakenteessa ja menetelmän toistamisen luonteen. Usein objektin perusominaisuudet on translitteroitava ja "kytkettävä" asianmukaiseen Java-sovellusliittymään. Silloin koodigeneraattori voi olla hyödyllinen työkalu ohjelmointityökalupakkiisi.

Koodigeneraattorin avulla voit automatisoida joidenkin tylsiä, toistuvia ja virheitä aiheuttavia koodaustehtäviä. Se, että olet liittämässä tunnettuja sovellusliittymiä, lisää tällaisen työkalun hyödyllisyyttä, koska sitä voidaan käyttää laajalle kehittäjien yleisölle. Lisäksi joitain tyypillisesti "talon sisäisiä" verkkotunnuskohtaisia ​​kehyksiä voidaan pitää myös kiinteinä API-kohteina koodigeneraattoreille.

Koodigeneraattori voi olla aikaa säästävä työkalu, joka parantaa koodin laatua ja ottaa käyttöön muodollisemman ja automatisoidun lähestymistavan osaan kehitysjaksoa. Toinen automaattisen koodinmuodostuksen etu on olomääritelmien synkronointi eri ohjelmointikielillä. Monissa tiukasti sidotuissa sovelluksissa sama liikeobjekti (esimerkiksi osakeostotilaus) on esitettävä johdonmukaisesti C ++, Java ja SQL. Kyky tuottaa erilaisia ​​esityksiä yhteisestä mallista on saatavana useilla mallinnustyökaluilla; Olen kuitenkin huomannut hankalaksi käyttää näitä työkaluja tarvittavan mukautustason saavuttamiseksi. Erillinen mukautettu koodigeneraattori on tarpeeksi yksinkertainen luoda eikä se sido sinua tiettyyn mallinnustyökaluun.

Polku Javadociin

Tiimini kuljettama tie valitsemalla Javadoc koodinmuodostustarkoituksiin oli jonkin verran pitkä ja luultavasti yleinen. Aikaisissa toteutuksissa käytimme Perl-komentosarjoja muokatun metatietokieliopin jäsentämiseen tekstitiedostossa. Tämä oli ad hoc -ratkaisu, ja uusien tulostusmuotojen lisääminen oli vaikeaa. Toinen, lyhytaikainen yrityksemme oli muokata olemassa olevaa Java-pohjaista IDL-kääntäjää. Pian tajusimme, että on tarpeen ottaa käyttöön muita IDL-avainsanoja, jotta vihjeitä voidaan lähettää koodigeneraattorille. IDL-laajennuksen tekeminen tai edes aloittaminen tyhjästä työkaluilla, kuten lex ja yacc (jotka jakavat lähdetiedoston tunnuksiksi ja määrittelevät koodin, jota kutsutaan jokaiselle tunnistetulle tunnukselle), eivät olleet henkilökohtaisesti maittavia. (Katso lisätietoja Resursseista.)

Kolmas lupaavampi ratkaisu oli kuvata luokan metatiedot XML: n avulla. XML DTD -mallin määritteleminen ja XML-dokumenttien luominen luokkien kuvaamiseksi tuntui luonnolliselta. Sitten tiedosto voitiin tarkistaa ja jäsentää helposti. Välttääksesi aloittamisen tyhjästä, ajattelin, että joku on yrittänyt luoda samanlaisen XML DTD: n, ja löysin pian XMI: n. XMI on täydellinen kuvaus UML: stä, joka käyttää XML: ää, ja sitä käytetään nyt vaihdon muotona UML-työkalujen välillä. (Katso lisätietoja Resursseista.)

Luokat kuvaavat XML-asiakirjat olivat kuitenkin erittäin yksityiskohtaisia ​​ja niitä oli vaikea muokata manuaalisesti. Ylivoimaisesti näennäisesti tarpeettomia tunnisteita ja kuvauksia on yksinkertaisesti liian monta, jotta voit muuttaa yhtä luokan määritettä. XML-tiedostojen käsittely sovellusverkkotasolla voi myös olla varsin tylsiä. IBM alphaWorks tuottaa XMI-työkalupaketin, joka helpottaa XMI-pohjaisten XML-asiakirjojen käsittelyä, mutta XMI-työkalupakki-sovellusliittymä luokkakuvausten käsittelyyn on erittäin samanlainen kuin Java Reflection- tai Doclet-sovellusliittymä. Tässä mielessä organisaatiosi päätti käyttää onnistunutta asiakirja-lähestymistapaa.

Esittelyssä Javadoc

Javadoc on ohjelma, jota käytetään HTML-muotoisen Java API -dokumentaation luomiseen. Se jaetaan osana Java SDK: ta ja sen ulostulovaihe on suunniteltu laajennettavaksi doclet-luomisen avulla. Doclet-sovellusliittymä tarjoaa infrastruktuurin käyttää kaikkia Java-lähdekooditiedostoja, joita Javadoc on jäsennellyt. Reflection API: n kaltaisen Doclet-sovellusliittymän avulla voit käydä läpi Java-luokan kuvauksen, käyttää mukautettuja Javadoc-tunnisteita ja kirjoittaa lähdön tiedostoon. HTML-dokumentaation tuottamiseen käytetty vakiotiedosto tekee juuri sen; se kirjoittaa HTML-tiedostoja, kun se kulkee kaiken Java-lähdekoodin läpi. Tarkempaa tietoa Javadocista löytyy Resursseista.

Luomalla yksinkertaisia ​​Java-luokkia, jotka sisältävät määritteitä ja joitain mukautettuja Javadoc-tunnisteita, annat näiden luokkien toimia yksinkertaisena metatietojen kuvauksena koodin luomiseen. Javadoc jäsentää nämä metatietoluokat, ja mukautetut ohjeet käyttävät metatietoluokan tietoja luodakseen metatietoluokan konkreettisia toteutuksia tietyillä ohjelmointikielillä, kuten Java, C ++ tai SQL. Voit myös luoda muunnelmia vakiotiedostosta, joka tuottaa yksinkertaiset HTML-taulukot, jotka kuvaavat metatietoluokkaa, mikä olisi tarkoituksenmukaista sisällyttää tekstinkäsittelyasiakirjaan. Nämä metatiedot Java-luokat palvelevat samaa tarkoitusta kuin IDL-kuvaus, jonka syntaksit ovat samanlaiset kuin C ++.

Javadocin käyttäminen koodinluontityökaluna on useita etuja:

  • Sinun ei tarvitse kirjoittaa mitään jäsentelykoodia; metatietoluokkien jäsentäminen suoritetaan Javadocin toimesta, ja se esitetään helppokäyttöisessä sovellusliittymässä.
  • Käyttämällä mukautettuja Javadoc-tunnisteita lisäät tarpeeksi joustavuutta määritellä erityiset koukut koodin luomisen aikana.
  • Koska Java-tyypit ovat hyvin määriteltyjä, int on 32 bittiä; sen vuoksi sinun ei tarvitse ottaa käyttöön uusia primitiivisiä tyyppisiä avainsanoja tämän selkeyden saavuttamiseksi.
  • Voit tarkistaa Java-metatietoluokkien syntaksin ja muut virheet kääntämällä.

Esitteitä

Ennen kuin hyppää koodin luomiseen käytettyyn docletiin, esitän yksinkertaisen "Hello World" -esimerkin, joka paljastaa Doclet-sovellusliittymän luomisen, suorittamisen ja pelaamisen asiaankuuluvat osat. Mallin koodi SimpleDoclet on annettu alla. (Voit hankkia tämän artikkelin lähdekoodin Resursseista.) Jos pidät tätä koodia jonkin verran pitkänä tosi "Hello World" -ohjelmalle, Sun-verkkosivusto tarjoaa vieläkin yksinkertaisemman ohjeiston, joka auttaa sinua pääsemään alkuun. (Katso Resurssit.)

paketti codegen.samples; tuonti com.sun.javadoc. *; tuo java.text. *; julkinen staattinen looginen aloitus (RootDoc-juuret) {// toista kaikki luokat. ClassDoc [] class = root.classes (); for (int i = 0; i <luokkien.pituus; i ++) {// toistaa kaikki menetelmät ja tulostaa niiden nimet. MethodDoc [] metodit = luokat [i]. Menetelmät (); ulos ("Menetelmät"); ulos ("-------"); varten (int j = 0; j

Yllä oleva opas tulostaa kuvaavia tietoja luokista, menetelmistä, kentistä ja joitain luokan Javadoc-tunnistetietoja SimpleOrder.java listattu alle:

public class SimpleOrder {public SimpleOrder () {} public String getSymbol () {return symboli; } public int getQuantity () {{escriptive return Quantity; } / ** * Voimassa oleva varastosymboli. * * @ Katso iso kirja voimassa olevista symboleista saadaksesi lisätietoja. * / yksityinen kielisymboli; / ** * Tilausten kokonaismäärä. * * @mytag Oma mukautettu tagi. * / yksityinen määrä; yksityinen merkkijono OrderType; yksityinen kelluva Hinta; yksityisen kielen kesto; yksityinen int AccountType; yksityinen int TransactionType; } 

Kun olet koonnut nämä tiedostot, vedot Javadoc-työkaluun tällä komennolla:

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

- yksityinen -vaihtoehto kertoo Javadocille paljastaa yksityiset kenttä- ja menetelmätiedot sekä -doclet -vaihtoehto kertoo Javadocille, mitä docletia on käytettävä. Viimeinen parametri on jäsennettävä tiedosto. Ohjelman tulos on seuraava:

Ladataan lähdetiedostoa SimpleOrder.java ... Javadoc-tietojen rakentaminen ... Methods ------- Method: name = getSymbol Method: name = getQuantity Fields ------ Field: name = Symbol, comment = A valid varastosymboli., type = java.lang.String; Kenttätunnuksen nimi = @ katso Kenttätunnuksen arvo = iso kirja kelvollisista symboleista saadaksesi lisätietoja. Kenttä: nimi = Määrä, kommentti = Tilauksen kokonaismäärä., Tyyppi = int; Kenttätagin nimi = @mytag Kenttätagin arvo = Oma mukautettu tagi. Kenttä: nimi = OrderType, kommentti =, type = java.lang.String; Kenttä: nimi = hinta, kommentti =, tyyppi = kelluva; Kenttä: nimi = Kesto, kommentti =, kirjoita = java.lang.String; Kenttä: nimi = AccountType, kommentti =, type = int; Kenttä: nimi = TransactionType, kommentti =, tyyppi = int; 

Esimerkkikoodi osoittaa, että Doclet-sovellusliittymä sisältyy pakettiin com.sun.javadoc. Koska olet liittämässä Javadoc-työkalua etkä luo itsenäistä sovellusta, Javadoc kutsuu asiakirjasi metodista julkinen staattinen looginen aloitus (RootDoc-juuret).

Kun alkaa menetelmä suoritetaan, RootDoc sisältää kaikki Javadocin jäsentämät tiedot. Voit sitten aloittaa kaikkien jäsennettyjen luokkien läpikäynnin menetelmällä luokat() päällä RootDoc. Tuo menetelmä palauttaa a ClassDoc taulukko, joka kuvaa kaikki jäsennetyt luokat. ClassDoc puolestaan ​​sisältää menetelmiä, kuten kentät () ja menetelmät (). Nämä menetelmät palaavat FieldDoc ja MethodDoc taulukot, jotka kuvaavat kaikkia jäsennetyn luokan kenttiä ja menetelmiä. Kaikki "Doc" -luokat sisältävät menetelmän tunnisteet, joka palauttaa a Tag taulukko, joka kuvaa sekä mukautettuja että tavallisia Javadoc-tunnisteita. Tässä esimerkissä käytetty vakiotunniste on @see.

ulos () menetelmä yksinkertaisesti kääri vakiotuloksen, ja MessageFormat luokka auttaa muotoilemaan tuloksen kiinteän mallin mukaan.

Uudelleenkäytettävät luokat koodien luomista varten

Yllä olevan esimerkin valossa toivon, että olet samaa mieltä siitä, että omien ohjeiden luominen ja luokkatietojen noutaminen Doclet-sovellusliittymän avulla on helppoa. Seuraava vaihe Java-luokkien jäsentämiseen ja koodin luomiseen tiedostoon on suhteellisen yksinkertainen. Koodin luontidokumenttien luomisen helpottamiseksi kehitin pienen joukon rajapintoja ja abstrakteja perusluokkia. Näiden hyödyllisyysluokkien luokkakaavio on esitetty alla.

Käyttöliittymä Luoja määrittää menetelmän allekirjoituksen public void make (ClassDoc classdoc) jota käytät vuorovaikutuksessa koodigeneraattoreidesi kanssa. Abstrakti luokka CodeMaker tarjoaa oletustoteutukset tiedostojen ja sisennysten manipuloimiseksi, jotka ovat yhteisiä kaikille koodigeneraattoreille. Erityiset koodigeneraattorit perivät abstraktista perusluokasta ja tarjoavat toteutuksen tehdä menetelmä. tehdä menetelmä on luokka ClassDoc argumenttina, ei RootDoc. Se aiheuttaa Luoja syöttää koodin luontilogiikka luokan tasolla.

Kaikki Javadocin jäsentämät luokat kytketään doclet-laajennusmenetelmään alkaa. Alla on esimerkki siitä, miten se tehdään (kuvattu tiedostossa SimpleMakerDoclet.java):

julkinen staattinen looginen aloitus (RootDoc-juuret) {ClassDoc [] class = root.classes (); // Määritä CodeMakers suorittamaan Maker simplemaker = new SimpleCodeMaker ("Description Maker"); // Toista kaikki luokat ja suorita Maker-menetelmä "make" (int i = 0; i <luokkien.pituus; i ++) {ClassDoc classdoc = luokat [i]; yksinkertaisvalmistaja.make (classdoc); } return true; } 

Seuraavassa on osa yksinkertaisen koodigeneraattorin koodia SimpleCodeMaker, joka suorittaa saman tehtävän kuin SimpleDoclet aiemmin lueteltu. Lähdön lähettämisen sijaan näyttöön SimpleCodeMaker tallentaa sen alihakemiston tiedostoon genclasses. Ohjelman täytäntöönpano tehdä menetelmä on myös strukturoitumassa erillisillä menetelmillä kenttien ja menetelmien käsittelemiseksi. Vain menetelmät tehdä ja prosessimenetelmät on lueteltu tässä lyhyyden vuoksi.

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