Hoe voorkom je handgeschreven CASE statements in TimeXtender?

Het is bijna lente en dat is een goed moment voor een voorjaarsschoonmaak van je TimeXtender implementaties. In deze serie blogs zoomt Senior TimeXtender Consultant Ruairidh Smith in op typische zaken die je kan verbeteren, zeker voor langlopende implementaties of implementaties die door meerdere ontwikkelaars worden opgezet. Dit zijn zaken die meestal als “details” worden gezien die minder belangrijk zijn dan het opleveren van nieuwe data. In dit blog bespreekt hij hoe je handgeschreven CASE statements voorkomt.

Technical Debt

In het Engels is er een gezegde: “but in this world nothing can be said to be certain, except death and taxes” (Benjamin Franklin). Aan deze twee “zekerheden” wil ik een derde toevoegen: Technical Debt. Technical Debt kun je omschrijven als toekomstige kosten voor rework die veroorzaakt worden door het toepassen van een simpele of snelle oplossing voor een probleem dat beter op een andere, meer tijd kostende, wijze zou kunnen worden opgelost. Net zoals entropie of een lening kent Technical Debt “rente” waardoor het probleem groeit met de tijd en steeds moeilijker wordt om aan te pakken. Op een gegeven moment spannen al die “dat doen we later een keer goed” zaken samen om je productie-omgeving op een spectaculaire manier lam te leggen.

Hoewel de automatisering die TimeXtender voor je doet je al helpt om een hoop Technical Debt te voorkomen zul je altijd zelf business logica implementeren in SQL. Door deze code te reviewen en te zorgen dat het zo simpel mogelijk blijft maak je dat je omgeving onderhoudbaar blijft naar de toekomst toe. Vaak betekent dit, als je nieuw bent in TimeXtender, dat je je instincten uit andere tools moet aanpassen omdat TimeXtender bepaalde zaken direct voor je automatiseert die je anders met handmatige code op zou lossen.

Hoe voorkom je handgeschreven CASE statements?

Het eerste onderwerp dat ik wil aanstippen is er eentje die ik heel vaak tegenkom: CASE statements in Field Transformations die bepalen welke waarde in een veld moet worden opgeslagen. Meestal zul je in zo’n geval een oplossing willen maken die IF-THEN-ELSE logica volgt. In het voorbeeld dat we hier hanteren kijken we naar het Class veld in de AdventureWorks Product tabel: in dit veld komen vier waarden voor:

  • NULL: unknown class
  • H: high product
  • M: medium product
  • L: low product

Een typische aanpak, zeker voor de SQL-kenners onder ons, is om een CASE statement te schrijven dat de omschrijving oppakt die hoort bij de code. Je vindt een voorbeeld van zulke syntax in Figure 1. In dit specifieke geval zul je waarschijnlijk denken: “de code documenteert zichzelf” maar in echte situaties zijn de expressies vaak complexer. Omdat er gerede kans is dat de logica over tijd verandert moet je deze code onderhouden en zullen ontwikkelaars de code moeten lezen om te begrijpen waarom er iets gebeurt dat ze niet verwachten.

case statemet, TimeXtender, Field Transformation

Figuur 1: Typische CASE statement in een Field Transformation

Conditional Field Transformations

Het is in TimeXtender mogelijk om dit soort transformaties te automatiseren: Conditional Field Transformations. Deze aanpak maakt het mogelijk om dezelfde logica te implementeren, maar dan op een manier die makkelijker te lezen en onderhouden is. Zie Figuur 2 voor een voorbeeld dat de opzet van het originele CASE statement implementeert.

Het grote verschil waar je moet “omdenken” is dat je Fixed Transformations gebruikt voor alle waarden met condities voor alle situaties die niet de default zijn (de ELSE in de IF-THEN-ELSE). Je maakt eerst een Transformation voor de ELSE, zonder conditie. Dan voeg je voor iedere IF-THEN een Fixed Transformation toe met daaraan een Conditie die de IF representeert.

Zolang je CASEs qua condities niet overlappen maakt de volgorde van de transformaties met conditie niet zoveel uit (zolang je de ELSE bovenaan hebt staan). Als er overlap is tussen condities, moet je de condities die “wint” onderaan zetten.

timextender, case statement

Figuur 2: Conditional Field Transformation benadering voor if-then-else-scenario’s

Het resultaat is makkelijker te begrijpen voor non-SQL developers (in mijn ervaring) en voorkomt syntax-variaties die voor kunnen komen omdat verschillende ontwikkelaars verschillende coding stijlen hebben. Je kan de transformaties en condities ook slepen tussen velden waardoor je snel dezelfde IF-THEN-ELSE op meerdere velden kan toepassen.

Hoewel dit triviaal kan lijken zorgt het ervoor dat je business logic expliciet zichtbaar wordt in plaats van dat het verstopt wordt in een Custom Transformation die je eerst moet openen om hem volledig te kunnen lezen. Ik kan iedereen aanraden om nieuwe logica op deze manier te implementeren en wat tijd te reserveren om door de bestaande transformaties heen te lopen. Hiermee voorkom je dat je op een toekomstige vrijdagmiddag om 16:58 een bezoekje krijgt van de spreekwoordelijke Technical Debt Collector die je forceert om een 1000-regelige CASE statement die je een jaar geleden bij elkaar hebt gesprokkeld uit drie Stack-overflow posts die je door ChatGPT hebt gehaald te corrigeren.

Technische voetnoot: De syntax die TimeXtender genereert uit je Conditional Transformations bestaat uit geneste CASE statements in plaats van een lijst WHENs zoals in het rauwe SQL-voorbeeld. Je kan de syntax bekijken door te rechterklikken op de tabel > Advanced > Customize Code en de Add knop voor de Transformation View te klikken. Je ziet dat de volgorde van onder naar boven loopt, de onderste (conditional) transformation waar de conditie waar is wordt toegepast.

Er zitten wat subtiliteiten in de evaluatievolgorde van CASE statements (zie ook deze link) en limitaties op de diepte van nesting. Dit betekent dat je normaliter maximaal 10 conditional transformaties op een enkel veld in TimeXtender kan toepassen. Als je de code met de hand schrijft kun je veel meer WHENs kwijt; ik zou echter aanraden om in dat geval een lookup table te hanteren om de omschrijving op basis van een sleutel op te halen.

Op de hoogte blijven?

Benieuwd naar de rest van deze reeks blogs? Schrijf je dan in voor onze nieuwsbrief, zo ben jij maandelijks up-to-date van al onze nieuwe blogs. Je kunt je inschrijven via de button hieronder.

Schrijf je in voor de nieuwsbrief

 

Geschreven door Ruairidh Smith,
Senior consultant bij E-mergo