Design Patterns?
Dit is niet gerelateerd aan UX design of iets grafisch, dit gaat over patronen in software design. Design patterns of ontwerppatronen heeft eigenlijk alles te maken met software architectuur en structuur. Als beginnende programmeur schrijf je vaak procedural code dit is het tegenovergestelde van ?objectgeoriënteerd programmeren. Weet je nog niks over objectgeoriënteerd programmeren? Dan raad ik je aan om je daar eerst in te verdiepen voor het lezen van dit stuk.
Zoals ik beschreef zijn design patterns ontwerppatronen binnen het programmeren. Voor jouw development team betekent dat:
In dit artikel ga ik de adapter pattern behandelen. Het is een vrij eenvoudig patroon en wellicht gebruik je dit patroon al. Waarschijnlijk kennen jullie het woord adapter al (dit bijvoorbeeld). Het is een wrapper om jouw micro SD kaart heen zodat de laptop verbinding kan maken met jouw micro SD kaart. De adapter pattern doet eigenlijk hetzelfde maar dan voor jouw classes. Je maakt een soort van wrapper om jouw huidige class heen. Stel voor jij gebruikt in jouw systeem een bepaalde functie een stuk of 50 keer De methode heeft sinds gisteren een andere naam gekregen, jij moet dus jouw hele code door om al die namen te vervangen. (hierdoor vergroot je dus de kans op fouten in jouw systeem). Als je gebruik maakt van de adapter pattern hoef je maar 1x de naam te wijzingen omdat je overal de adapter gebruikt. Misschien klinkt dit nog een beetje gek maar ik hoop dat het aan "™t eind van dit artikel wat duidelijker is.
Laten we maar beginnen met een voorbeeld waar we de adapter pattern niet gebruiken. Bij dit voorbeeld is er niet heel veel mis. De code werkt prima en overal komt er een view count. Echter als de methode getViews de naam getAmountOfViews krijgt moeten wij op 6 plekken de code gaan wijzigen (chips dat is 6x kans op een bug/fout in ons systeem):
Laten we maar beginnen met het implementeren van onze adapter pattern. We gaan eerst een interface aanmaken met de naam: VimeoAdapterInterface. Dit zorgt ervoor dat elke classe die de interface implementeert de benodigde functies bevat. In dit geval is het maar 1 methode maar in jouw applicatie zijn het er misschien wel meer:
Vervolgens gaan we onze VimeoAdapter maken. Onze adapter implementeerd de VimeoAdapterInterface en hierdoor worden wij gedwongen de getViews methode toe te voegen. Ook maken we een constructor waar we onze originele Vimeo class in ontvangen. Die spelen we door naar $this->client zodat we in de getViews methode kunnen adapten naar de originele functie.
Nu maken we weer gebruik van onze originele Vimeo class. Echter bij het aanmaken van de class moeten wij ook de adapter aanroepen. Je roept dus eerst de adapter aan en vervolgens injecteer je jouw Vimeo class in de adapter.
Nu even weer terug naar ons scenario. Stel voor in de Vimeo class wijzigd de functie getViews naar getViewsCount, dan hoef ik alleen de VimeoAdapter aan te passen en dus niet 6x de applicatie te wijzigen.
Dit keer een kort patroon maar hopelijk is het duidelijk. Misschien lijkt het in dit voorbeeld heel erg overdrevend om een patroon te gebruiken maar dit is zeker handig bij grotere applicaties. Mocht iets onduidelijk zijn of heb ik iets onduidelijke uitgelegd dan hoor ik dat graag.
Dit is niet gerelateerd aan UX design of iets grafisch, dit gaat over patronen in software design. Design patterns of ontwerppatronen heeft eigenlijk alles te maken met software architectuur en structuur. Als beginnende programmeur schrijf je vaak procedural code dit is het tegenovergestelde van ?objectgeoriënteerd programmeren. Weet je nog niks over objectgeoriënteerd programmeren? Dan raad ik je aan om je daar eerst in te verdiepen voor het lezen van dit stuk.
Zoals ik beschreef zijn design patterns ontwerppatronen binnen het programmeren. Voor jouw development team betekent dat:
- Het is makkelijker om je code / software te onderhouden.
- Door ?abstracties is jouw code beter te lezen.
- Veel hergebruik van je eigen code.
- Het is voor een nieuwe programmeur in jouw team makkelijker om gelijk mee te draaien.
- Eventuele voorbeelden schrijf ik in PHP. Echter kun je design patterns overal toepassen waar je classes, abstracties en interfaces kunt gebruiken.
In dit artikel ga ik de adapter pattern behandelen. Het is een vrij eenvoudig patroon en wellicht gebruik je dit patroon al. Waarschijnlijk kennen jullie het woord adapter al (dit bijvoorbeeld). Het is een wrapper om jouw micro SD kaart heen zodat de laptop verbinding kan maken met jouw micro SD kaart. De adapter pattern doet eigenlijk hetzelfde maar dan voor jouw classes. Je maakt een soort van wrapper om jouw huidige class heen. Stel voor jij gebruikt in jouw systeem een bepaalde functie een stuk of 50 keer De methode heeft sinds gisteren een andere naam gekregen, jij moet dus jouw hele code door om al die namen te vervangen. (hierdoor vergroot je dus de kans op fouten in jouw systeem). Als je gebruik maakt van de adapter pattern hoef je maar 1x de naam te wijzingen omdat je overal de adapter gebruikt. Misschien klinkt dit nog een beetje gek maar ik hoop dat het aan "™t eind van dit artikel wat duidelijker is.
Laten we maar beginnen met een voorbeeld waar we de adapter pattern niet gebruiken. Bij dit voorbeeld is er niet heel veel mis. De code werkt prima en overal komt er een view count. Echter als de methode getViews de naam getAmountOfViews krijgt moeten wij op 6 plekken de code gaan wijzigen (chips dat is 6x kans op een bug/fout in ons systeem):
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] Vimeo
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700])
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]100[/COLOR][COLOR= #007700];
}
}[/COLOR]
[COLOR= #0000BB]$vimeo[/COLOR] [COLOR= #007700]= new[/COLOR] Vimeo[COLOR= #007700]();[/COLOR]
[COLOR= #FF8000]// We gebruiken even onze methode een aantal keer door onze code.[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]jk2nM1[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]M1n4Zg[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]k1mAk4[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]8AnzmQ[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]Amjr9Z[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]Iqb4z3[/COLOR][COLOR= #007700]);[/COLOR] Laten we maar beginnen met het implementeren van onze adapter pattern. We gaan eerst een interface aanmaken met de naam: VimeoAdapterInterface. Dit zorgt ervoor dat elke classe die de interface implementeert de benodigde functies bevat. In dit geval is het maar 1 methode maar in jouw applicatie zijn het er misschien wel meer:
[COLOR= #0000BB]<?php[/COLOR]
interface VimeoAdapterInterface
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700]);
}[/COLOR] Vervolgens gaan we onze VimeoAdapter maken. Onze adapter implementeerd de VimeoAdapterInterface en hierdoor worden wij gedwongen de getViews methode toe te voegen. Ook maken we een constructor waar we onze originele Vimeo class in ontvangen. Die spelen we door naar $this->client zodat we in de getViews methode kunnen adapten naar de originele functie.
[COLOR= #0000BB]<?php[/COLOR]
interface VimeoAdapterInterface
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700]);
}[/COLOR]
[URL="http://www.php.net/class"]class[/URL] VimeoAdapter implements VimeoAdapterInterface
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/protected"]protected[/URL] [COLOR= #0000BB]$client[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR]Vimeo [COLOR= #0000BB]$client[/COLOR][COLOR= #007700])
{[/COLOR]
[COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]client [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$client[/COLOR][COLOR= #007700];
}[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700])
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]client[COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700]);
}
}[/COLOR] Nu maken we weer gebruik van onze originele Vimeo class. Echter bij het aanmaken van de class moeten wij ook de adapter aanroepen. Je roept dus eerst de adapter aan en vervolgens injecteer je jouw Vimeo class in de adapter.
[COLOR= #0000BB]<?php[/COLOR]
interface VimeoAdapterInterface
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700]);
}[/COLOR]
[URL="http://www.php.net/class"]class[/URL] VimeoAdapter implements VimeoAdapterInterface
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/protected"]protected[/URL] [COLOR= #0000BB]$client[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR]Vimeo [COLOR= #0000BB]$client[/COLOR][COLOR= #007700])
{[/COLOR]
[COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]client [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$client[/COLOR][COLOR= #007700];
}[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700])
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]client[COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700]);
}
}[/COLOR]
[URL="http://www.php.net/class"]class[/URL] Vimeo
[COLOR= #007700]{[/COLOR]
[URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] getViews[COLOR= #007700]([/COLOR][COLOR= #0000BB]$id[/COLOR][COLOR= #007700])
{[/COLOR]
[URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]100[/COLOR][COLOR= #007700];
}
}[/COLOR]
[COLOR= #0000BB]$vimeo[/COLOR] [COLOR= #007700]= new[/COLOR] VimeoAdapter[COLOR= #007700](new[/COLOR] Vimeo[COLOR= #007700]());[/COLOR]
[COLOR= #FF8000]// Door de gehele applicatie roepen wij de getViews functie aan (door de interface weten wij dat deze functie bestaat)[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]7673[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]2345[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]6789[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]41672[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]52552[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$vimeo[/COLOR][COLOR= #007700]->[/COLOR]getViews[COLOR= #007700]([/COLOR][COLOR= #DD0000]19583[/COLOR][COLOR= #007700]);[/COLOR] Nu even weer terug naar ons scenario. Stel voor in de Vimeo class wijzigd de functie getViews naar getViewsCount, dan hoef ik alleen de VimeoAdapter aan te passen en dus niet 6x de applicatie te wijzigen.
Dit keer een kort patroon maar hopelijk is het duidelijk. Misschien lijkt het in dit voorbeeld heel erg overdrevend om een patroon te gebruiken maar dit is zeker handig bij grotere applicaties. Mocht iets onduidelijk zijn of heb ik iets onduidelijke uitgelegd dan hoor ik dat graag.