Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]OOP'owe początki
Fanatyko
post
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 (IMG:style_emoticons/default/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
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']);;

(IMG:style_emoticons/default/smile.gif)

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

to się aż prosi o zastosowanie wzorca projektowego "factory" (IMG:style_emoticons/default/smile.gif)

po 3: DZIEDZICZENIE! - naprawdę warto byłoby z niego tu skorzystać (IMG:style_emoticons/default/winksmiley.jpg)

Go to the top of the page
+Quote Post
Fanatyko
post
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ł (IMG:style_emoticons/default/smile.gif) (średni ogarnięty z dziedziczeniem jestem ;p)

Dzięki za opowiedzi (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Pawel_W
post
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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Fanatyko
post
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Crozin
post
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
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ć (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Crozin
post
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
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
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
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
Go to the top of the page
+Quote Post
Fanatyko
post
Post #12





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

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


@Crozin ok, chyba załapałem (IMG:style_emoticons/default/winksmiley.jpg)
@Luneth dzięki, przydatny link.

Popracuję na kodem i zobaczę co mi wyjdzie. (IMG:style_emoticons/default/smile.gif)

Wiecie co ? Jednak nie czaje absolutnie MVC (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Crozin
post
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
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 (IMG:style_emoticons/default/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? (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Fanatyko
post
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
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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował Luneth 17.08.2010, 12:04:19
Go to the top of the page
+Quote Post
Crozin
post
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 (IMG:style_emoticons/default/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
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 (IMG:style_emoticons/default/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' (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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... (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
Crozin
post
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... (IMG:style_emoticons/default/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
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 (IMG:style_emoticons/default/biggrin.gif)
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.09.2025 - 10:56