PHP:
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
40
41
42
43
44
45
46
47
48
49
50
51
| <?php interface InterfaceImage { public function crop(); public function resize(); } class GD implements InterfaceImage { public function crop() {} public function resize() {} } class ImageMagick implements InterfaceImage { public function crop() {} public function resize() {} public function rotate() {} } class Image { private $driver; private $image; public function setDriver($driver) { $this -> driver = new $driver(); } public function setImage($image) { $this -> image = $image; } public function __call($method, $params) { if(true === is_callable([$this -> driver, $method])) { return call_user_func_array([$this -> driver, $method], array_merge([$this -> image], func_get_args())); } } } $image = new Image(); $image -> setDriver('GD'); $image -> setImage('path/to/image'); $image -> crop(); $image -> rotate(); //Dit is enkel beschikbaar bij de ImageMagick driver ?> |
Hierboven is een voorbeeldcode van een aantal problemen waar ik tegenaan loop.
Bovenstaande is voorbeeld code welke de gebruiker in staat stelt om afbeeldingen te croppen en te resizen. Het croppen en resizen kan via de GD library van PHP of via ImageMagick, maar ik wil dat de gebruiker maar één class hoeft aan te spreken om de functionaliteit te gebruiken.
Dit is een use case maar dit kan net zo goed met databases classes gemaakt worden o.i.d.
Nu heb ik drie vragen:
Vraag 1:
Ik heb een interface aangemaakt voor beide "drivers" alleen de ImageMagick driver kan veel meer dan de GD driver. Als voorbeeld heb ik een "rotate" functionaliteit toegevoegd welke de GD driver niet ondersteund.
Dat houdt in dat aan de hand van de gekozen driver, functionaliteit wordt toegevoegd aan de Image class. Is dit de juiste gedachtegang of gaat dit tegen bepaalde design patterns regels in?
Vraag 2:
Op dit moment controlleer ik of de functionaliteit bestaat van de driver in de Image class door een universele "__call" method te maken welke dat controlleert. Ik kan ook alle losse functies welke de drivers hebben implementeren maar omdat de GD driver minder functies heeft dan de ImageMagick driver, is dat wellicht geen goed idee omdat er dan een functie bestaat in de Image class voor een functie in de driver die niet hoeft te bestaan. Wat is hier een goed idee in?
Vraag 3:
Is hier een specifieke design pattern voor? Het lijkt namelijk zowel op de factory design pattern als mede op de proxy design pattern.
Ik weet niet goed of ik dit op de "juiste" manier aanpak.