Het is een grondbeginsel van elke softwareopleiding: design patterns. Toch blijft het verleidelijk om eenmaal uit de schoolbanken het wiel zelf uit te vinden. Zonde, want correct gebruik van ‘ontwerppatronen’ leiden tot efficiëntie.
Als software-engineer pronken de 23 design patterns van de Gang of Four (naar de vier bedenkers) natuurlijk boven je bureau. Kort door de bocht is een design pattern, of ontwerppatroon, een bewezen recept om een veelvoorkomend probleem op te lossen. En jij bent de chef. Want werk je volgens het recept, dan geeft het een sterke basis voor een goed werkend, smakelijk resultaat. Wil je aan het patroon wat peper en zout toevoegen? Dan kan dat, zij het met mate. Het is dus geen kant-en-klaar sjabloon in code, maar een manier om structuur aan te brengen in de architectuur van je software, het bouwen van een functie, of manier van werken.
Drie typen patronen
Als je de design patterns eenmaal kent, dan zie je ze overal. De originele design patterns zijn te verdelen in drie hoofdsmaken: creatie-, structurele- en gedragspatronen.
Bij creatiepatronen draait het om het creëren van objecten. Een structuurpatroon legt expliciet vast hoe meerdere objecten samen een grotere structuur vormen, en een gedragspatroon stroomlijnt processen als er een bepaald soort gedrag plaatsvindt. Nadien zijn nieuwe types design patterns toegevoegd, bijvoorbeeld om de complexiteit te omvatten van parallelle processen of applicaties op enterpriseniveau. Van elke originele hoofdsmaak heb ik één patroon uitgewerkt in een herkenbare situatie.
- Leaseauto kiezen met een creatiepatroon
Als je een nieuwe leaseauto mag kiezen, merk je dat je te maken krijgt met een bouwpatroon. In dit geval bestaat het patroon uit vier variabelen: jij als klant, de leasemaatschappij, de autobouwer en de bloemist. Bij de leasemaatschappij bestel je een Audi met diverse opties: cruisecontrol, lichtmetalen velgen en rijbaan-assist. En de kleur van de auto moet rood zijn, uiteraard. De leasemaatschappij geeft het door aan Audi die de auto bouwt en volgens specificaties aflevert. Als verrassing bestelt de leasemaatschappij ook een bloemetje met gouden strik bij de bloemist.
Drie weken later pronkt een kersverse Audi met een bloemetje op de oprit. Als het bouwpatroon wordt gebruikt bij de leasemaatschappij, dan zou het net zo eenvoudig moeten zijn om dezelfde specificaties bij een andere autofabriek te bestellen. Mercedes biedt dezelfde manier om de opties te kiezen, hoewel het een compleet ander bedrijf is. Dankzij het bouwpatroon zijn de leasemaatschappij, autobouwer en bloemist uitwisselbaar. Het patroon blijft zijn werk doen, dus ook als je stiekem over een donkergrijze Mercedes fantaseert.
- Telefoon opladen met een structuurpatroon
We kennen allemaal het moment dat je telefoon leeg is en je net niet je oplader bij de hand hebt. Zodra je die oplader van je collega in je telefoon steekt, heb je te maken met een adapterpatroon. De adapter vormt de Europese 220 volt-uitgang die de elektriciteit levert naar een usb-verbinding met vijf volt.
Thuis gebruik je je draadloze oplader. Dat is een compleet andere aansluiting, maar net als bij de oplader zet deze het vermogen op precies de juiste manier om. Zo kun je na een uurtje de lader weer met een gerust hart teruggeven aan je collega.
- Hotels boeken met een gedragspatroon
Je hebt vast weleens een hotel bekeken via het bekende blauwe boekingsplatform. Onder je favoriete hotel lonkt een rode balk: al vier keer geboekt dit uur. Hier is een uitgekookt design pattern-actief: het waarnemerpatroon.
Website-elementen (waarnemer) zijn gelinkt aan de backend (onderwerp) van de boekingswebsite en tonen informatie afhankelijk van het onderwerp. Zodra er iets wijzigt in de status van een kamer of boeking, krijgen deze elementen een notificatie van het onderwerp en kunnen ervoor kiezen om hun informatie bij te werken. De backend weet continue of en wie er ergens een kamer heeft geboekt. Niet alleen voor jouw kamer, maar voor álle kamers, appartementen en villa’s. Zodra iemand anders boekt en het is dezelfde kamer als die jij hebt geboekt, dan geeft de backend aan jouw teller door dat de vijfde boeking binnen is. En dan kan jij natuurlijk niet achterblijven…
Wat design patterns opleveren
Design patterns brengen dus een uitwisselbare structuur. Welke voordelen levert dat nou op? Een greep wat het voor ons doet.
- Betrouwbare code
Iedereen heeft zijn eigen manier van werken. Maar het doel is wel dat zodra iemand op ‘opslaan’ drukt, iemand anders weer verder kan. Design patterns zorgen door de ‘bewezen’ opzet voor betrouwbaarheid. En dat geldt niet alleen voor de code, maar ook over de manier hoe je documentatie en aantekeningen maakt in je project.
- Nieuwe mensen snel productief
Als een project hard groeit in omvang, of iemand wisselt van functie, dan wil je productieve nieuwelingen. Zonder design patterns zou je iemand eerst de hele samenhang van de code, of manier van werken moeten uitleggen. Zie je de maanden en frustraties al voorbijvliegen? Gebruik je design patterns, dan kan je zeggen: de updates van dit dashboard verzamelt een waarnemerspatroon. De nieuweling weet nu meteen hoe met die functie om te gaan, of kan opzoeken hoe zo’n patroon werkt.
- Eenvoudig objecten delen met andere frameworks en talen
Python, C#, Vue, React, R, we gebruiken steeds meer talen en frameworks door elkaar. Objecten bouwen en verwerken doen deze systemen allemaal op hun eigen manier. Een adapterpatroon helpt je om op een neutrale manier informatie uit een object in Python naar bijvoorbeeld een Vue-object om te vormen. Dat kan door de objecten in Python naar JSON te vertalen en de JSON in Vue om te zetten naar een Vue-object. Over JSON gesproken, een adapter maakt het ook makkelijk om legacy XML-code compatible te houden. Je schrijft hiervoor ‘simpelweg’ een adapter.
- Nieuwe projecten sneller opgebouwd
Werken mensen met dezelfde skillls aan veel projecten, dan ga je sneller leveren. Bij Itility werken de software-engineers verspreid over diverse klanten. Zij houden elkaar goed op de hoogte van wat ze maken. Door in hun projecten design patterns te gebruiken, wisselen ze efficiënt nieuwe functies en workflows uit als deze ook bruikbaar blijken voor een eigen project. Daarnaast hoef je het wiel niet opnieuw uit te vinden voor structuren die al bestaan in design patterns.
- Beter samenwerken met andere specialisten
Oke, design patterns zorgen voor betrouwbare code, maakt nieuwelingen en nieuwe projecten productiever. Maar werkt het ook buiten de silo van software-engineers? En of. Zo werken onze DevOps-engineers nauw samen met de datawetenschappers.
Een voorbeeld van onze notificaties: de software-engineer maakt voor de datawetenschapper een klasse beschikbaar dat het bouwpatroon implementeert. Zo hoeft de datawetenschapper zich niet druk te maken over hoe een notificatie precies wordt opgebouwd. Ze hoeven zich alleen maar te richten op de definities binnen het bouwpatroon en de informatie toevoegen die nodig is voor de notificatie. Op de achtergrond wordt automatisch de juiste informatie toegevoegd zoals de applicatienaam, links naar documentatie en netwerkdetails
Dankzij design patterns is er dus heel veel winst te halen. Een pattern kan zelfs nuttig zijn als je niks met code doet, maar bijvoorbeeld projecten uniform wil opleveren.