Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czy rozbijać na wiele klas?
Fifi209
post
Post #1





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Piszę grę, zastanawiam się jak rozplanować sobie klasy, czy wrzucić wszystko do worka czy nie, chodzi dokładnie o to, że obecnie mam dwie klasy, jedna służy do zarządzania samymi użytkownikami, tj. logowanie, zmiana hasła, rejestracja etc. druga natomiast obsługuje rzeczy związane stricte z grą, punkty, surowce. Zastanawiam się czy połączyć je jakoś, czy zostawić w takiej postaci. Póki co wiem, za co każda odpowiada i gdzie czego szukać, wydaje się to przemawiać na korzyść tego rozwiązania.

Drugie pytanie: chcę mieć możliwość zwrócenia danych w odpowiednim formacie np. JSON, XML, z początku myślałem o rozwiązaniach rodem z C#, np. klasa.metoda().toString() odpowiednikiem w php byłaby klasa-> metoda()-> toString() czy da się coś takiego zrobić? Drugim rozwiązaniem jest napisanie klasy, która przyjmowałaby dwa argumenty dane i format w jakim mają zostać zwrócone, jednak druga konstrukcja jest o wiele mniej wygodna.
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




1. Zdecydowanie nie. Takie super mega klasy robiące wszystko są wynikiem nieznajomości programowania obiektowego.
2. Ja bym napisał klasę renderera na zasadzie:
  1. class Document {
  2.  
  3. }
  4.  
  5. abstract class Document_Renderer {
  6. abstract public function render(Document $doc);
  7. }
  8.  
  9. class Document_Renderer_Pdf extends Document_Renderer {
  10. public function render(Document $doc) {
  11. return 'pdf';
  12. }
  13. }
  14.  
  15. class Document_Renderer_Html extends Document_Renderer {
  16. public function render(Document $doc) {
  17. return 'html';
  18. }
  19. }

Twój obiekt, który chcesz wyświetlić to obiekt klasy Document. Przekazujesz go do obiektu konkretnego renderera, który zwraca Ci dokument w odpowiednim formacie. Użycie:
  1. $doc = new Document();
  2. $renderer = new Document_Renderer_Html();
  3.  
  4. echo $renderer->render($doc);
Go to the top of the page
+Quote Post
by_ikar
post
Post #3





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat
Drugie pytanie: chcę mieć możliwość zwrócenia danych w odpowiednim formacie np. JSON, XML, z początku myślałem o rozwiązaniach rodem z C#, np. klasa.metoda().toString() odpowiednikiem w php byłaby klasa-> metoda()-> toString() czy da się coś takiego zrobić?


Da się: http://www.webnote.pl/method-chaining-w-php.html

Cytat
Piszę grę, zastanawiam się jak rozplanować sobie klasy, czy wrzucić wszystko do worka czy nie, chodzi dokładnie o to, że obecnie mam dwie klasy, jedna służy do zarządzania samymi użytkownikami, tj. logowanie, zmiana hasła, rejestracja etc. druga natomiast obsługuje rzeczy związane stricte z grą, punkty, surowce. Zastanawiam się czy połączyć je jakoś, czy zostawić w takiej postaci. Póki co wiem, za co każda odpowiada i gdzie czego szukać, wydaje się to przemawiać na korzyść tego rozwiązania.


IMO lepiej rozbić sobie te klasy. Niech każda odpowiada za coś specyficznego.
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Ikar póki co są rozbite. I nie chodziło mi o to co podałeś w linku, ten sposób znam ale nie o to mi chodziło.
Wytłumaczę jeszcze raz, chcę to móc wywołać na każdej metodzie w klasie w podany wyżej sposób, ale tak aby ta funkcja automatycznie pobrała wynik działania poprzedniej metody i go odpowiednio obrobiła.
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




By móc wywołać $obiekt-> metoda()->toString() metoda metoda() obiektu $obiekt musi zwrócić obiekt, który będzie posiadał metodę toString(). Czyli mniej-więcej:
  1. class Klasa {
  2. public function metoda() {
  3. return new InnaKlasa();
  4. }
  5. }
  6.  
  7. class InnaKlasa {
  8. public function toString() {
  9. return 'siema';
  10. }
  11. }
  12.  
  13. $obj = new Klasa();
  14.  
  15. echo $obj->metoda()->toString();
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Pomysłów miałem wiele, na ten nie wpadłem. (IMG:style_emoticons/default/wink.gif) teraz tylko dodać do konstruktora parametr, zapisać sobie w zmiennej. Po przespanej nocy lepiej człowiek funkcjonuje. Dzięki.

Pamiętajcie programiści, z problemem lepiej się przespać. (IMG:style_emoticons/default/wink.gif)

Ten post edytował Fifi209 24.01.2012, 09:29:03
Go to the top of the page
+Quote Post
by_ikar
post
Post #7





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(Fifi209 @ 24.01.2012, 09:11:31 ) *
Ikar póki co są rozbite. I nie chodziło mi o to co podałeś w linku, ten sposób znam ale nie o to mi chodziło.
Wytłumaczę jeszcze raz, chcę to móc wywołać na każdej metodzie w klasie w podany wyżej sposób, ale tak aby ta funkcja automatycznie pobrała wynik działania poprzedniej metody i go odpowiednio obrobiła.


W php się tego inaczej nie da zrobić. Musisz zwrócić albo obiekt w którym jesteś, albo utworzyć jakiś obiekt. Generalnie musisz cokolwiek zwrócić żeby móc operować na danych z tej konkretnej metody. Niestety taki jest php (IMG:style_emoticons/default/wink.gif)

Przykład phpion'a jest dobry, ale żeby ci to lepiej pokazać zrobiłbym to tak:

  1. <?php
  2.  
  3.  
  4. class Foo
  5. {
  6. public function method()
  7. {
  8. $res = 'something';
  9.  
  10. return new Response($res);
  11. }
  12. }
  13.  
  14. class Response
  15. {
  16. protected $data;
  17.  
  18. public function __construct($data)
  19. {
  20. $this->data = $data;
  21. }
  22.  
  23. public function toXml()
  24. {
  25. return '<?xml version="1.0" encoding="UTF-8"?>'.$this->data;
  26. }
  27.  
  28. public function toJson()
  29. {
  30. return '{'.$this->data.'}';
  31. }
  32.  
  33. public function toString()
  34. {
  35. return (string) $this->data;
  36. }
  37. }
  38.  
  39. $obj = new Foo();
  40.  
  41. $obj->method()->toXml();
  42. $obj->method()->toJson();
  43. $obj->method()->toString();


Teraz już w sumie powinieneś wiedzieć mniej więcej o co chodzi (IMG:style_emoticons/default/wink.gif)

EDIT: zdecydowanie nie można jeść śniadania jednocześnie pisząc, bo jak widać piszę się jednego posta prawie 20min (IMG:style_emoticons/default/tongue.gif)

Ten post edytował by_ikar 24.01.2012, 09:50:09
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Rozwiązanie z klasą posiadającą metody to*() jest moim zdaniem gorsze od zaprezentowanego przeze mnie (osobne klasy). Dlaczego?
1. Lepiej jest dokładać nowe klasy zwracające dane w nowych formatach niż dokładać metody do istniejącej klasy.
2. Co w przypadku gdy potrzebujesz zwrócić dane w jednym formacie, ale w różny sposób (np. różne kodowanie XMLa)? Lepiej utworzyć nową klasę dziedziczącą po (przykładowo) Renderer_Xml, w której zmieni się jedynie parametr encoding.
3. Każda klasa może mieć dowolne parametry "konfiguracyjne" (jak chociażby wspomniany encoding dla XMLa) właściwe tylko dla swojego typu zwracanych danych.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 17:17