[oop] valid state

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Software Developer C++ en Perl

Ben je een slimme en enthousiaste universitair opgeleide bèta die graag bij een relatief klein softwarebedrijf wil werken waar de sfeer goed is en eigen inbreng gewaardeerd wordt? Wij, IntelliMagic in Leiden, ontwikkelen technisch hoogwaardige software op het gebied van IT infrastructuur performance analytics. Het type software zorgt voor intellectueel interessante uitdagingen. We ontwerpen de producten zelf en verkopen deze als off-the-shelf software aan grote bedrijven in Europa en de VS. Wij zoeken een ervaren C++ software engineer met kennis van Perl voor een van onze ontwikkelteams. Werkzaamheden Samen met de andere ontwikkelaars specificeren, ontwerpen en implementeren van nieuwe functionaliteit

Bekijk vacature »

Medior/senior Front-end developer

Functie Je maakt deel uit van een DevOps Scrum team en werkt samen met back-end developers, test-engineers, interaction designers en een projectmanager. Er zijn verschillende groepen Scrum teams. Een roadmap team is jouw ‘’thuisbasis’’, daar wordt gewerkt aan doorontwikkeling van bestaande omgevingen voor een aantal klanten. Hiernaast zijn er projectteams waar nieuwe omgevingen worden gebouwd, of grote complexe wijzigingen worden doorgevoerd op bestaande omgevingen. Je kunt (afhankelijk van jouw wensen en doelen) dus afwisselend werken in beide teams. Hiernaast participeer je in het Chapter Front-end development waar gezamenlijk kennis en ervaring wordt gedeeld. Als Front-end developer is het jouw doel

Bekijk vacature »

Medior PHP Developer

Functie omschrijving We are looking for a dutch native speaker Wil jij als developer werken bij een interne organisatie en de eigen software verder helpen ontwikkelen? Lees dan snel verder! In deze functie ga je werken als PHP Developer en de interne software en applicaties verder ontwikkelen. In het kort houdt dit in: Je gaat de interne applicaties en software verder optimaliseren. Verder bouw je verschillende API's en koppelingen tussen systemen. Je gaat het CRM-systeem door middel van PHP verder ontwikkelen. Ook ga je collega's ondersteunen bij vragen over de software en applicaties. Bedrijfsprofiel Dit bedrijf is actief in het

Bekijk vacature »

Remote - Front-end Angular developer

Functie The IT team currently consists of the IT Manager, 2 back-end developers, 1 full-stack developer, 1 designer, and a DevOps engineer. They are currently looking for an experienced Front-end developer who will work autonomously and in a disciplined manner, being the only developer working on their Front-end applications at the start. They do have the ambition to find a second developer soon, who you will then be able to supervise. You will be working on the further development of their existing UI in Angular. But also developing a mobile app. They place great value on User Experience and opt

Bekijk vacature »

Junior .NET developer

Functie Als junior .NET Developer start jij in een team met 15 developers. In het team is er genoeg senioriteit om ervoor te zorgen dat jij de juiste begeleiding krijgt. Jij begint als eerst alle software pakketten en processen eigen te maken. Vervolgens ga jij deze software programmeren, onderhouden en testen. Ook ga jij research doen naar nieuwe mogelijkheden en zoek jij uit hoe je dit kan implementeren. Jullie werken intern op project basis en afhankelijk van het project werken jullie wel of niet iedere ochtend met een standup. Je gaat als Full stack developer aan de slag en gaat

Bekijk vacature »

Senior .Net developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als .Net Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling. Mede hierdoor zij wij dit jaar Microsoft Partner of the year geworden. Sogetisten staan klaar voor elkaar, hebben lol met elkaar en daarmee behalen we de mooiste resultaten! Werken bij Sogeti

Bekijk vacature »

Senior Front-End Developer

Als Senior Front-End Developer bij Coolblue verbeter je de gebruiksvriendelijkheid van onze webshop voor miljoenen klanten. Wat doe je als Senior Front-End Developer bij Coolblue? Als Senior Front-end Developer werk je aan de gebruiksvriendelijkheid van onze webshop voor miljoenen klanten. Je vindt het leuk om samen te werken met de UX designer om stories op te pakken. Daarnaast ben je trots op je werk en verwelkomt alle feedback. Ook Senior Front-end Developer worden bij Coolblue? Lees hieronder of het bij je past. Dit vind je leuk om te doen Verbeteren van de gebruiksvriendelijkheid van onze webshop voor miljoenen klanten. Nadenken

Bekijk vacature »

.NET Developer Senior

Dit ga je doen Het ontwikkelen van backend applicaties in C#; Het maken van vele koppelingen met andere ERP-applicaties zoals JD Edwards en SAP; Je bent (mede) verantwoordelijk voor het opstellen van technisch ontwerpen voor de te ontwikkelen software oplossingen; Je bent gemiddeld 90% van je tijd inhouse oplossingen aan het ontwikkelen en testen. De overige 10% van je tijd ben je bij klanten op locatie om oplossingen te implementeren, klanten te begeleiden en de software verder te innoveren; Naast het zelfstandig ontwikkelen van software oplossingen ben je ook bezig met het waarborgen van je contacten bij de klant, het

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Medior .NET Ontwikkelaar

In het kort Als .NET ontwikkelaar ga je binnen onze business unit Transport en Logistiek aan de slag complexe maatwerk software voor bedrijf kritische systemen binnen de technische automatisering. Denk bijvoorbeeld een IoT-oplossing voor de logistieke sector waarbij we van ruim 200.000 machines de telemetrie en events verwerken. We zijn actief in de distributielogistiek, havenlogistiek en productielogistiek. Naast C# en .NET Core maken we ook gebruik van Azure technologie. En als trotse Microsoft Gold Partner leren we graag van en met jou. Wil jij jezelf blijven ontwikkelen binnen de technische automatisering met .NET, dan gaan we deze uitdaging graag met

Bekijk vacature »

Senior .NET developer

Functie As a Senior .NET developer you will work in our Research & development team. Our team consists of 17 colleagues! We are currently busy setting up a completely new architecture for a new product. We use VS2022 and .NET 6.0 for our new product. Your function is therefore mainly backend oriented. Since we develop measuring equipment for the chemical industry, it is also very important to develop high-quality software for its control. You are also responsible for designing, implementing and testing new features. For this position its also very important to ensure future-proof and sustainable architecture. Eisen - A

Bekijk vacature »

Back End Developer .NET

Dit ga je doen Ontwikkelen in C# .NET en werken aan nieuwbouw, uitbouw en onderhoud van de software (die communiceren met 68.000 sensoren, waardoor er meerdere miljoenen berichten per uur verwerkt worden); Samenwerken in Scrum Teams; Meewerken aan verschillende, uitdagende projecten; Werken met nieuwe technologieën en vrijheid krijgen om jezelf te ontwikkelen en door te groeien. Hier ga je werken Je komt als Developer te werken bij een organisatie die gespecialiseerd is in software die real-time wordt gebruikt. De software constateert waar werk moet worden uitgevoerd en de chauffeurs worden met een andere applicatie hierop geattendeerd. Ook wordt er direct

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

.NET Developer

Functie De perfecte combinatie tussen techniek en vastgoed. Werk samen met de senior software developer om allerlei software van fluX te verbeteren. Gelukkig voel jij je helemaal thuis in de codewereld van .NET. Dus of je nu bezig bent met het verhogen van de conformiteitscore of het automatiseren van allerlei taxatiemodellen, jij weet precies hoe je de doelstellingen realiseert. En dat terwijl je ook samenwerkt met een extern ontwikkelteam. Waar dit team bepaalde softwaresystemen ontwikkelen, richt jij je vooral op onze Nederlands georiënteerde producten en alle wetgeving die daarbij komt kijken. Voor minimaal 32 uur per week verrijk jij onze

Bekijk vacature »

Junior PHP (Laravel) Developer

Functie omschrijving Wij zijn op zoek naar een PHP Laravel Developer! Sta je aan het begin van je carrière en ben je op zoek naar een leuke baan? Lees dan verder! Voor een softwarebedrijf in omgeving van Schiphol zijn wij op zoek naar een ervaren PHP (Laravel) Developer. Je gaat je bezighouden met het ontwikkelen van innovatieve bedrijfsapplicaties. Samen met het team, bestaande uit designers en developers, maak je mooie oplossingen voor bedrijven in diverse branches. Je zorgt dat de opgeleverde websites perfect werken en de klant meer dan tevreden is. Je kunt rekenen op een afwisselende baan met leuke

Bekijk vacature »
Ozzie PHP

Ozzie PHP

27/05/2014 23:26:02
Quote Anchor link
Hallo allemaal,

Ik probeer voor mezelf wat duidelijker te krijgen wat precies een "valid state" van een object is. Regelmatig lees ik dat je via de constructor een object in een valid state moet brengen. Nu vraag ik me af hoe ik dat moet zien.

Een fictief voorbeeldje. Stel ik heb een class die een pannenkoek bakt :-)

Nu geef ik de ingrediënten voor de pannenkoek mee aan de constructor.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$pannenkoekenbakker
= new Pannenkoekenbakker($ingredienten);
?>

Ik heb nu dus de ingrediënten aan de constructor doorgegeven en deze worden geset als class property. Is de class nu in een "valid state"?

Als ik de de pannenkoek uit de pannenkoekenbakker wil halen, ziet dat er zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$pannenkoekenbakker
   = new Pannenkoekenbakker($ingredienten);
$heerlijke_pannenkoek = $pannenkoekenbakker->getPannenkoek();
?>

De oplettende lezer zal het misschien zijn opgevallen dat ik een pannenkoek opvraag, maar dat er nog geen pannenkoek is gebakken!

Mijn vraag is nu, was de Pannenkoekenbakker class hierboven dan wel in een "valid state"? Had de constructor eerst een pannenkoek moeten bakken om een "valid state" te bereiken? Of is het voldoende om in de constructor uitsluitend de ingrediënten te setten om in een "valid state" te geraken, en moet ik vervolgens zelf handmatig de "bakken" method aanroepen voordat ik een pannenkoek kan opvragen? Zo dus:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$pannenkoekenbakker
= new Pannenkoekenbakker($ingredienten);
$pannenkoekenbakker->bakken();
$heerlijke_pannenkoek = $pannenkoekenbakker->getPannenkoek();
?>

Wanneer is de "valid state" bereikt vraag ik me af? Als ik in dit laatste voorbeeld een pannenkoek opvraag, terwijl die nog niet is gebakken dan heb ik een probleem. Is het dan toch de taak van de constructor om de pannenkoek te bakken om zodoende een "valid state" te bereiken?
Gewijzigd op 27/05/2014 23:28:02 door Ozzie PHP
 
PHP hulp

PHP hulp

23/11/2024 16:19:16
 
Ward van der Put
Moderator

Ward van der Put

28/05/2014 07:31:50
Quote Anchor link
Je kunt (en moet) zelf bepalen wat een "valid state" is.

De class Pannenkoekenbakker kan bijvoorbeeld bij de aanroep van bakken() ook terugmelden: "Pannenkoeken bakken is op dit moment niet mogelijk, want mijn recources (ingrediënten) zijn op."

Het verhaal verandert als een class Pannenkoekenbakker altijd een object moet opleveren dat kan bakken(). Dan zul je dat in de constructor moeten regelen, zodat na new Pannenkoekenbakker() direct bakken() kan worden aangeroepen.

Je kunt het vergelijken met de constructors van PDO en MySQLi. Kan er geen databaseverbinding worden geopend, dan falen die en krijg je geen "valid" object. Logisch, want je hebt zonder connectie geen "valid" connectie-object: het object is een representatie van iets anders, maar dat bestaat niet, dus is het object "invalid". Dat kan, net zoals bij je Pannenkoekenbakker, gebeuren doordat je ze de verkeerde ingrediënten meegeeft of doordat er te weinig externe resources zijn (bijvoorbeeld door een "Too many connections").
 
Dos Moonen

Dos Moonen

28/05/2014 09:27:14
Quote Anchor link
"Is de class nu in een "valid state"?"
Ja, de class wel. Over het object kan ik niets zeggen. Maar als de constructor correct (case-by-case basis) geschreven is, dan wel. Er vanuit gaand dat er geen exception gegooid is natuurlijk, in dat gevan is er namelik geen object. (Er vanuit gaand dat er geen 'this leak' plaats vindt in de constructor.)

"De oplettende lezer zal het misschien zijn opgevallen dat ik een pannenkoek opvraag, maar dat er nog geen pannenkoek is gebakken!"
Dit klinkt eerder als een method die hernoemt moet worden zodat het duidelijk wordt dat er telkens een nieuwe pannenkoek gebakken wordt.
Als je eerst bakken() aan moet roepen voordat je getPannenkoek() successvol aan kan roepen zou het zo kunnen zijn dat je de fout hebt gemaakt om het Sequential coupling anti-pattern toe te passen. (Weer een case-by-case basis, een legitieme use case is dat de remove($key) methode alleen een non-null waarde returned als er eerst add($key, $value) is aangeroepen met de zelfde key.)
Een reden om zulke constructies te vermijden is dat het bij multi-threading niet echt lekker werkt. Dingen afleren is moeilijk, begin zo vroeg mogelijk.
 
Wouter J

Wouter J

28/05/2014 09:50:52
Quote Anchor link
En wat als we nu getPannenkoeken hernoemen naar bakken? Klaar!
 
Ozzie PHP

Ozzie PHP

28/05/2014 10:59:23
Quote Anchor link
Het is (vind ik) lastig om uit te leggen wat ik precies bedoel, dus vandaar ook het misschien wat vreemde voorbeeld van de Pannenkoekenbakker.

@Wouter

>> En wat als we nu getPannenkoeken hernoemen naar bakken? Klaar!

Dat zou kunnen, maar ik wil direct als ik getPannenkoek aanroep een pannenkoek krijgen, en ik wil niet dat ie dan nog moet worden gebakken. Ik wil dus dat dat pannenkoek al klaar ligt op het moment dat ik hem aanroep.

@Dos:

>> Ja, de class wel. Over het object kan ik niets zeggen.

Oké... goede opmerking. En daar heb ik gelijk een vraag over. Is het de taak van de constructor om een class in valid state te brengen, of een object?

>> Als je eerst bakken() aan moet roepen voordat je getPannenkoek() successvol aan kan roepen zou het zo kunnen zijn dat je de fout hebt gemaakt om het Sequential coupling anti-pattern toe te passen.

Dat is precies wat er aan de hand is! Ik moet eerst bakken alvorens ik mijn pannenkoek kan opvragen! Fijn om te leren dat dit dus een anti-pattern is wat ik niet moet gebruiken in dit geval. Is de oplossing dan inderdaad om in de constructor al te gaan bakken?

@Ward:

>> ...zodat na new Pannenkoekenbakker() direct bakken() kan worden aangeroepen.

Bedoel je dan dat bakken() IN de contructor zelf wordt aangeroepen?
 
Wouter J

Wouter J

28/05/2014 11:33:19
Quote Anchor link
>> Dat zou kunnen, maar ik wil direct als ik getPannenkoek aanroep een pannenkoek krijgen, en ik wil niet dat ie dan nog moet worden gebakken. Ik wil dus dat dat pannenkoek al klaar ligt op het moment dat ik hem aanroep.

Dat is behoorlijk krom toch? Of hij moet worden gebakken of op zijn minst worden opgewarmt. Dus een bakken() en opwarmen() method zou dan beter zijn.

Vertel eens je echte probleem, dan kunnen we daar feedback op geven.
 
Dos Moonen

Dos Moonen

28/05/2014 11:33:22
Quote Anchor link
Quote:
Is de oplossing dan inderdaad om in de constructor al te gaan bakken?

Geen idee. Dat zou betekenen dat één Pannenkoekenbakker object maar één pannenkoek kan bakken. En ik kreeg nou juist het idee dat Pannenkoekenbakker een factory was zodat je niet telkens een nieuw Pannenkoekenbakker object hoeft je maken voor pannenkoeken met de zelfde ingredienten. Dan zou de callee namelijk net zo goed zelf een Pannenkoek object aan kunnen maken.

Quote:
Is het de taak van de constructor om een class in valid state te brengen, of een object?

De constructor is (in PHP) een (speciale) instance method. Voor elk object wordt een constructor aangeroepen. Het kan dus niet zo zijn dat constructors de class in een valide staat moeten brengen aangezien het mogelijk is dat een een class wordt gebruikt zonder dat er een instantie van die class bestaat. Dat zou betekenen dat de constructor niet is uitgevoerd en dus de class zich in een invalide staat bevind. Dit mag niet voorkomen.

In Java zou je kunnen zeggen dat een constructor een speciaal non-static initilizer block is, welke constructor uitgevoerd wordt hangt af van de parameters die je mee geeft, je kan die daarna niet nog eens uitvoeren.
Een static initializer block is er logischerwijs verantwoordelijk voor om de class in een valide staat te brengen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package x;

import y;
import z;

public class Test {
    // non-static initializer
    {
        System.out.println("wordt uitgevoerd tijdens het creren van een object, ik geloof n Object's constructor en vr alle andere parent constructors");
    }
    // static initialize block
    static {
        System.out.println("wordt uitgevoerd tijdens het laden van de class");
    }

    // conditioneel non-static initializer
    public Test(String fullName) {
        // ...
    }

    // conditioneel non-static initializer
    public Test(String firstName, String LastName) {
        // ...
    }
}


Als we dat vertalen naar PHP krijgen we zoiets als dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

namespace x;

use y;
use z;
// static initializer block A {
echo "wordt uitgevoerd tijdens het laden van de class";
// }
class Test {

    // geen non-static initializer blocks mogelijk

    public function __construct($a, $b = NULL) {
        // ...
    }
}

// static initializer block B {
echo "wordt uitgevoerd tijdens het laden van de class";
// }
?>
Gewijzigd op 28/05/2014 11:39:33 door Dos Moonen
 
Ward van der Put
Moderator

Ward van der Put

28/05/2014 11:34:31
Quote Anchor link
Ozzie PHP op 28/05/2014 10:59:23:
@Ward:

>> ...zodat na new Pannenkoekenbakker() direct bakken() kan worden aangeroepen.

Bedoel je dan dat bakken() IN de contructor zelf wordt aangeroepen?

Nee, als een new Pannenkoekenbakker() alleen een geldige Pannenkoekenbakker is indien deze de methode bakken() ondersteunt maar het object daarvoor eerst in een bepaalde toestand moet worden gebracht, dan hoor je daarvoor de constructor te gebruiken.

Je moet voorkomen dat je objecten moet initialiseren. Dat is het domein van de constructor. Of anders gezegd: je wilt niet dat er ongeldige objecten in omloop zijn, want daarmee programmeer je bugs die later tot problemen kunnen leiden. Zoals het Wikipedia-artikel over sequential coupling ook zegt: de aanwezigheid van een methode met "init", "start" of "begin" is een veeg teken dat je een anti-pattern gebruikt.

Wil je niet de constructor gebruiken, dan kun je een ander creational pattern gebruiken om de verantwoordelijkheid te delegeren aan een andere klasse, bijvoorbeeld aan een PannenkoekenbakkerInstituut. Dat PannenkoekenbakkerInstituut zorgt er vervolgens voor dat er alleen Pannenkoekenbakkers te werk worden gesteld die de methode bakken() ondersteunen.
 
Ozzie PHP

Ozzie PHP

28/05/2014 13:06:23
Quote Anchor link
Dankjewel voor de reacties.

@Dos: oké. Dank je voor de toelichting. Een constructor brengt dus een object in een valide staat.

Ik zal nog even op de vraag van Wouter in gaan.

>> Vertel eens je echte probleem, dan kunnen we daar feedback op geven.

Het was een gedachte waar ik mee speelde. Lastig om uit te leggen. Het had te maken met als je iets wilt gebruiken wat eerst geconfigureerd moet worden. Maar beter zou je dan het Factory pattern kunnen gebruiken denk ik nu. Stel je wilt bijv. services configureren, ik zat te denken... moet je dan zoiets doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$configurator
= new ServicesConfigurator($input);
$configurator->configure(); // hiet zat dus mijn twijfel, moet de constructor dit niet doen?
$services = $configurator->getServices();
?>

Nu ik er even met jullie over heb gebabbeld denk ik dat dit een beter oplossing is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$services
= ServicesBuilder::build($input);
?>
Gewijzigd op 28/05/2014 13:07:01 door Ozzie PHP
 
NOLot -

NOLot -

28/05/2014 14:59:02
Quote Anchor link
Factory pattern zozo
 
Ozzie PHP

Ozzie PHP

28/05/2014 17:07:33
Quote Anchor link
>> Factory pattern zozo

Zo heeft dat toch? Of zeg ik iets raars nu?
 
Wouter J

Wouter J

28/05/2014 19:54:29
Quote Anchor link
Volgens mij gaan we nu compleet de verkeerde kant op.

Ipv nog een klasse erbij te maken omdat we zo graag een aparte configure method willen hebben moeten we eerder gaan nadenken of dit wel is wat je wilt.

Waarom zou ServiceConfigurator bijv. niet met meerdere inputs kunnen werken? Waarom zou ik per input een nieuwe instance moeten aanmaken? Het zou veel logischer zijn als ServiceConfigurator een stateless class zou zijn en de configure method de services in de container zou zetten aan de hand van de input:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

$loader
= new ContainerChainLoader(array(
    $yamlLoader, $xmlLoader, $phpLoader
));
$resources = array(
    BASE_DIR.'/config/services.yml',
    // ...
);
foreach ($modules as $module) {
    $resources[] = $module->getConfigResources();
}


$containerConfig = new SeriveConfigurator($loader);

$containerConfig->configure($container, $resources);
?>
 
Ozzie PHP

Ozzie PHP

28/05/2014 21:11:43
Quote Anchor link
Hmmm... dat is iets om over na te denken inderdaad. Met stateless bedoel je dat er geen class properties aanwezig zijn?

Waarom geef je trouwens 3 loaders mee?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.