Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy rozbijać na wiele klas?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Fifi209
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.
phpion
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);
by_ikar
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.
Fifi209
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.
phpion
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();
Fifi209
Pomysłów miałem wiele, na ten nie wpadłem. 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ć. wink.gif
by_ikar
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 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 wink.gif

EDIT: zdecydowanie nie można jeść śniadania jednocześnie pisząc, bo jak widać piszę się jednego posta prawie 20min tongue.gif
phpion
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.
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.