• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

MVC - różnice w opisie oraz MVP i MVVM

Object Storage Arubacloud
0 głosów
720 wizyt
pytanie zadane 27 czerwca 2022 w PHP przez everstudybee Użytkownik (610 p.)
otagowane ponownie 27 czerwca 2022 przez everstudybee

Hejka, mam pytanie odnośnie prawidłowego opisu graficznego modelu MVC. Patrząc na grafiki w necie widzę dużą rozbieżność w samej idei. Np. w niektórych przypadkach Widok jest połączony z model, w innych nie. Znalazłem też taką grafikę i po zastanowieniu wydaje mi się, że najtrafniej pokazuje schemat działania MVC, ale może się mylę?

I teraz nasuwa mi się pytanie, jak wyglądać powinny opisy graficzne modeli MVP i MVVM by naprawdę odpowiadały realnemu flow, który odbywa się podczas pracy aplikacji? Będę wdzięczny za linki, Oczywiście jest masa porównać w necie, ale cały czas nie może mi to do końca zaskoczyć surprise

3 odpowiedzi

+1 głos
odpowiedź 27 czerwca 2022 przez Comandeer Guru (601,550 p.)
Jakby być bardzo dokładnymi, to to bardziej pasuje do wzorca MVP, bo to właśnie tam Presenter jest odpowiedzialny za komunikację z modelem i odświeżanie widoku. W takim czystym MVC model wpływa bezpośrednio na widok. Wikipedia (angielska) ma w sumie całkiem spoko diagramy.

Chociaż IMO to nie jest szczególnie istotne, bo wzorce MV* są tak często mieszane, że właśnie często się mówi o MV* niż o jakimś konkretnym wzorcu.
komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)
edycja 27 czerwca 2022 przez everstudybee

To rozważania trochę akademickie, ale chcę dobrze zrozumieć ideę. Wtedy gdy będę analizował kod, to będzie mi łatwiej wychwycić co kto mieszał i z czym wink

W takim czystym MVC model wpływa bezpośrednio na widok.

No właśnie teraz robię projekt w PHP i Laravelu i korzystam z dokumentacji i właśnie to nie tak jest realizowane. To kontroler pobiera dane z modelu, wysyła dane do widoku i widok po przetworzeniu zwraca dane do kontrolera i ten je wysyła do przeglądarki. Jest to idealnie i precyzyjnie rozdzielone. Dlatego bardzo mnie dziwią te diagramy gdzie np. widok ma połączenie z modelem.

 

komentarz 27 czerwca 2022 przez Comandeer Guru (601,550 p.)

No właśnie teraz robię projekt w PHP i Laravelu i korzystam z dokumentacji i właśnie to nie tak jest realizowane.

A skąd założenie, że Laravel to MVC? 

Dla mnie to serio nie ma znaczenia, czy framework jest MVC, czy MVP – bez różnicy. Te wzorce praktycznie zatraciły swoje pierwotne znaczenie i często są tak mieszane, że nie sposób odróżnić jeden od drugiego. Tak naprawdę o wiele ważniejsze jest sensowne podzielenie aplikacji na poszczególne moduły ze względu na odpowiedzialności poszczególnych części kodu (SRP). Zaryzykowałbym wręcz stwierdzenie, że w typowym MVC ten podział jest mocno rozwodniony, bo tak naprawdę istnieją trzy warstwy. W obecnych frameworkach tych warstw jest zdecydowanie więcej i architektura idzie raczej w stronę cebuli.

komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)
Sam Laravel to faktycznie można użyć bez MVC, ale w dokumentacji jest też pokazane jak użyć go z tym wzorcem i odnoszę się tylko do tej części
komentarz 27 czerwca 2022 przez Comandeer Guru (601,550 p.)
Hm, prawdę mówiąc nie widzę takiej sekcji w dokumentacji. Mógłbyś podesłać linka?
komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)

W obecnych frameworkach tych warstw jest zdecydowanie więcej i architektura idzie raczej w stronę cebuli.

Masz rację, muszę wrócić do Uncle Bob yes

komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)

Hm, prawdę mówiąc nie widzę takiej sekcji w dokumentacji. Mógłbyś podesłać linka?

  1. Routing do kontrolera https://laravel.com/docs/9.x/routing#the-default-route-files
  2. Controller zwraca już przetworzony View https://laravel.com/docs/9.x/controllers#basic-controllers
  3. No i tu konfiguracja Model https://laravel.com/docs/9.x/eloquent#eloquent-model-conventions
komentarz 27 czerwca 2022 przez Comandeer Guru (601,550 p.)
Hm, tbh nie traktowałbym tego jako poradnik MVC. Kontroler w tym wydaniu to raczej po prostu określenie fragmentu kodu, który odpowiada na żądanie HTTP użytkownika (na co wskazuje zresztą sam namespace bazowej klasy kontrolera). No i to, że zwraca statyczny view, to też można argumentować, że to nie MVC, bo w MVC view nie jest statyczny i nie powinien być zwracany przez kontroler.

Eloquent też nie jest takim typowym modelem z MVC, bo on de facto jest warstwą abstrakcji na bazę danych. A model w MVC raczej powinien być poziom wyżej (ukrywać przed aplikacją, skąd pochodzą surowe dane).

To nie jest "czyste" MVC i zauważ też, że nigdzie w dokumentacji Laravela nie pada ten termin (ani nawet MV*).
komentarz 29 czerwca 2022 przez jankustosz1 Nałogowiec (35,880 p.)
Prawdą jest, że gdy widok jest konstruowany dynamicznie zazwyczaj przekazuje się mu odpowiednie modele na których podstawie ma wygenerować stronę. Nie muszą być to zawsze te same modele które są w bazie danych. Być może chcielibyśmy w kontrolerze wstępnie dane przetworzyć i podać widokowi od razu spreparowane pod niego obiekty.
komentarz 29 czerwca 2022 przez Comandeer Guru (601,550 p.)
Nie powiedziałbym, że w bazie danych wgl są jakieś modele. W bazie danych są po prostu dane. Model z kolei jest po stronie kodu i w jakiś sposób reprezentuje te dane. W MV* jest też często tym miejscem, w którym znajduje się jakaś walidacja itd. (bo to w sumie jedyna z trzech warstw, gdzie ta walidacja pasuje).
0 głosów
odpowiedź 27 czerwca 2022 przez jankustosz1 Nałogowiec (35,880 p.)
edycja 27 czerwca 2022 przez jankustosz1

MVC - Controller jest naszym głównym elementem, trzyma w sobie/tworzy modele oraz widoki i je kontroluje 

MVP - Wzorzec często wykorzystywany w Windows Forms. Tutaj widok jest naszym rootem i to on trzyma w sobie Presentera i wywołuje z niego odpowiednie metody w odpowiednich eventach. Prezenter natomiast ma w sobie modele.

MVVM - Wzorzec wykorzystywany w WPF. Tutaj wykorzystuje się tzw. binding. WIdok na bieżąco aktualizuje swój stan do View Modelu. View Model trzyma reprezentację widoku, zmiana jakiejś wartości w nim skutkuje zmianą widoku. VM trzyma w sobie także Model i wszystko kontroluje.

Ogólnie celem tych wszystkich rozwiązań jest większa modułowość. Odseparowanie od siebie modeli, widoków i kontrolerów. Np. można mieć ten sam ViewModel dla kilku różnych widoków. 

komentarz 27 czerwca 2022 przez jankustosz1 Nałogowiec (35,880 p.)
Co do schematu to DB raczej powinno mieć strzałki z Controllerem, choć z Modelem też jakiś sens ma. Btw. czy DB i Model na schemacie to nie to samo?

No i dlaczego są strzałki w obie strony między Controllerem a Widokiem? Wydaje mi się, że albo Jest strzałka z kontrolera do widoku i z widoku do przeglądarki, albo z widoku do kontrolera i z kontrolera do przeglądarki.
2
komentarz 27 czerwca 2022 przez Comandeer Guru (601,550 p.)

Co do schematu to DB raczej powinno mieć strzałki z Controllerem, choć z Modelem też jakiś sens ma. Btw. czy DB i Model na schemacie to nie to samo?

IMO jest ok. Kontroler nie powinien wiedzieć nic o bazie danych, bo ta jest szczegółem implementacyjnym, która jest przykrywa przez model.

komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)
Też tak mi się wydaje, że model jest pośrednikiem pomiędzy kontrolerem i bazą danych. W Laravelu w kontrolerze buduję za pomocą Eloquent odpowiedni obiekty, który wysyłam do modelu, a ten tłumaczy go na SQL wysyła do bazy, potem otrzymuje odpowiedź, zamienia ją na obiekt i zwraca do kontrolera, gdzie ten obiekty przekazuję do widoku, widok generuje stronę i kontroler wysyła ją do przeglądarki.
komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)

Tak, ta ogólna idea jak rozróżnić poszczególne model jest mi znana, ale jak zwykle diabeł tkwi w szczegółach i o te szczegóły biega laugh No co ja poradzę, że lubię takie rzeczy mieć rozkminione i zrozumiane, dlatego dziurę wiercę dalej wink Czy znasz jakieś artykuły, które trochę głębiej poruszają ten temat? Wikipedia oczywiście przeczytana i różne artykuły też, ale to ciut jeszcze ogólnikowo, jakiś przykładów mi trzeba najlepiej w wersji graficznej cheeky

komentarz 27 czerwca 2022 przez Wiciorny Ekspert (270,190 p.)

Grafika nie jest sama w sobie poprawna niestety, tutaj strzałki nie są - strzałkami typowo wskazującymi na zależność czy relacje, wiem to z autopsji gdyż pamiętam komentarze i dyskusje na linked-in a sam autor, potwierdził, że jest to tylko schemat pokazujący "jakąś relacje", nie konkretną.
Dużo lepiej skorzystać z 
image

komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)

No właśnie tu mam zgrzyt, bo to co user wybierze najpierw jest interpretowane przez router i dopiero na tej podstawie odpalany jest odpowiedni kontroler i funkcja.... a biorąc pod uwagę taki kod kontrolera...

<?php

    namespace App\Http\Controllers;

    use App\Models\Doctor;
    use Illuminate\Http\Request;
    use Illuminate\View\View;

    class DoctorsController extends Controller
    {
        public function index(): View
        {
            $doctors = (new Doctor)->where('is_active', '=', true)->get();

            return view("doctors.index", ['doctors' => $doctors]);
        }

        public function search(Request $request): View
        {
            // Get the search value from the request
            $search = $request->input('search');

            // Search in the title and body columns from the posts table
            $doctors = Doctor::query()
                ->where('name', 'LIKE', "%{$search}%")
                ->orWhere('surname', 'LIKE', "%{$search}%")
                ->orWhere('specialization', 'LIKE', "%{$search}%")
                ->get();

            // Return the search view with the results compacted
            return view('doctors.search', compact('doctors'));
        }
    }

I taki view

@extends('main')

@section('menu')
    @include('doctors.menu')
@endsection

@section('style')
    <link type="text/css" rel="stylesheet" href="/css/materialize.css" media="screen,projection"/>
@endsection

@section('content')
    <div class="container">
        <div class="row">
            <div class="col s12 m6 l6">
                <a href="/doctors/">
                    <div class="card-panel hoverable center">
                        <h5>All doctors</h5>
                    </div>
                </a>
            </div>
            <div class="col s12 m6 l6">
                <a href="/doctors/search/">
                    <div class="card-panel hoverable center">
                        <h5>Search doctor</h5>
                    </div>
                </a>
            </div>
        </div>
    </div>
@endsection

(nie wrzucałem już szablonu main.blade.php, bo to w sumie nie jest tu istotne)
To właśnie nie pasuje mi ta relacja od View do User. Bo tak naprawdę Kontroler zwraca do usera to co otrzyma z Widoku, Widok sam do Usera nic nie wysyła. I ten kod nie jest moim wymysłem, tylko jest stworzony na podstawie dokumentacji Laravel.

komentarz 27 czerwca 2022 przez Comandeer Guru (601,550 p.)
To, co opisujesz (kontroler decyduje o wszystkim), bardziej pasuje do wzorca MVP. I to jest dokładnie to, o czym mówię: te wzorce są tak wymieszane, że rozróżnianie ich IMO jest bezcelowe. Na froncie od dawna funkcjonuje zbiorcze określenie MV*.
komentarz 27 czerwca 2022 przez everstudybee Użytkownik (610 p.)

Czyli co kucharz to inaczej doprawia tę samą pomidorówkę laugh

0 głosów
odpowiedź 29 czerwca 2022 przez everstudybee Użytkownik (610 p.)
Dzięki @Comandeer, @jankustosz1 i @Wiciorny sporo mi się wyjaśniło, widzę że sporo jeszcze nauki i kodowania przede mną. Zatem gdyby szukać nowoczesnych wzorców to rozumiem, że od DDD warto poczytać, czy coś jeszcze?

Podobne pytania

0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 16 grudnia 2018 w Inne języki przez velaro Użytkownik (950 p.)
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 12 grudnia 2023 w C# przez MisticVoid Początkujący (490 p.)
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 24 marca 2021 w JavaScript przez CSSoup Mądrala (6,460 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...