Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Który wzorzec do konwersji danych różnego typu?
Forum PHP.pl > Forum > PHP > Object-oriented programming
kkarpieszuk
Witam. Po raz pierwszy na tym forum, ale poczułem, że muszę się poradzić kogoś mądrzejszego więc założyłem konto smile.gif

Zastanawiam się jaki wzorzec projektowy wybrać do takiego zadania.

Muszę przekonwertować dane ID na inną wartość.

ID jakie otrzymam może być różnego typu: może to być ID wpisu, ID kategorii, ID załącznika. W zależności od tego jaki to jest typ, algorytm konwersji będzie inny.

Dochodzi jeszcze jedna warstwa problemu: ID może być dostarczone jako liczba albo tablica liczb (wtedy wiele ID) i moja funkcja/metoda musi zwrócić to w takim samym formacie.

Teraz moje pomysły, ale może ktoś ma lepszy:

1. Metoda fabrykująca lub fabryka abstrakcyjna (jeśli to dobry pomysł, to które będzie lepsze?)

Stworzę fabrykę, która na końcu utworzy odpowiedni obiekt z odpowiednią metodą konwertuj(). Uda się zapewne skomponować coś ładnego co weźmie pod uwagę różny typ ID jak i różny format w jakim zostało dostarczone (liczba lub tablica)

2. Command

Ostatecznie potrzebuję przecież metody konwertuj() więc jakoś mi intuicja podpowiada, że to przecież jest command. Dobrze myślę?


A może coś innego?
aniolekx
Strategy wink.gif
kkarpieszuk
przez chwile tez mi przyszla do glowy strategia, ale za bardzo nie moge to dopasowac do problemu. Mozesz mniej wiecej rozpisac jak bys to widzial?

(sorry, nie odrabiasz za mnie pracy domowej, po prostu naprawde jakos nie moge przeskoczyc przy tym kodzie z myslenia o szczegolach do spojrzenia z dystansu)
Pyton_000
Tak na szybko:

  1. <?php
  2.  
  3. interface Converter {
  4. public function convert(array $id)
  5. }
  6.  
  7. class ConvertPost extends Converter {
  8.  
  9. public function convert(array $id) {
  10.  
  11. // ...
  12.  
  13. retun [];
  14. }
  15. }
  16.  
  17. class ConvertData {
  18. public __construct(Converter $strategy) {
  19. $this->strategy = $strategy;
  20. }
  21.  
  22. public function convert($data)
  23. {
  24. if(!is_array($data)) {
  25. $data = (array)$data;
  26. }
  27.  
  28. return $this->strategy->convert($data);
  29. }
  30. }
  31.  
  32. $data = new ConvertData(new ConvertPost(1232));
  33.  
kkarpieszuk
Pyton_000 ok dzieki smile.gif już chyba kumam!
koszykarze
(uwaga głupie pytanie)

a jak coś takiego wykorzystać we frameworku (symfony),tzn co i gdzie poupychać zakładając, że chcę to trzymać w bibliotece do wielokrotnego użytku a nie w bundlu. (czy to bez sensu?)

tzn interfejs i ConvertData w bibliotece a różne implementacje klas konkretnych jak ConvertPost w bundlu? Czy wszystko w jednym miejscu?

bo rozumiem, że tu nic nie jest tworzone dynamicznie, na sztywno mam klasę ConvertData, którą jako usługę w kontrolerze i wywołuję obiektem ConvertPost czy innymi obiektami jemu podobnymi.
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-2024 Invision Power Services, Inc.