Partiële-klassecodegeneratie maakt beheer gemakkelijker
door Jeroen Heijning, Java/J2EE-consultant
Minder code betekent minder kans op bugs. Een gouden regel voor softwareontwikkelaars. Toch is het ontstaan van overbodige code tijdens de ontwikkeling van software nog al eens onoverkomelijk. Het is wellicht een bekende situatie: wisselingen van de wacht, nieuwe developers en tussentijdse technologische ontwikkelingen. Met uiteindelijk een rommelig ogend – of erger: instabiel – softwarematig bouwwerk, ontwikkeld door verschillende architecten en aannemers, tot gevolg. Om het overzicht te bewaren en instabiliteit te voorkomen, is werken met partiële-klassecodegeneratie in mijn ogen dan ook een must.
Overzicht bewaren
Bij het ontwikkelen van applicaties is al enkele jaren het werken met frameworks als Struts en Spring een bekend fenomeen. Deze frameworks zijn verzamelingen hulpmiddelen voor het ontwikkelen van applicaties. In tegenstelling tot diverse kant-en-klare ontwikkeltools, zorgen Struts en Spring voor een duidelijke scheiding van verantwoordelijkheden van de verschillende softwarecomponenten – zoals presentatie, navigatie, implementatie, business logica en de toegang tot data in een database of queue. Het gebruik van deze frameworks vereist evenwel discipline en extra configuratiebestanden, maar leidt omgekeerd evenredig tot betere en beter herbruikbare code. Bijvoorbeeld door identieke code te vermijden omdat het framework rekening houdt met het gebruik ervan in steeds nieuwe varianten. Met als einddoel om kwalitatieve code te genereren, wat niet uitsluit dat de totale hoeveelheid code toch groot kan zijn.
Codegeneratie
Waar Struts en Spring houvast biedt in de vorm van een efficiënt raamwerk, is het toepassen van codegeneratie vervolgens een eerste manier om meer functionaliteit te bieden met minder code. Codegeneratie kent verschillende vormen. Een eenvoudige vorm is het toepassen van XDoclets voor het genereren van Hibernate-configuratiebestanden uit de commentaarblokken in Java-code. Hibernate is een zogenoemde eencellige levensvorm van codegeneratie, ook wel ‘code munging’ geheten. Een populair open source product voor object relational mapping dat eenvoudig outputfiles uit de aanwezige codebestanden kan genereren. Ander voorbeeld van een dergelijke manier van scripting is de Java-doc-tool, die identiek werkt als de XDoclet-codegeneratie. Beide tools genereren output uit specifieke, speciaal gemarkeerde, regels en items in de commentaarblokken van Java-codebestanden.
Partiële-klassecodegeneratie
Wat mij betreft de meest interessante manier van codegeneratie is het concept van de partial-class-generator, zoals Jack Herrington heeft omschreven in het boek ‘Code Generation’. Het definitiebestand is in zijn boek in de meeste gevallen een XML-configuratiebestand waarin de structuur van het beoogde business proces staat vastgesteld en waarbij de elementen (tags en attributen) van dat XML-bestand worden gebruikt in de template-bestanden. De templates kunnen op hun beurt bestaan uit elk bestandstype. De spil in het proces, de tier-generator, genereert uit de templates en definitiebestanden de programmacode. Deze code dient in alle gevallen een tijdelijk doel, aangezien hij zich bij elke aanvraag opnieuw laat generen uit de templates en het definitiebestand. Naar wens in een eindeloos aantal variaties – met als grootste pluspunt de gelijkvormige, beproefde uitkomst.
Partiële-klassegenerator:
Hogere ontwikkelsnelheid
Het principe van partiële-klassegeneratie beoogt primair een hogere ontwikkelsnelheid te bereiken met een betrekkelijk eenvoudige generator. Waarbij ook het werken met de templates en definitiebestanden geen aanslag op de capaciteit van de programmeur hoeft te doen. Aangezien het variabele deel zich telkens automatisch laat genereren, ligt de inzet van deze vorm van codegeneratie vooral voor de hand in omgevingen waar continu vergelijkbare uitkomsten nodig zijn, maar dan wel steeds in diverse varianten. Met als grootste winst dat door de inzet van codegeneratie in dit scenario het voortdurend moeten kopiëren en aanpassen van stukjes code overbodig is.
Krachtige combinatie
Het automatisch laten genereren van een deel van de code is te combineren met elk denkbaar hulpmiddel of framework. Het is zo mogelijk om bijvoorbeeld codegeneratie te gebruiken om de configuratiebestanden te genereren die van belang zijn voor Struts of Spring. In de templates zijn loopjes, if-statements en andere expressies eenvoudig te gebruiken door middel van een template-taal zoals Velocity of XSP. En eenmaal opgezet, is gelijkvormige code dan voortaan op snelle wijze gemaakt. De gemakkelijk te bewerken tags uit de definitiebestanden en de tier-generator nemen met plezier het programmeerwerk over.
Partiële-klassecodegeneratie bij klanten
Tot zover de theorie. Omdat voor velen ‘the proof of the pudding, is in the eating’ zal gelden, is het hier nog de moeite waard te melden dat Qualogy het principe van partiële-klassegeneratie sinds enkele jaren met succes toepast bij een klant in de energiebranche. Daar zorgen een aantal J2EE-applicaties voor koppelingen tussen de verschillende systemen. Deze systemen hebben elk een eigen gegenereerde web-client-interface, EJB-Session Beans, Java Messaging Services, Java DataBase Connectivity én Web Services. Met als belangrijkste voordeel dat de gekozen implementaties tijdens hun life-cycle gemakkelijk zijn aan te passen, door templates te veranderen en de code opnieuw te (laten) genereren. Nieuwe inzichten zijn zo veel gemakkelijker en goedkoper te implementeren. Met minder onderliggende code, dus met minder kans op bugs, en dat maakt het leven voor de beheerders onder ons een stuk aangenamer.
|