![]() |
![]() ![]() |
![]() |
![]()
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
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 675 Pomógł: 286 Dołączył: 15.06.2009 Skąd: Wieliczka Ostrzeżenie: (0%) ![]() ![]() |
po 1:
żadne takie ify z $_GET, to powinno być przekazane w konstruktorzem czyli np.
(IMG:style_emoticons/default/smile.gif) 2.
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) |
|
|
![]()
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) |
|
|
![]()
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) |
|
|
![]()
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)
|
|
|
![]()
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. |
|
|
![]()
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)
|
|
|
![]()
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ć.
|
|
|
![]()
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 ? |
|
|
![]()
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).
|
|
|
![]()
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 |
|
|
![]()
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) |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 14.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 ? |
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.09.2025 - 10:56 |