Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ideologia] w jaki sposób napisac pluginy?
Forum PHP.pl > Forum > PHP
aleksander
Piszę aplikacje obiektowych formularzy i natknąłem się na mały problem. OF moga miec klasy Rule które walidują pola formularza i pluginy które wykonują na nich operacje np md5 na polu po stronie klienta.

Na początku chciałem zrobic te dwie rzeczy oddzielnie ale pomyslałem sobie, że zastosuje takie samo API dla Rules i Pluginów i zrobie to za pomocą dekoratora np
  1. <?php
  2. new MD5hash( new IsNotNullRule( new isNumericRule( new Form() ) ) );
  3. ?>
Co Wy o tym myslicie?
Ociu
Ja też ostatnio miałem taki problem. Postanowiłem połączyć mapper z Rules Api i tak oto powstał jakiś dziwny stwór który dzięki Bogu działa smile.gif
Ludvik
Do mnie nie przemawia łączenie reguł z pluginami. Reguły służą do sprawdzenia poprawności danych, a pluginy mają na tych danych operować. Poza tym dekorator nie jest najlepszym wyjściem w tym przypadku, jeżeli już musisz tak zrobić. Wzorzec ma to do siebie, że nie zapewnia odpowiedniej kolejności wykonania. Więc możesz przez przypadek złe dane hashować. Ja bym to osobiście rozłączył w jakiś sposób.
aleksander
Cytat
Wzorzec ma to do siebie, że nie zapewnia odpowiedniej kolejności wykonania.

Wszystko zależy do tego w jakiej kolejności utworzy się instancje (patrz kod wyżej).

Poza tym może zajśc potrzeba kiedy najpierw należy jakies dane "zoperowac" a dopiero potem je zwalidowac. W przypadku rozdzielenia nie da się tego zrobic.
Ludvik
Cytat
Wszystko zależy do tego w jakiej kolejności utworzy się instancje (patrz kod wyżej).


To nie jest do końca prawdą. Nie mówię o wywołaniu metod, tylko wykonaniu czynności filtrów, a to jest duża różnica. Oto prosty przykład.

  1. <?php
  2. abstract class Decorator {
  3. public function __construct($nextDecorator = null) {
  4. if (!empty($nextDecorator) && $nextDecorator instanceof Decorator) {
  5. $this->next = $nextDecorator;
  6. }
  7. }
  8.  
  9. abstract public function dosmth($param);
  10.  
  11. protected $next;
  12. }
  13.  
  14. class Decorator1 extends Decorator {
  15. public function __construct($nextDecorator = null) {
  16. parent::__construct($nextDecorator);
  17. }
  18.  
  19. public function dosmth($param) {
  20. echo '<1>';
  21. if (!empty($this->next)) {
  22. $this->next->dosmth($param);
  23. }
  24. }
  25. }
  26.  
  27. class Decorator2 extends Decorator {
  28. public function __construct($nextDecorator = null) {
  29. parent::__construct($nextDecorator);
  30. }
  31.  
  32. public function dosmth($param) {
  33. if (!empty($this->next)) {
  34. $this->next->dosmth($param);
  35. }
  36. echo '<2>';
  37. }
  38. }
  39.  
  40. class Decorator3 extends Decorator {
  41. public function __construct($nextDecorator = null) {
  42. parent::__construct($nextDecorator);
  43. }
  44.  
  45. public function dosmth($param) {
  46. echo '<3>';
  47. if (!empty($this->next)) {
  48. $this->next->dosmth($param);
  49. }
  50. }
  51. }
  52.  
  53. $d = new Decorator1(new Decorator2(new Decorator3()));
  54. $d->dosmth('');
  55. ?>


Niestety dekorator wymaga trzymania porządku w kodzie i pozwala na takie przekłamania...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.