Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Który wzorzec do konwersji danych różnego typu?
kkarpieszuk
post 21.07.2016, 15:26:32
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 21.07.2016

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
aniolekx
post 21.07.2016, 15:50:04
Post #2





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

Ostrzeżenie: (0%)
-----


Strategy wink.gif
Go to the top of the page
+Quote Post
kkarpieszuk
post 21.07.2016, 15:57:50
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 21.07.2016

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
Pyton_000
post 21.07.2016, 18:54:37
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
kkarpieszuk
post 21.07.2016, 19:34:58
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 21.07.2016

Ostrzeżenie: (0%)
-----


Pyton_000 ok dzieki smile.gif już chyba kumam!
Go to the top of the page
+Quote Post
koszykarze
post 8.08.2016, 21:44:08
Post #6





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 10.10.2015
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


(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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 08:24