{"id":2274,"date":"2023-11-03T21:58:00","date_gmt":"2023-11-03T20:58:00","guid":{"rendered":"https:\/\/crossbreeze-bricks.local\/?p=2274"},"modified":"2025-05-18T14:47:44","modified_gmt":"2025-05-18T12:47:44","slug":"ontkoppeling-van-generatie-en-modelleringstool","status":"publish","type":"post","link":"https:\/\/crossbreeze.nl\/en\/ontkoppeling-van-generatie-en-modelleringstool\/","title":{"rendered":"Ontkoppeling van generatie en modelleringstool"},"content":{"rendered":"\n<p>Modelgedreven ontwikkeling kan een grote factor zijn in het verbeteren van de effici\u00ebntie van de ontwikkeling van dataoplossingen en de kwaliteit van het eindproduct.<\/p>\n\n\n\n<p>Om modelgedreven ontwikkelen succesvol toe te passen zijn tools nodig voor het modelleren van de applicatie en voor het genereren van de daadwerkelijke software op basis van het model.<\/p>\n\n\n\n<p>Dit artikel vergelijkt een scenario waarin modellering en het genereren van code in \u00e9\u00e9n tool zijn ge\u00efntegreerd, met een scenario waarin afzonderlijke tools worden gebruikt voor het modelleren en genereren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Voorbeeld van een gebruiksscenario<\/h2>\n\n\n\n<p>Voor de doeleinden van dit artikel beschouwen we een eenvoudig scenario waarin de modelleringsvereisten als volgt zijn:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Het model omvat datastructuren in de vorm van entiteiten met attributen en relaties<\/li>\n\n\n\n<li>Het omvat ook modelgegevensstromen die defini\u00ebren welke brongegevens nodig zijn voor een bepaalde doelentiteit, waaronder deelnamevoorwaarden in gevallen waarin een doelentiteit wordt gevuld met behulp van meer dan \u00e9\u00e9n bronentiteit.<\/li>\n<\/ul>\n\n\n\n<p>Op basis van de modelinformatie moeten de volgende softwarecomponenten worden gegenereerd:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DDL voor de vereiste tabellen<\/li>\n\n\n\n<li>SQL-views die de gegevensstromen implementeren<\/li>\n\n\n\n<li>Opgeslagen procedures die uit de views lezen en naar de doeltabellen laden<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/crossbreeze.nl\/cms\/wp-content\/uploads\/2025\/04\/decouple-code-generation_model-generate-software-1.svg\" alt=\"\" class=\"wp-image-2277\"\/><\/figure>\n\n\n\n<p>Bij het toepassen van modelgestuurde ontwikkeling zal je altijd gebruik maken van een modelleringstool. Ook zal je atijd ergens in het proces code genereren. In dit artikel beschrijven we de verschillen tussen het integreren van de codegeneratie in een modelleringstool en het scheiden van de codegeneratie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ge\u00efntegreerde codegeneratie<\/h2>\n\n\n\n<p>Wanneer u begint met modelgestuurde ontwikkeling, is het erg handig om een modelleringstool te hebben waarin u ook sjablonen kunt maken om de implementatie te genereren. Dit zorgt voor een zeer snelle start en vanuit gebruikersperspectief is er maar \u00e9\u00e9n tool bij betrokken.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/crossbreeze.nl\/cms\/wp-content\/uploads\/2025\/04\/decouple-code-generation_all-in-one-tool.svg\" alt=\"\" class=\"wp-image-2279\"\/><\/figure>\n\n\n\n<p>Een voorbeeld van een modelleertool waarin dit mogelijk is, is SAP PowerDesigner. Aangepaste modelleringsopties en codegeneratie kunnen worden gemaakt in een zogenaamde modelleringsextensie (XEM).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Voorbeeldimplementatie in PowerDesigner<\/h3>\n\n\n\n<p>Out-of-the-box PowerDesigner ondersteunt het modelleren van logische datastructuren (entiteiten, attributen, relaties) en data mappings (bron-naar-doel mapping op attribuutniveau). Een voorbeeld van maatwerk zou een PowerDesigner-extensie kunnen zijn die:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verbetert de modelleringsopties, zodat joinvoorwaarden kunnen worden gedefinieerd op een datatoewijzing (iets dat niet mogelijk is met de standaardfuncties)<\/li>\n\n\n\n<li>Implementeert codesjablonen voor:\n<ul class=\"wp-block-list\">\n<li>SQL-weergaven gebaseerd op de gegevenstoewijzingen (met behulp van de join-voorwaarden uit de modelleringsverbetering)<\/li>\n\n\n\n<li>SQL Opgeslagen procedures om gegevens uit de views naar de doeltabel te laden<\/li>\n\n\n\n<li>Orkestratietaken die de opgeslagen procedure aanroepen, bijvoorbeeld in Azure Data Factory<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Voors en tegens<\/h3>\n\n\n\n<p>In onderstaande tabel hebben wij de voor- en nadelen van deze manier van werken op een rij gezet.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Voor<\/td><td>Tegen<\/td><\/tr><tr><td>Er is slechts \u00e9\u00e9n hulpmiddel nodig<\/td><td>&#8211; Als u overschakelt naar een andere modelleringstool, moet alle logica voor modellering en codegeneratie worden aangepast.<br>&#8211; Het optimaliseren van de prestaties voor het genereren van code kan moeilijk zijn.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Koppel modellering los van het genereren van code<\/h2>\n\n\n\n<p>Een andere mogelijke methode om modelgestuurde ontwikkeling toe te passen is het gebruik van een modelleringstool, puur om het logische model met zijn gedrag vast te leggen. Voor een dataoplossing wordt dit gemodelleerd met behulp van entiteiten, relaties, mappings en transformaties.<\/p>\n\n\n\n<p>Om de code in dit scenario te genereren, moeten alle metagegevens die nodig zijn voor het genereren van code vanuit de modelleringstool worden ge\u00ebxporteerd naar een formaat dat bruikbaar is voor het genereren van code.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/crossbreeze.nl\/cms\/wp-content\/uploads\/2025\/04\/decouple-code-generation_seperate_tools.svg\" alt=\"\" class=\"wp-image-2281\"\/><\/figure>\n\n\n\n<p>In dit scenario zouden we minstens twee tools gebruiken, namelijk de modelleringstool en een codegenerator. Bij CrossBreeze gebruiken we CrossGenerate als codegenerator. Deze generator heeft XML-bestanden nodig als modelinvoer, dus in dit geval kunnen we alle metagegevens naar XML-formaat exporteren met behulp van de modelleringstool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Voors en tegens<\/h3>\n\n\n\n<p>In onderstaande tabel hebben wij de voor- en nadelen van deze manier van werken op een rij gezet.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Voors<\/td><td>Tegens<\/td><\/tr><tr><td><ul><li>Het onderhouden van modellering en het genereren van code kan eenvoudiger in meerdere teams worden gedaan.Geen afhankelijkheid van modelleringstool tijdens het genereren, dus genereren kan worden gedaan op een machine (of k8s-pod) zonder dat de modelleringstool is ge\u00efnstalleerd.Het updaten\/wisselen van de modelleringstool of codegenerator kan onafhankelijk van elkaar worden gedaan (zolang de metadata-export hetzelfde blijft).<\/li><li>Gemakkelijker om meerdere technologiestacks tegelijkertijd te ondersteunen (bijvoorbeeld tijdens een PoC voor een nieuwe technologie).<\/li><\/ul><\/td><td>Kennis van meerdere tools is nodig.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Samenvatting<br><\/h2>\n\n\n\n<p>Bij CrossBreeze geven we er, op basis van onze ervaring met beide benaderingen, de voorkeur aan om de codegeneratie los te koppelen van de modelleringstool. In ons perspectief wegen de winst op het gebied van flexibiliteit en prestatie zwaarder dan de nadelen van het toevoegen van een nieuwe tool aan de ontwikkelstack.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modelgedreven ontwikkeling kan een grote factor zijn in het verbeteren van de effici\u00ebntie van de ontwikkeling van dataoplossingen en de kwaliteit van het eindproduct. Om modelgedreven ontwikkelen succesvol toe te passen zijn tools nodig voor het modelleren van de applicatie en voor het genereren van de daadwerkelijke software op basis van het model. Dit artikel [\u2026]<\/p>\n","protected":false},"author":6,"featured_media":2289,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"content-type":"","footnotes":""},"categories":[1],"tags":[],"hf_cat_post":[],"class_list":["post-2274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/posts\/2274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/comments?post=2274"}],"version-history":[{"count":0,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/posts\/2274\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/media\/2289"}],"wp:attachment":[{"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/media?parent=2274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/categories?post=2274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/tags?post=2274"},{"taxonomy":"hf_cat_post","embeddable":true,"href":"https:\/\/crossbreeze.nl\/en\/wp-json\/wp\/v2\/hf_cat_post?post=2274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}