Programavimas

Kodo generavimas naudojant „Javadoc“

Automatinis kodų generavimas tampa vis dažnesnis programinės įrangos kūrimo rezultatas - poreikis slėpti sudėtingumą nuo programinės įrangos kūrėjo ir įvairių standartinių bei de facto standartinių programų programavimo sąsajų priėmimas. Slėpti sudėtingumą nuo kūrėjo galima įrodyti kuriant „stub“ ir „skeleto“ klases CORBA iš jų sąsajos apibrėžimo kalbų aprašymų ir kai kurių į objektą orientuotų duomenų bazių, kurios sukuria reikiamą adapterio kodą, kad būtų galima išlaikyti ir nuskaityti objektus iš duomenų bazės.

„Java“ yra daugybė API, kurias „Java“ kūrėjai laiko de facto standartais. Šių API sudėtingumas svyruoja nuo tų, kurie sudaro „Java“ kalbos „branduolį“, iki tų, kurie rasti „Java 2“ platformoje, „Enterprise Edition“. Pavyzdžiui, „Java Database Connectivity API“ pateikia vienijančią sąsają sąveikai su įvairių įmonių duomenų bazėmis. Tarkime, kad norite, kad „Java“ objektas galėtų išlikti duomenų bazėje įgyvendindamas paprastą sutaupyti() metodas, kuris objekto atributus susieja su duomenų bazės lentele. Šis metodas išgautų atributus iš objekto ir panaudotų JDBC API, kad sukurtumėte JDBC sakinį, kuris vykdomas pagal duomenų bazę. Įgyvendinus sutaupyti() metodas kelioms klasėms, jūs pradėsite matyti kodo struktūros panašumus ir pasikartojantį šio metodo įgyvendinimą. Dažnai pagrindinius objekto atributus reikia transliteruoti ir „prijungti“ prie atitinkamos „Java“ API. Būtent tada kodų generatorius gali būti naudingas įrankis, kurį turite turėti savo programavimo įrankių rinkinyje.

Naudodami kodų generatorių galite automatizuoti kai kurių varginančių, pasikartojančių ir linkusių į klaidas kodavimo užduočių procesą. Tai, kad jungiatės prie gerai žinomų API, padidina tokio įrankio naudingumą, nes jis taikomas plačiai kūrėjų auditorijai. Be to, kai kurios „vidaus“ domenui būdingos sistemos taip pat gali būti laikomos fiksuotomis API taikomosiomis kodų generatorių programomis.

Kodo generatorius gali būti laiko taupymo įrankis, kuris padidina kodo kokybę ir įveda oficialesnį ir automatizuotą požiūrį į dalį kūrimo ciklo. Kitas automatizuoto kodo generavimo privalumas yra objektų apibrėžimų sinchronizavimas įvairiomis programavimo kalbomis. Daugelyje griežtai susietų programų tas pats verslo objektas (pvz., Užsakymas įsigyti akcijų) turi būti nuolat vaizduojamas C ++, Java ir SQL. Galimybė pateikti skirtingus vaizdus iš bendro modelio yra prieinama įvairiuose modeliavimo įrankiuose; tačiau man pasidarė nepatogu naudoti tas priemones norint pasiekti reikiamą pritaikymo lygį. Specialus tinkinto kodo generatorius yra pakankamai paprastas, kad jį būtų galima sukurti ir jis nepririša jūsų prie konkretaus modeliavimo įrankio.

Kelias į „Javadoc“

Mano komandos kelias, pasirinktas „Javadoc“ kodų generavimo tikslais, buvo šiek tiek ilgas ir tikriausiai įprastas. Ankstyvuose diegimuose „Perl“ scenarijus naudojome pasirinktinių metaduomenų gramatikos analizavimui tekstiniame faile. Tai buvo ad hoc sprendimas, todėl pridėti papildomų išvesties formatų buvo sunku. Antrasis, trumpalaikis mūsų bandymas buvo modifikuoti esamą „Java“ pagrįstą IDL kompiliatorių. Netrukus supratome, kad norint įvesti užuominas į kodų generatorių, reikės įvesti papildomus IDL raktinius žodžius. IDL išplėtimas ar net pradedant nuo nulio naudojant tokius įrankius kaip „lex“ ir „yacc“ (kurie padalija šaltinio failą į žetonus ir nustato kodą, kuris yra iškviečiamas kiekvienam atpažintam žetonui), asmeniškai nebuvo malonu. (Daugiau informacijos rasite šaltiniuose.)

Trečias perspektyvesnis sprendimas buvo aprašyti klasės metaduomenis naudojant XML. XML DTD schemos apibrėžimas ir XML dokumentų sukūrimas klasėms apibūdinti atrodė natūralus dalykas. Tada failą buvo galima patikrinti ir lengvai analizuoti. Kad nepradėčiau nuo nulio, supratau, kad kažkas turėjo bandyti sukurti panašų XML DTD, ir netrukus susidūriau su XMI. XMI yra išsamus UML aprašymas, naudojant XML, ir dabar jis naudojamas kaip mainų formatas tarp UML įrankių. (Daugiau informacijos rasite šaltiniuose.)

Tačiau XML dokumentai, apibūdinantys klases, buvo nepaprastai išsamūs ir sunkiai rankiniu būdu redaguojami. Atrodo, kad atrodo per daug nereikalingų žymių ir aprašymų, kuriuos reikia ravėti, kad galėtumėte pakeisti vienos klasės atributą. Be to, manipuliuoti XML failais programos domeno lygiu gali būti gana varginantis. „IBM alphaWorks“ sukuria XMI įrankių rinkinį, kuris žymiai palengvina XMI pagrindu sukurtų XML dokumentų apdorojimą, tačiau XMI įrankių rinkinio API, skirta manipuliuoti klasių aprašais, yra labai panaši į „Java Reflection“ arba „Doclet“ API. Atsižvelgdama į tai, mano organizacija nusprendė naudoti „doclet“ metodą, kuris buvo sėkmingas.

Pristatome „Javadoc“

„Javadoc“ yra programa, naudojama kuriant HTML formato „Java“ API dokumentus. Jis platinamas kaip „Java SDK“ dalis, o jo išvesties stadija sukurta taip, kad ją būtų galima išplėsti kuriant docletą. „Doclet“ API suteikia infrastruktūrą, kad būtų galima pasiekti visus „Java“ šaltinio kodo failo, kurį analizavo „Javadoc“, aspektus. Naudodami „Doclet“ API, kuri yra panaši į „Reflection“ API, galite pereiti prie „Java“ klasės aprašymo, pasiekti pasirinktines „Javadoc“ žymas ir įrašyti išvestį į failą. Standartinė instrukcija, naudojama kuriant HTML dokumentus, tai ir daro; jis išrašo HTML failus, kai praeina visą Java šaltinio kodą. Išsamesnę informaciją apie „Javadoc“ galite rasti šaltiniuose.

Sukurdami paprastas „Java“ klases, kuriose yra atributų ir kai kurių pasirinktinių „Javadoc“ žymų, leidžiate šioms klasėms naudoti paprastą metaduomenų aprašą kodų generavimui. „Javadoc“ analizuoja tas metaduomenų klases, o pasirinktiniai docletai pasiekia metaduomenų klasės informaciją, kad sukurtų konkrečius metaduomenų klasės diegimus konkrečiomis programavimo kalbomis, tokiomis kaip „Java“, „C ++“ ar „SQL“. Taip pat galite sukurti standartinio dokumento variantus, kurie sukuria paprastas HTML lenteles, apibūdinančias metaduomenų klasę, kurias būtų tikslinga įtraukti į teksto apdorojimo dokumentą. Tos metaduomenų „Java“ klasės atlieka tą patį tikslą kaip ir IDL aprašas, kurio sintaksė yra panaši į C ++.

„Javadoc“ naudojimas kaip kodo generavimo įrankiui turi keletą privalumų:

  • Jums nereikia rašyti jokio analizavimo kodo; metaduomenų klases analizuoja „Javadoc“ ir pateikia lengvai naudojamoje API.
  • Naudodami pasirinktines „Javadoc“ žymas pridėsite pakankamai lankstumo, kad generuodami kodą galėtumėte apibrėžti specialius kabliukus.
  • Kadangi „Java“ tipai yra gerai apibrėžti, int yra 32 bitai; todėl jums nereikia įvesti papildomų primityvių tipų raktinių žodžių, kad pasiektumėte tą aiškumo lygį.
  • Kompiliuodami galite patikrinti, ar „Java“ metaduomenų klasėse nėra sintaksės ir kitų klaidų.

Pristatome lankstinukus

Prieš pereidamas į kodų generavimui naudojamą informacinį failą, pateiksiu paprastą „Hello World“ pavyzdį, kuriame pateikiamos atitinkamos dalys, kaip kurti, paleisti ir žaisti naudojant „Doclet“ API. Pavyzdinis kodas „SimpleDoclet“ yra pateiktas žemiau. (Šio straipsnio šaltinio kodą galite rasti „Resources“.) Jei manote, kad tikrasis „Hello World“ programos kodas yra šiek tiek ilgas, „Sun“ svetainėje pateikiama dar paprastesnė instrukcija, kuri padės jums pradėti. (Žr. Šaltinius.)

paketas codegen.samples; importuoti com.sun.javadoc. *; importuoti java.text. *; viešoji statinė loginė pradžia (RootDoc ​​šaknis) {// kartojasi visose klasėse. ClassDoc [] klases = šaknis.klasės (); for (int i = 0; i <klases.length; i ++) {// kartoja visus metodus ir spausdina jų pavadinimus. MethodDoc [] metodai = klasės [i] .metodos (); out („Metodai“); out ("-------"); už (int j = 0; j

Pirmiau pateiktoje instrukcijoje atspausdinta aprašomoji klasių informacija, metodai, laukai ir tam tikra klasės „Javadoc“ žymos informacija SimpleOrder.java išvardyti žemiau:

public class SimpleOrder {public SimpleOrder () {} public String getSymbol () {return Symbol; } public int getQuantity () {{escriptive return Quantity; } / ** * Galiojantis akcijų simbolis. * * @ Daugiau informacijos rasite didelėje galiojančių simbolių knygoje. * / privatus stygų simbolis; / ** * Bendra užsakymų apimtis. * * @mytag Mano tinkinta žyma. * / privatus int Kiekis; privati ​​eilutė „OrderType“; privati ​​plūdė Kaina; privačios stygos trukmė; private int AccountType; private int TransactionType; } 

Sudarę šiuos failus, iškviečiate „Javadoc“ įrankį naudodami šią komandą:

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

-privatus parinktis liepia „Javadoc“ atskleisti informaciją apie privatų lauką ir metodą, o -doclet parinktis „Javadoc“ nurodo, kokią instrukciją reikia naudoti. Paskutinis parametras yra analizuojamas failas. Programos rezultatas yra toks:

Įkeliamas šaltinio failas SimpleOrder.java ... „Javadoc“ informacijos konstravimas ... Metodai ------- Method: name = getSymbol Method: name = getQuantity Fields ------ Field: name = Symbol, comment = A valid akcijų simbolis., type = java.lang.String; Lauko žymos pavadinimas = @ žr. Lauko žymos vertė = didelė galiojančių simbolių knyga, kad gautumėte daugiau informacijos. Laukas: pavadinimas = kiekis, komentaras = bendras užsakymo kiekis., Tipas = int; Lauko žymos pavadinimas = @mytag Lauko žymos vertė = Mano tinkinta žyma. Laukas: vardas = Užsakymo tipas, komentaras =, tipas = java.lang.String; Laukas: pavadinimas = kaina, komentaras =, tipas = plūduriuojantis; Laukas: vardas = Trukmė, komentaras =, tipas = java.lang.String; Laukas: name = AccountType, comment =, type = int; Laukas: pavadinimas = TransactionType, comment =, type = int; 

Kodo pavyzdys rodo, kad „Doclet“ API yra pakete com.sun.javadoc. Kadangi jungiatės prie „Javadoc“ įrankio ir nekuriate atskiros programos, „Javadoc“ iškviečia jūsų instrukciją iš metodo viešoji statinė loginė pradžia (RootDoc ​​šaknis).

Kartą pradžia metodas vykdomas, „RootDoc“ turi visą „Javadoc“ analizuojamą informaciją. Tada galite pradėti vaikščioti po visas išanalizuotas klases, pasitelkdami metodą klasės () ant „RootDoc“. Šis metodas grąžina a „ClassDoc“ masyvas, apibūdinantis visas išanalizuotas klases. „ClassDoc“ savo ruožtu yra tokių metodų kaip laukai() ir metodai (). Šie metodai grįžta „FieldDoc“ ir MetodasDoc masyvai, apibūdinantys visus analizuojamos klasės laukus ir metodus. Metodas yra visose „Doc“ klasėse žymos, kuris grąžina a Žyma masyvas, apibūdinantis tiek įprastas, tiek standartines „Javadoc“ žymes. Šiame pavyzdyje naudojama standartinė žyma yra @matyti.

iš () metodas tiesiog apgaubia standartinę išvestį, o „MessageFormat“ klasė padeda formatuoti išvestį pagal fiksuotą šabloną.

Daugkartinės klasės kodams generuoti

Atsižvelgdamas į pirmiau pateiktą pavyzdį, tikiuosi, kad sutiksite, jog kurti savo nuosavus informacinius failus ir išskleisti klasės informaciją naudojant „Doclet“ API yra lengva. Kitas „Java“ klasių analizės ir kodo generavimo faile žingsnis yra gana paprastas. Kad būtų lengviau kurti kodų generavimo instrukcijas, sukūriau nedidelį sąsajų ir abstrakčių bazinių klasių rinkinį. Šių naudingumo klasių schema parodyta žemiau.

Sąsaja Kūrėjas apibrėžia metodo parašą public void make („ClassDoc classdoc“) kurį naudosite bendraudami su savo kodų generatoriais. Abstrakti klasė „CodeMaker“ pateikia numatytuosius pritaikymus manipuliuoti failais ir įtraukomis, kurios yra bendros visiems kodų generatoriams. Konkretūs kodų generatoriai paveldi iš abstrakčios pagrindinės klasės ir pateikia padaryti metodas. padaryti metodas turi klasę „ClassDoc“ kaip argumentas, o ne „RootDoc“. Tai sukelia Kūrėjas įvesti kodų generavimo logiką klasės lygiu.

Visos „Javadoc“ analizuojamos klasės yra sujungtos „doclet“ papildinio metodu pradžia. Toliau pateikiamas pavyzdys, kaip tai daroma (aprašyta faile SimpleMakerDoclet.java):

viešoji statinė loginė pradžia (RootDoc ​​šaknis) {ClassDoc [] klases = šaknis.klasės (); // Nustatykite „CodeMakers“, kad būtų paleista „Maker“ programa „simpleemaker = new SimpleCodeMaker“ („Aprašymo montažinė“); // Kartokite visas klases ir vykdykite Makerio metodą „make“ (int i = 0; i <klases.length; i ++) {ClassDoc classdoc = klases [i]; supaprastintojas.make (classdoc); } return true; } 

Toliau pateikiamos paprasto kodo generatoriaus, vadinamo, kodo dalys „SimpleCodeMaker“, atliekanti tą pačią užduotį kaip ir „SimpleDoclet“ anksčiau išvardyti. Užuot išsiuntę išvestį į ekraną, „SimpleCodeMaker“ išsaugo jį kataloge esančiame faile kaladėlės. Programos įgyvendinimas padaryti metodas taip pat tampa labiau struktūrizuotas, naudojant atskirus metodus laukams ir metodams apdoroti. Tik metodai padaryti ir procesasMetodai čia išvardyti dėl trumpumo.

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