Codegenerator

Begin elke sprint met een nieuwe oplevering

[object Object]
Marnix van Bochove
June 19, 2019

Gelijktijdig werken aan twee projecten met de MetaFactory tool

Bij MetaFactory werken we regelmatig aan 2 projecten tegelijk. Na elke sprint van 2 weken wisselen we van project en gaan we weer met het andere project verder. Beide klanten willen graag zo snel mogelijk hun applicatie hebben. Met ons team gaan we een uitdaging graag aan. Wij maken gebruik van SDA (Software Development Automation), en zetten onze eigen MetaFactory tool in.

Software Development Automation

Bij SDA typt de ontwikkelaar niet zelf meer alle code in, maar maakt hij of zij een model (het datamodel met alle entiteiten) en een pattern (de vastlegging van de volledige architectuur). Voor meer informatie over SDA bekijk bijvoorbeeld deze blog.

Handmatig schrijven van zoekfunctionaliteit

In zo’n sprint voor het ene project wilden we zoekfunctionaliteit toevoegen. Deze zoekfunctionaliteit wordt toegevoegd aan het scherm met de tabel met alle records voor een bepaald scherm. We begonnen met de lijst van personen. Boven de tabel komt een panel met zoekcriteria om te zoeken naar personen: zoek op voornaam, achternaam en geboortedatum. Deze zoekfunctionaliteit wordt eerst handmatig uitgecodeerd in AngularJS en in Java.

Een pattern en een model maken

Als deze zoekfunctionaliteit werkt voor de lijst met personen, dan maken we hier een pattern van. In dit pattern wordt vastgelegd hoe de zoekfunctionaliteit gebouwd moet worden, maar dan in termen van het model.

Model en metadata

Via metadata wordt in de persoon-entiteit allereerst aangegeven dat deze tabel zoekfunctionaliteit heeft middels de metadata search=true. Bij de velden van de persoon-entiteit waarop gezocht moet worden, wordt via metadata searchField=true aangegeven dat dit de doorzoekbare velden zijn: firstname, lastname en birthdate. Vervolgens wordt in het pattern aangegeven dat er voor alle entiteiten waar de metadata search=true staat er een search panel moet komen in het scherm met de tabel met alle entiteiten en dat er gezocht kan worden op alle velden met searchField=true. Ook in het pattern van de controllers en in het pattern van de repositories (de DAO’s, Data Access Objects) wordt deze metadata gebruikt om onder andere een extra methode toe te voegen. Metadata type op de velden van de entiteit wordt gebruikt om vast te leggen hoe gezocht moet worden. Bij firstname en lastname is type=string, bij birthdate is type=date.

Een pattern voor zoekfunctionaliteit

Omdat we de broncode voor de zoekfunctionaliteit voor het eerste object met de hand hebben geschreven weten we precies wat we moeten doen . Tijdens het maken van een pattern op basis van de handgeschreven broncode wordt de broncode volledig vastgelegd in termen van het model. Person wordt nu dus entityName, firstName wordt attributeName et cetera. Voor het vastleggen van dit pattern wordt veel gebruik gemaakt van de template engine Freemarker. Hierin kunnen we makkelijk via if-then-else constructies vastleggen dat voor ieder veld type (string, date, boolean, long et cetera) aparte zoekcode moet komen. Als we alle stappen om tot onze zoekfunctionaliteit te komen, hebben vastgelegd, dan produceren we met de MetaFactory tool de bestaande code voor het zoeken naar personen opnieuw. Als alles goed uitgevoerd is, zien we precies dezelfde code (of hoogstens kleine verschillen of zelfs verbeteringen). Hartstikke mooi, we hebben nu hetzelfde stukje code nog een keer gemaakt, maar dan via de MetaFactory tool op de SDA-manier. Het grote voordeel is dat we nu in ons datamodel bij andere entiteiten ook de metadata search=true kunnen toevoegen. Als we dit bijvoorbeeld bij de Company- en bij de Address-entiteit doen en we voegen ook aan hun zoekvelden de metadata toe om er naar te kunnen zoeken, dan krijgen we direct de volledige zoekfunctionaliteit voor het zoeken naar Companies en naar Adresses. Ideaal! We hebben het fenomeen ‘meer van hetzelfde’-programmeren teruggebracht door het toevoegen van metadata aan objecten en het maken van een pattern voor het zoeken.

Sorting, paging, validations et cetera

Op deze manier hebben we de afgelopen jaren veel functionaliteit in onze applicaties toegevoegd, zoals sortering, paginering, filtering, validaties in dialoog schermen et cetera.

Twee projecten met dezelfde architectuur

Zoals ik schreef werken we bij MetaFactory volgens de hierboven beschreven SDA-methode regelmatig aan 2 projecten tegelijk. Deze projecten zijn vaak verschillend, maar hebben wel een vergelijkbare architectuur: spring boot, spring data, spring rest, JPA, spring security en AngularJS. Tevens gebruiken we dezelfde patterns om de applicaties te bouwen met MetaFactory.

Begin de sprint met een oplevering

Gevolg is dat verbeteringen in de ene applicatie direct bruikbaar zijn in de andere applicatie, aangezien alle verbeteringen zijn vastgelegd in patterns en op een abstracte manier zijn beschreven in termen van het model. Tegenwoordig beginnen wij elke sprint met een oplevering waarin alle verbeteringen uit de vorige sprint (van het vorige project) zijn toegepast, door alleen maar metadata toe te voegen aan de modellen. Zonder dat we een regel code hoeven te schrijven! Uiteraard eindigen we de sprint ook met een oplevering. Hier worden wij blij van en de klant ook!

Ook interessant

Codegenerator
Software Development Automation
Codegenerator
Waarom een SDA cursus?