Ga naar inhoud
Log in om dit te volgen  
kingunit

Design Patterns: Adapter Pattern

Aanbevolen berichten

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:

  • 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.

Adapter pattern
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):
Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

class Vimeo
{
    public function getViews($id)
    {

        return 100;
    }
}


$vimeo = new Vimeo();

// We gebruiken even onze methode een aantal keer door onze code.
echo $vimeo->getViews(jk2nM1);
echo $vimeo->getViews(M1n4Zg);
echo $vimeo->getViews(k1mAk4);
echo $vimeo->getViews(8AnzmQ);
echo $vimeo->getViews(Amjr9Z);
echo $vimeo->getViews(Iqb4z3);


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:
Codeblok:
1
2
3
4
5
6
<?php

interface VimeoAdapterInterface
{
    public function getViews($id);
}


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.

Codeblok:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

interface VimeoAdapterInterface
{
    public function getViews($id);
}


class VimeoAdapter implements VimeoAdapterInterface
{
    protected $client;

    public function __construct(Vimeo $client)
    {

        $this->client = $client;
    }


    public function getViews($id)
    {

        return $this->client->getViews($id);
    }
}


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.

Codeblok:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

interface VimeoAdapterInterface
{
    public function getViews($id);
}


class VimeoAdapter implements VimeoAdapterInterface
{
    protected $client;

    public function __construct(Vimeo $client)
    {

        $this->client = $client;
    }


    public function getViews($id)
    {

        return $this->client->getViews($id);
    }
}


class Vimeo
{
    public function getViews($id)
    {

        return 100;
    }
}


$vimeo = new VimeoAdapter(new Vimeo());

// Door de gehele applicatie roepen wij de getViews functie aan (door de interface weten wij dat deze functie bestaat)
echo $vimeo->getViews(7673);
echo $vimeo->getViews(2345);
echo $vimeo->getViews(6789);
echo $vimeo->getViews(41672);
echo $vimeo->getViews(52552);
echo $vimeo->getViews(19583);


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.

Deel dit bericht


Link naar bericht
Delen op andere sites
Moet de class Vimeo ook geen interface hebben? Aangezien je in de adapter er vanuit gaat dat getViews() in Vimeo bestaat.

Deel dit bericht


Link naar bericht
Delen op andere sites
Dylan (link):
Moet de class Vimeo ook geen interface hebben? Aangezien je in de adapter er vanuit gaat dat getViews() in Vimeo bestaat.


Je kan er inderdaad voor kiezen om een VideoServiceInterface te maken. (mocht je naast Vimeo bijvoorbeeld YouTube willen hebben met de zelfde methodes)

Deel dit bericht


Link naar bericht
Delen op andere sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reageer op dit topic...

×   Geplakt als RTF formaat tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

Log in om dit te volgen  

×
×
  • Nieuwe aanmaken...