Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]OOP'owe początki
Fanatyko
post 14.08.2010, 18:00:40
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

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


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. ?>
Go to the top of the page
+Quote Post
Pawel_W
post 14.08.2010, 18:06:26
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


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

Go to the top of the page
+Quote Post
Fanatyko
post 14.08.2010, 18:12:31
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

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


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
Go to the top of the page
+Quote Post
Pawel_W
post 14.08.2010, 18:20:31
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


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
Go to the top of the page
+Quote Post
Fanatyko
post 14.08.2010, 18:26:12
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

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


OK, dziękuje. Potestuję sobie to co podrzuciłeś. Zapewne pytań ciąg dalszy niedługo smile.gif
Go to the top of the page
+Quote Post
Crozin
post 14.08.2010, 18:31:26
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
Pawel_W
post 14.08.2010, 18:40:27
Post #7





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


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
Go to the top of the page
+Quote Post
Crozin
post 14.08.2010, 19:04:03
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Model ma się zajmować swoim zadaniem: ma udostępniać dane, a nie nimi zarządzać.
Go to the top of the page
+Quote Post
Fanatyko
post 14.08.2010, 19:47:10
Post #9





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

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


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 ?



Go to the top of the page
+Quote Post
Crozin
post 14.08.2010, 22:21:25
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Widok nie tworzy sam sobie modelu - to kontroler inicjalizuje widok i przekazuje mu model(e).
Go to the top of the page
+Quote Post
Luneth
post 15.08.2010, 02:56:14
Post #11





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

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


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

Ten post edytował Luneth 15.08.2010, 03:01:27


--------------------
"It's always darkest before the dawn."
Go to the top of the page
+Quote Post
Fanatyko
post 16.08.2010, 20:22:03
Post #12





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

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


@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
Go to the top of the page
+Quote Post
Crozin
post 16.08.2010, 20:26:53
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


http://forum.php.pl/index.php?s=&showt...st&p=771967
Go to the top of the page
+Quote Post
Luneth
post 16.08.2010, 22:28:12
Post #14





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

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


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).

Ten post edytował Luneth 17.08.2010, 01:43:51


--------------------
"It's always darkest before the dawn."
Go to the top of the page
+Quote Post
Fanatyko
post 17.08.2010, 11:27:45
Post #15





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 14.08.2010

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


  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 ?
Go to the top of the page
+Quote Post
Luneth
post 17.08.2010, 12:03:19
Post #16





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

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


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

Ten post edytował Luneth 17.08.2010, 12:04:19


--------------------
"It's always darkest before the dawn."
Go to the top of the page
+Quote Post
Crozin
post 17.08.2010, 13:28:50
Post #17





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
Luneth
post 17.08.2010, 14:56:56
Post #18





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

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


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ę.

Ten post edytował Luneth 17.08.2010, 15:01:28


--------------------
"It's always darkest before the dawn."
Go to the top of the page
+Quote Post
Crozin
post 17.08.2010, 16:33:08
Post #19





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
Luneth
post 17.08.2010, 18:06:51
Post #20





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 16.07.2007
Skąd: Gorzów Wielkopolski

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


A to faktycznie kompletne nieporozumienie nam wyszło w tej kwestii biggrin.gif


--------------------
"It's always darkest before the dawn."
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: 13.07.2025 - 06:18