Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]OOP'owe początki
Forum PHP.pl > Forum > Przedszkole
Fanatyko
Witam, zaczynam zabawę z OOP'em przy wykorzystaniu wzorca MVC. Czy kod poniżej jest poprawny, czy też nie ? Co zmienić, co robić, czego nie robić (ogólnie tak jakos winksmiley.jpg)
Z czasem będę dodawał nowe pytania, bo zapewne na jednym się nie skończy

  1. <?php
  2.  
  3. $Controler = new GameController;
  4.  
  5.  
  6. class GameController
  7. {
  8. public function __construct()
  9. {
  10. if(isset($_GET['action']))
  11. {
  12. $strAction = $_GET['action'];
  13.  
  14. }
  15. else
  16. {
  17. $strAction = "statystyki";
  18.  
  19. }
  20. $objAction = new $strAction();
  21. $objAction->DoAction();
  22.  
  23.  
  24.  
  25. }
  26.  
  27. }
  28.  
  29. class ShowCharacter
  30. {
  31. public function DoAction()
  32. {
  33. $objModel = new CharacterModel();
  34. $arrCharacter = $objModel->GetCharacter();
  35.  
  36. foreach ($arrCharacter as $arrStatisctics)
  37. {
  38. echo "Sila: ".$arrStatisctics['strenght']." Zrecznosc: ".$arrStatisctics['agility']."";
  39. }
  40.  
  41. return null;
  42.  
  43. }
  44.  
  45. }
  46.  
  47. class CharacterModel
  48. {
  49. public function GetCharacter()
  50. {
  51. return array(array( 'strenght' => 15, 'agility' => 20)) ;
  52. }
  53.  
  54.  
  55. }
  56.  
  57.  
  58.  
  59. ?>
Pawel_W
po 1:
  1. if(isset($_GET['action']))
  2. {
  3. $strAction = $_GET['action'];
  4.  
  5. }
  6. else
  7. {
  8. $strAction = "statystyki";
  9.  
  10. }

żadne takie ify z $_GET, to powinno być przekazane w konstruktorzem czyli np.
  1. $Controler = new GameController($_GET['action']);;

smile.gif

2.
  1. $objAction = new $strAction();
  2. $objAction->DoAction();

to się aż prosi o zastosowanie wzorca projektowego "factory" smile.gif

po 3: DZIEDZICZENIE! - naprawdę warto byłoby z niego tu skorzystać winksmiley.jpg

Fanatyko
1.Ok dzięki, zaraz to poprawię.
2.Jakiś przykładzik by się dało ?
3.Przykład gdzie można to zastosować bym prosił smile.gif (średni ogarnięty z dziedziczeniem jestem ;p)

Dzięki za opowiedzi winksmiley.jpg
Pawel_W
2. http://bukox.pl/php/wzorce-projektowe-factory/

3. mógłbyś spokojnie połączyć klasy character model i show character, tak, żeby ta druga dziedziczyła z pierwszej, bo jak znam życie to pewnie to jeszcze rozbudujesz i tak Ci będzie prościej winksmiley.jpg
Fanatyko
OK, dziękuje. Potestuję sobie to co podrzuciłeś. Zapewne pytań ciąg dalszy niedługo smile.gif
Crozin
1) Twój kod nie ma wiele wspólnego z MVC - brak w nim w ogóle warstwy widoku.
2) Nie za bardzo wiem co Pawel_W miał na myśli przez dziedziczenie. Tutaj jego wykorzystanie byłoby błędem - przecież ShowCharacter::DoAction() jedynie wykorzystuje CharacterModel.
3) Twoja klasa GameController bardziej przypomina Dispatcher niż kontroler.

btw: return null; jest zbędne.
Pawel_W
wyszedłem z założenia, że każda postać będzie miała własne statystyki, dlatego dobrze byłoby to wszystko połączyć smile.gif
Crozin
Model ma się zajmować swoim zadaniem: ma udostępniać dane, a nie nimi zarządzać.
Fanatyko
Cytat
Twój kod nie ma wiele wspólnego z MVC - brak w nim w ogóle warstwy widoku.


A klasa ShowCharacter ?

Cytat
Twoja klasa GameController bardziej przypomina Dispatcher niż kontroler.


Mógłbyś wyjaśnić dlaczego ?



Crozin
Widok nie tworzy sam sobie modelu - to kontroler inicjalizuje widok i przekazuje mu model(e).
Luneth
Jedyne dziedziczenie jakie mi przychodzi tutaj na myśl to ewentualnie kontroler rozszerzający widok, żeby mieć dostęp do jego metod. Co do tych ifów w kontrolerze - zgodzę się z przedmówcą, ogólnie zrób sobie jakąś klasę router, która będzie parsować i filtrować żądanie GET, a jeśli kontroler ma parę różnych opcji co do wykonania akcji - to możesz np zastosować switcha miast tych ifów. Dodatkowo takie składowe funkcje widoku powinny zwracać te wartości zamiast od razu je wyświetlać, ogólnie funkcje same w sobie powinny zawsze coś zwracać. No i te kwestie o których Crozin też wspomniał.

Ponadto: http://www.phppatterns.com/docs/design/arc...rn?s=model+view
Fanatyko
@Crozin ok, chyba załapałem winksmiley.jpg
@Luneth dzięki, przydatny link.

Popracuję na kodem i zobaczę co mi wyjdzie. smile.gif

Wiecie co ? Jednak nie czaje absolutnie MVC biggrin.gif

Mógłby ktoś napisać/dać linka do baaardzo prostego przykładu MVC ? Taki który tłumaczy zasady tegoż wzroca. Byłbym wdzięczny.

PS. Czytałem troche tematów na forum ale nic mi to nie dało. Głupi jakoś jestem ostatnio tongue.gif
Luneth
Po prostu wszystko dzielisz na trzy kategorie: operacje na danych, pobieranie-udostępnianie danych, wyświetlanie danych (kontroler,model,widok). Kontroler ma wybierać model, dać go do widoku, widok z modelu ma wziąć dane i zapakować je w coś przyjemnego dla oka winksmiley.jpg MVC to po prostu pewna konkretna abstrakcja sposobu działania aplikacji, uporządkowania czegoś, nałożenia pewnych zasad jak i ograniczeń. Tego typu wzorce projektowe mają dwa podstawowe cele: umożliwiać przystępną rozbudowę (o kolejne abstrakcyjne wymysły, lub wprowadzanie np nowości w php, np wyobraź sobie, że chcesz wprowadzić przestrzenie nazw) no i ułatwiać pracę w grupie. Wolałbyś pracowac z np 10 osobami na czymś strukturalnym czy na takim ładnym, estetycznym, podzielonym na warstwy kodzie z interfejsami, klasami abstrakcyjnymi, z hermetyzacją, gdzie kod sam Ci mówi w jaki sposób działa i czego masz z nim nie robić przypadkiem? winksmiley.jpg Próbuj to ogarnąć, w końcu to "poczujesz" i załapiesz.

Tak samo jak masz bardziej złożone wzory matematyczne, ktoś je ułożył raz, byś Ty mógł ich używać i wykonywać obliczenia do których "zmusza" Cię ten wzór, zostały one przewidziane przez jego autora. Ufam, że kojarzysz wzór na deltę funkcji kwadratowej winksmiley.jpg Niby na 1 rzut oka nie wiadomo skąd te zależności w nim, ale stosując go właściwie masz pewność że otrzymujesz dobre wyniki bez rysowania sobie na kartce wykresu funkcji, prawda? To właśnie programowanie strukturalne jest takim mozolnym zaznaczaniem punktów i ich łączeniem a ten wzór taką przejrzystą zależnością pomiędzy składowymi (wzorce projektowe, obiektowe programowanie).
Fanatyko
  1. <?php
  2.  
  3.  
  4. class GameController
  5. {
  6. public function ShowChar()
  7. {
  8. $View = new View();
  9. $View->SetModel(new GameModel);
  10. return $View;
  11.  
  12. }
  13. }
  14.  
  15. class View
  16. {
  17. public function SetModel($model)
  18. {
  19. $this->Model = $model;
  20. }
  21.  
  22. public function SetTemplate($template)
  23. {
  24. $this->Template = $template;
  25. }
  26.  
  27. public function Show()
  28. {
  29. $Data = $this->Model;
  30. $this->Char = $Data->GetChar();
  31. $this->SetTemplate('table');
  32. include ('' . $this->Template . '.php');
  33. }
  34.  
  35. }
  36.  
  37. class GameModel
  38. {
  39. public function GetChar()
  40. {
  41. return array(array( 'strenght' => 15, 'agility' => 20)) ;
  42.  
  43. }
  44.  
  45.  
  46. }
  47.  
  48. $GameController = new GameController();
  49. $Result = $GameController->ShowChar();
  50.  
  51. if ($Result instanceof View)
  52. {
  53. $Result->Show();
  54. }
  55.  
  56.  
  57. ?>


Wymodziłem coś takiego, większość zerżnięta od Crozina ;D

Luneth dzięki za ten post, pomógł i to bardzo.

I jak mi wyszło ?
Luneth
1. Jeśli robisz settery to ustal tym atrybutom jaki ma być do nich dostęp smile.gif tutaj pasuje protected, bo private wtedy, kiedy klasa ma być rozszerzana i coś nie ma być dostępne klasie - dziecku.
2. Zakładając, że chcesz mieć różne modele i templatki do jednego widoku to ok, ale jak nie to niepotrzebne te settery (bo jak nie, to kontroler mógłby np widokowi przekazać zmienną z obiektem modelu jako parametr do konstruktora)
3. Trochę przekombinowane z tym zwracaniem widoku przez kontroler ale swoją drogą ciekawe biggrin.gif
Crozin
Cytat
To właśnie programowanie strukturalne jest takim mozolnym zaznaczaniem punktów i ich łączeniem a ten wzór taką przejrzystą zależnością pomiędzy składowymi (wzorce projektowe, obiektowe programowanie).
Nie... paradygmat programowania strukturalnego wcale nie jest gorszy od obiektowego - on jest inny.

Cytat
I jak mi wyszło ?
Trochę zrypane Copy&Paste tongue.gif View to raczej klasa abstrakcyjna, a Ty operujesz na jej potomkach, bo sama w sobie jest zbyt ogólna.
Cytat
(bo jak nie, to kontroler mógłby np widokowi przekazać zmienną z obiektem modelu jako parametr do konstruktora)
Raczej zły pomysł. Nagle w aplikacji pojawiło by się jedno API dla widoków, dla których można ustalić inny szablon i inne API dla takich ze stałym. Swoją drogą czegoś takiego jak stały szablon dla widoku być nie powinno - jak już to mógłby być jakiś domyślny.
Cytat
Trochę przekombinowane z tym zwracaniem widoku przez kontroler ale swoją drogą ciekawe
Dlaczego przekombinowane? Działanie aplikacji niekoniecznie musi kończyć się wraz z ostatnią linijką kontrolera.
Luneth
Crozin: oczywiście, że programowanie strukturalne jest inne, myślę że wszyscy już o tym tutaj wiedzą, ale ciekawe spostrzeżenie winksmiley.jpg miałem na myśli to, że w większości przypadków kończy się to tzw. 'kodem spaghetti'. Przekombinowane, bo dosyć wymyślne, oczywiście kolejna rzecz którą wszyscy wiemy - tak, masz rację, nie musi się to kończyć ostatnią linijką. Przekombinowane nie znaczy źle zrobione czy 'tak się nie robi' winksmiley.jpg Co do tego, że jego View nie jest abstraktem - dla tak prostego kodu który nam przedstawił wcale mnie nie dziwi, że nie zastosował dziedziczenia... na pewno przy rozwijaniu projektu sam zauważy, że mu to potrzebne winksmiley.jpg A na koniec powiem, że nie rozumiem tego:
Cytat
Raczej zły pomysł. Nagle w aplikacji pojawiło by się jedno API dla widoków, dla których można ustalić inny szablon i inne API dla takich ze stałym. Swoją drogą czegoś takiego jak stały szablon dla widoku być nie powinno - jak już to mógłby być jakiś domyślny.

Przecież powiedziałem, że jeśli przewiduje różne sposoby przedstawianie danych, to dobrze zrobił? A swoją drogą kompletnie nie rozumiem jak się doszukałeś jakichś problemów z różnymi API... smile.gif MVC chyba nie zakłada z góry, że mają/mogą być różne szablony do wszystkiego? Bo to już chyba własne założenia programisty są, jak on to widzi, ale może się mylę.
Crozin
Chyba oboje się nie zrozumieliśmy... winksmiley.jpg
Myślałem, że sugerujesz stworzenie dwóch wersji API dla różnego rodzaju widoków, co byłoby błędem.
Luneth
A to faktycznie kompletne nieporozumienie nam wyszło w tej kwestii biggrin.gif
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.