Actief-passief design pattern
Komt een waterkoker bij het fornuis…
Inleiding
Dankzij de kracht van object-georiënteerde programmeertalen zijn we als ontwikkelaars in staat een executeerbaar model te definiëren. Dit doen we door objectdefinities te maken, details te encapsuleren en gedrag te abstraheren door middel van polymorfisme. Object-oriëntatie als krachtig gereedschap wordt vaak ingezet om een model te maken van de werkelijkheid en deze in te zetten als onderdeel van de software. Eén van de problemen die vaak optreed is dat er onnodig complexe objecten ontstaan met veel verantwoordelijkheden en relaties tot andere objecten. Door het toepassen van het actief-passief design pattern kan men deze complexiteit reduceren.
Het patroon
In objectmodellering is actief-passief een patroon dat als volgt samengevat kan worden: Alle actieve objecten in de echte wereld worden passief in het model. Voor passieve objecten geldt het tegenovergestelde, deze worden juist actief.
Intentie
Zelfs als we meerdere modellen gebruiken kunnen modellen onnodig complex worden. Een veelgemaakte fout is dat we een model maken dat een te strakke afspiegeling is van de echte wereld. Dit is verklaarbaar omdat onze hersenen die wereld goed kennen en we ons hierin thuisvoelen. Om dit te voorkomen passen we het actief-passief-patroon toe. Met behulp van dit patroon kunnen we een eenvoudige vertaling maken van de echte wereld naar een model.
Voorbeeld
Hieronder zijn twee scenario’s beschreven. Beide beschrijven hoe Geertje thee zet. Het eerste verhaal speelt zich af in de echte wereld, terwijl het tweede zich afspeelt in het model.
In de echte wereld

Figuur 1: afhankelijkheden tussen objecten in de werkelijke wereld
Geertje wil graag een kopje thee drinken. Ze staat op van haar stoel en loopt naar de keuken. In de keuken pakt ze een theekop, waarna ze de theepot pakt en erachter komt dat deze helemaal leeg is. Dat betekent dat ze eerst nog thee moet zetten. Ze gebruikt de kraan om de ketel te vullen met water. Niet te vol natuurlijk, want dan kookt het water straks over. Geertje zet de ketel met water op het fornuis en wacht tot het water kookt. Daarna vult ze de theepot met het hete water uit de ketel en hangt er een theezakje in. Zodra de thee donker genoeg is verwijdert ze het theezakje en schenkt haar kop vol met thee.
In het model
Figuur 2: Afhankelijkheden tussen objecten in het model
Geertje wil graag een kopje thee drinken. Ze vertelt tegen een theekop dat ze graag thee wil. De kop gaat naar de theepot en vraagt of ze hem vol wilt schenken. De theepot komt er achter dat ze geen thee meer heeft en vraagt de ketel om wat water te koken. Genoeg om zichzelf helemaal mee te vullen. De ketel loopt naar de waterkraan en vraagt deze om hem te vullen. Nadat de ketel gevuld is loopt hij naar het fornuis en vraagt aan het fornuis of hij zijn pit wilt ontsteken. Zodra het vuur brand springt de ketel op de pit en wacht hij tot het water kookt. Daarna loopt hij terug naar de theepot om hem vervolgens vol te gieten met water. De theepot loopt terug naar de kop en vraagt aan een theezakje om in het water te springen en er niet uit te komen voordat de thee goed is. Het theezakje springt erin en wacht twee minuten voordat hij er weer uitkomt. Hierna is de thee klaar en schenkt de theepot het kopje vol met thee, waarna het theekopje terugloopt naar Geertje.
Afhankelijkheden
Figuur 1 en 2 geven de afhankelijkheden van objecten weer voor beide verhalen. Merk op dat in de echte wereld Geertje alle andere objecten inclusief het hele proces moet kennen, terwijl in het model de objecten slechts een paar afhankelijkheden hebben.
In plaats van afhankelijk te zijn van een complex object, is Geertje dit nu alleen van de theekop. De theekop hangt af van de theepot. De theepot op zijn beurt weer van de kraan en het gasfornuis, en zo verder. Alle objecten werken samen om een doel te verwezenlijken.
Het resultaat
Als het actief-passief-patroon goed wordt toegepast volgt er een model waarin verschillende objecten met elkaar samenwerken om een doel te verwezenlijken, waarbij menselijke actoren nauwelijks een rol spelen.
De verdeling van de complexiteit in het resulterende model is zoveel mogelijk evenredig verdeeld. Het model bevat kleinere simpele objecten met slechts een aantal afhankelijkheden. De objecten hebben hun eigen verantwoordelijkheden en gebruiken vooral anderen om hun doel te bereiken. Het is te vergelijken met een mierenkolonie. Het aantal objecten zal stijgen, terwijl de complexiteit per object afneemt.
Tips
- Kijk de film 'Beauty and the Beast' [1] om te zien hoe passieve objecten actief kunnen worden. Vooral de scene waarin Maurice het kasteel binnen komt [2] is karakteristiek voor dit concept.
- Gebruik backward chaining [3] om één object verantwoordelijk te maken voor het einddoel en vervolgens nieuwe objecten te introduceren om hierbij te helpen.
- Aarzel niet om nieuwe objecten te introduceren.
Gerelateerde patronen
- don't ask, but tell
- responsibility principle
- Chain of responsibility
Referenties
- Trousdale, Gary & Wise, Kirk., Beauty and the Beast, 1991 (http://www.imdb.com/title/tt0101414/)
- Scene uit Beauty and the beast: Maurice komt het kasteel binnen (http://www.youtube.com/watch?v=AEKb6UNbH6c)
- Mauro, Terri. backward chaining (http://specialchildren.about.com/od/developmentalissues/g/backwardchaining.htm)
Auteurs
- Pieter Joost van de Sande is Principal consultant Microsoft bij Atos Origin
- Tjeerd Hans Terpstra is senior technical consultant Microsoft bij Atos Origin