[oop] interface of datamapper voor vimeorequest ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ken PHP

Ken PHP

25/03/2014 17:22:06
Quote Anchor link
Hallo php'ers,

Ik moet voor een klein project vimeo data ophalen uit verschillende resources. Ik heb hiervoor een interface gemaakt die als basis dient voor de classes, maar is dit wel de juiste benadering? Hoe zouden jullie dit aanpakken?

Dit is mijn code:

VimeoRequest.interface.php :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
interface VimeoRequest {
public function get($id);
}


VimeoDatabaseRequest.model.php :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
class VimeoDatabaseRequest implements VimeoRequest {
public function get($id) { // fetch from database }
}


VimeoCurlRequest.model.php :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
class VimeoCurlRequest implements VimeoRequest {
public function get($id) { // fetch from vimeo source thru curl }
}


Vervolgens kan je de request doorgeven aan een VimeoVideo object die de get() functie uitvoert:

Instantie :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
$video = array(
 0 => '37298',
 1 => '38098'
);

$curl_mapper = new VimeoCurlRequest();
$video = new VimeoVideo($video[0], $curl_mapper);
echo $video->render();

$db_mapper = new VimeoDatabaseRequest();
$video = new VimeoVideo($video[1], $db_mapper);
echo $vimeo->render();


Ik hoor graag of dit een correcte benadering is.

Groetjes, Ken
Gewijzigd op 25/03/2014 19:05:27 door Ken PHP
 
PHP hulp

PHP hulp

05/05/2024 22:37:57
 
- Raoul -

- Raoul -

25/03/2014 21:57:09
Quote Anchor link
Dat ziet er wel goed uit ja.
 
Wouter J

Wouter J

25/03/2014 22:08:27
Quote Anchor link
Wat jij hier hebt is het Adapter pattern. En dat is perfect voor deze situatie.

Ik heb wel wat andere bedenkingen over je code:
- De Vimeo*Request klassen fetchen een VimeoVideo klasse. Wat jij nu doet is een VimeoVideo klasse aanmaken en dan zichzelf laten fetchen. Of dit is een probleem in de naamgeving, of je doet hier iets verkeerd.
- Kijk eens naar namespaces, die maken je code al snel een stuk mooier met al die Vimeo prefixen :)
- Een kleine tip: Probeer de naamgeving van je methoden te baseren op wat je normaal zou zeggen. Je code moet eigenlijk gewoon een verhaal worden. Gebruik niet dingen als "get" waar ze eigenlijk niet in de zin zouden passen. Je doet dit alleen maar omdat developers nou eenmaal vinden dat het "get" moet zijn. In je beide comments heb je het al over "fetch from ...". fetch zou dus een veel mooiere naam voor deze method zijn.
- Leer om netjes in te springen. Nu doe je het vaak niet, soms met 1 spatie, etc. Gebruik een tab of 2 a 4 spaties, dan wordt je code het meest overzichtelijk.
 
Ken PHP

Ken PHP

26/03/2014 09:44:36
Quote Anchor link
Wouter, allereerst bedankt voor je reactie!

Wouter J op 25/03/2014 22:08:27:
Wat jij hier hebt is het Adapter pattern. En dat is perfect voor deze situatie.

Cool, thanks! Hierover heb ik inderdaad een keer wat gelezen, zal het er weer eens bij pakken.

Wouter J op 25/03/2014 22:08:27:
Ik heb wel wat andere bedenkingen over je code:
- De Vimeo*Request klassen fetchen een VimeoVideo klasse. Wat jij nu doet is een VimeoVideo klasse aanmaken en dan zichzelf laten fetchen. Of dit is een probleem in de naamgeving, of je doet hier iets verkeerd.

Ik begrijp je gedeeltelijk. Ik besef wel dat dit onderdeel nog wat extra uitwerking kan krijgen. In VimeoVideo doe ik nu wat basis validaties zoals controleren of het id numeric is, en haal ik via deze functie de video op:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
private function getVideo() {        
    $this->_data = $this->mapper->get($this->_id);
}

Daarna kan ik op basis van de video data de ratio en het formaat bepalen en de url opbouwen met extra configuraties zoals kleur, title etc. Als laatste kan je dmv de render() functie aanroepen die een andere class instantieert om de view te bouwen.

Wouter J op 25/03/2014 22:08:27:
- Kijk eens naar namespaces, die maken je code al snel een stuk mooier met al die Vimeo prefixen :)

Ja, dat is een goede next step! :)

Wouter J op 25/03/2014 22:08:27:
- Een kleine tip: Probeer de naamgeving van je methoden te baseren op wat je normaal zou zeggen. Je code moet eigenlijk gewoon een verhaal worden. Gebruik niet dingen als "get" waar ze eigenlijk niet in de zin zouden passen. Je doet dit alleen maar omdat developers nou eenmaal vinden dat het "get" moet zijn. In je beide comments heb je het al over "fetch from ...". fetch zou dus een veel mooiere naam voor deze method zijn.

Goede tip! Zal ik wat meer op letten.

Wouter J op 25/03/2014 22:08:27:
- Leer om netjes in te springen. Nu doe je het vaak niet, soms met 1 spatie, etc. Gebruik een tab of 2 a 4 spaties, dan wordt je code het meest overzichtelijk.

Ja, dit doe ik al maar komt hier niet echt tot zijn recht, sorry :)

--

Mocht je meer input hebben dan hou ik mij aanbevolen!

Thanks!
Gewijzigd op 26/03/2014 09:46:19 door Ken PHP
 
Wouter J

Wouter J

26/03/2014 11:14:21
Quote Anchor link
Quote:
Ik begrijp je gedeeltelijk. Ik besef wel dat dit onderdeel nog wat extra uitwerking kan krijgen. In VimeoVideo doe ik nu wat basis validaties zoals controleren of het id numeric is, en haal ik via deze functie de video op:
[..code..]
Daarna kan ik op basis van de video data de ratio en het formaat bepalen en de url opbouwen met extra configuraties zoals kleur, title etc. Als laatste kan je dmv de render() functie aanroepen die een andere class instantieert om de view te bouwen.

Oke, tijd om je het SOLID principe te introduceren. SOLID is een afkorting voor de belangrijkste OO principes:
- Single Responsibility Principle
- Open/closed principle
- Liskov's Substitution
- Interface Segregation
- Dependency Inversion

Er is een goede tutorial serie hierover op code tuts+, ik raad je zeker aan om die door te lezen: http://code.tutsplus.com/tutorials/solid-part-1-the-single-responsibility-principle--net-36074

Maar voor nu kijken we even naar de S: Single Responsibility Principle. De definitie van dit principe: Een klasse/method zou maar 1 rede moeten hebben om te veranderen.

Nu kijk ik even naar wat jij me hebt uitgelegd over de VimeoVideo klasse:
- Het houdt een basis ID vast
- Het valideert de ID
- Het fetch een instance van zichzelf
- Het berekend wat onbekende parameters
- Het maakt een URL
- Het rendert een widget van zichzelf

Dit zijn 5 redenen waarom wij de VimeoVideo klasse zouden moeten aanpassen. Stel het fetchen veranderd of er komen meer onbekende parameters bij. Of de URL veranderd. Of .... Allemaal redenen waarom we die klasse moeten aanpassen, dit zou er maar 1 moeten zijn.

Om dit te veranderen gaan we elke rede een eigen klasse geven.
We krijgen dus een VideoId klasse. Dit is een zogenoemde Value Object. Het enige wat deze doet is een value vasthouden en valideren of hij wel klopt.
Vervolgens hebben we een DataMapper. Deze krijgt een VideoId en geeft een nieuwe instance van een Video object terug.
We hebben ook een VideoParameterResolver, deze berekend de onbekende parameters.
Daarnaast hebben we nog een VideoUrlGenerator en een VideoWidgetRenderer.

Een voorbeeld code:
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
<?php

use Ken\Vimeo\Video\DataMapper\Request as RequestDataMapper;
use Ken\Vimeo\Video\Id as VideoId;
use Ken\Vimeo\Video\ParameterResolver;
use Ken\Vimeo\Video\UrlGenerator;
use Ken\Vimeo\Video\Widget\Simple as SimpleWidget;

$videoMapper = new RequestDataMapper(...);
$video = $videoMapper->fetch(new VideoId(124));

$resolver = new ParameterResolver(...);
$video = $resolver->resolve($video);

$urlGenerator = new UrlGenerator(...);

$widget = new SimpleWidget($video, $urlGenerator);

echo $widget->render();
?>
 
Ken PHP

Ken PHP

26/03/2014 12:34:31
Quote Anchor link
Haha, wow! Wat een fijne uitleg Wouter. Heel duidelijk! Van SOLID had ik al eens wat gelezen en probeer ik al mee te nemen, vandaar dat ik al aangaf dat VimeoVideo class nog wat uitwerking kan hebben. Door jou uitleg kan ik hier goed mee aan de slag! Ziet er goed uit!

Dit is ook wel een fijn artikel:
http://juniorgrossi.com/2013/be-a-better-php-developer/

Nogmaals bedankt!

Gr, Ken
 



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.