Skip to main content

Bij MetaFactory ontwikkelen we aan twee verschillende projecten met dezelfde architectuur: AngularJS en Java met o.a. Spring. Na iedere sprint van 2 weken wisselen we met ons kleine team van project 1 naar project 2 en weer terug. Doordat we in beide projecten gebruik maken van dezelfde MetaFactory patterns kunnen we iedere sprint beginnen met een oplevering en eindigen met een oplevering.

Gelijktijdig werken aan twee projecten met onze Code Composer

Softwareontwikkeling bij MetaFactory: we 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 doen aan metaprogramming en zetten daarbij de Code Composer, onze eigen MetaFactory tool, in.

Metaprogramming

Bij metaprogramming typt de ontwikkelaar niet zelf meer alle code in, maar maakt hij of zij een model (het datamodel met alle entiteiten) en een code instructie (de vastlegging van de volledige architectuur).

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 code instructie en een model maken

Als deze zoekfunctionaliteit werkt voor de lijst met personen, dan maken we hier een code instructie van. In deze code instructie 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 de code instructie 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 de code instructie van de controllers en in de code instructie 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 code instructie 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 de code instructie 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 deze code instructie 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 Code Composer 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 met de Code Composer middels metaprogramming. 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 code instructie 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 het hierboven beschreven metaprogramming 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 code instructies om de applicaties te bouwen met de Code Composer.

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 de code instructies 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!

Interesse in de software ontwikkelmethode van MetaFactory?

Neem dan contact op via de contactpagina op deze website of stuur een bericht naar info@metafactory.nl

 

Leave a Reply