Szablony i wzorzec MVC

Opublikowane przez Jarosław Zabiełło Wed, 03 Jan 2007 19:30:00 GMT

Wzorzec MVC

MVC to skrót od ang. Model – View – Controler (czyli Model – Widok – Kontroler). Jest to jeden z popularniejszych wzorców projektowych (czy “wzorców architektonicznych w oprogramowaniu” jak się mogą czepiać niektórzy puryści) W uproszczeniu, wzorce projektowe to standardowe, sprawdzone rozwiązania dla typowych problemów programistycznych (głównie dotyczą programowania obiektowego). Ich przeciwieństwem są anty-wzorce, czyli to, jak nie należy programować. Typowym antywzorcem jest spaghetti-code, wymieszanie logiki biznesowej z warstwą prezentacji, wszystkiego razem w jednym śmietniku. To typowy styl programowania większości niedoświadczonych programistów PHP.

W skrócie, wzorzec MVC polega na takim podziale kodu, aby składał się z trzech, funkcjonalnie oddzielnych części.

Model

Modelem nazywamy tą część kodu aplikacji, która jest odpowiedzialna za kontakt z danymi biznesowymi, gdziekolwiek są składowane (zwykle w relacyjnej bazie danych). Model nie tylko służy do pobierania i modyfikacji danych biznesowych, ale także zajmuje się ich spójnością i integralnością poprzez odpowiednie mechanizmy walidacji danych. Model służy więc za zarówno strażnika jak i dysponenta danych biznesowych. Bardzo elegancko widać to w Ruby on Rails gdzie przykładowy kod pełniący rolę modelu wyglądać może tak:

class Project < ActiveRecord::Base
  belongs_to :portfolio
  has_one :project_manager
  has_many :milestones
  has_many :deliverables, :through => :milestones

  validates_presence_of :name, :description
  validates_acceptance_of :non_disclosure_agreement
  validates_uniqueness_of :short_name
end

Widok

Widok służy do generowania tego, co moglibyśmy określić jako prezentację naszej aplikacji. Przy czym nie jest określone jak ta prezentacja ma wyglądać. Ogólnie prezentacją jest to wszystko, co aplikacja “wypluwa” na zewnątrz. Nie musi to być żaden “interfejs użytkownika” jak wypisują bzdury co niektórzy. Model MVC nie zakłada przecież tego, kto ma być odbiornikiem wysyłanego strumiena danych. Może to być zarówno pani Genowefa miotająca się po internecie za pomocą Internet Explodera jak i rozbudowany czytnik kanałów RSS, albo jakieś dowolne urządzenie odbierające generowany strumień danych (w tym ostatnim wypadku nie musi to być w ogóle aplikacja webowa) Generowany strumień danych nie musi być w ogóle żadnym tekstem. Mogą to być bowiem równie dobrze strumień danych binarnych.

Zresztą tak właśnie działają aplikacje webowe, które działają wg zasady client-server. Tzn. klient wysyła żądanie, a serwer odpowiada. Przeglądarka Iinternetowa wysyła żądanie do serwera WWW, a on odpowiada jej strumieniem danych. (w wypadku aplikacji webowych serwer wysyła wpierw tekst z nagłówkiem informującym co będzie wysyłane, bo to wynika z zasad protokołu HTTP).

BTW, z tego wynika ważna lekcja odnośnie adresów URL. To co wklepujemy w przeglądarce nie musi mieć żadnego związku z jakimikolwiek ścieżkami na serwerze. Wszystkie technologie, używające jawnych rozszerzeń plików (.asp, .php, .jsp, .aspx itp) są głupie, bo po pierwsze, sugerują że to coś w adresie z końcówką .php to zawsze jest konkretny plik po konkretnym katalogu. Po drugie, bez sensu eksponują użytą technologię, co wiąże trochę ręce tym, którzy by chcieli zmienić wewnetrzny system generujący strony WWW ale bez ruszania starych adresów URL. Po trzecie, spidery takie jak Google nie lubią indeksować stron generowanych dynamiczne. Jeśli zobaczą w adresie znak zapytania to najczęściej to, co za nim stoi jest ignorowane. Odbija sie to na “pozycjonowaniu” tak napisanej aplikacji. I po czwarte takie adresy (z rozszerzeniami i parametrami po znaku zapytania) są najzwyczajniej brzydkie i trudne do zapamiętania. Nie znaczy to, że tak (/?x=1&y=2&z=4)w ogóle nie przekazywać parametrów. Chodzi tylko o to, aby to robić to oszczędnie i tylko wtedy, kiedy jest to naprawdę koniecznie.

Kontroler

Kod, który spina wszystko razem i stanowi serce aplikacji to kontroler. To on pobiera dane z bazy za pomocą modelu i to on wybrane dane wysyła do widoku aby je jakoś zaprezentował dla odbiorcy. Kontroler także dba o takie kwestie jak autoryzacja i autentykacja użytkowników (określa kto może mieć dostęp do poszczególnych części aplikacji). Kontroler zajmuje się też sposobem przepływu danych zgodnie z potrzebami logiki biznesowej.

Szablony i Helpery

Czym są szablony? Szablony przynależą do warstwy Widoku wzorca MVC. Otrzymują dane z kontrolera i na tej podstawie generują kod HTML jaki jest wysyłany do przeglądarki. Szablony powinny być raczej proste tak, aby można było łatwo modyfikować sposób prezentacji bez godzin ślęczenia nad kodem. Najczęściej kwestią prezentacji zajmują się różnej maści webmasterzy i designerzy, czyli ogólniej osoby, które niekoniecznie są zaawansowanymi programistami.

W wypadku kiedy sposób prezentacji jest złożony, aby nie komplikować szablonu stosuje się do pomocy… pomocnika ;) Głównym zadaniem helpera jest takie wstepne przetworzenie danych (jakie kontroler wrzucił do szablonu) aby szablon mogący je wyświetlić był jak najprostszy i jak najbardziej czytelny. Helper dane pobiera od szablonu, modyfikuje je i odsyła je z powrotem. Dzięki temu logika niezbędna do wygenerowania prezentacji jest w szablonie znacznie uproszczona.

Szablony można podzielić na kilka rodzajów, stosownie do oczekiwanych od nich funkcji. Ale o tym (i o strategii wyboru właściwych szablonów) już w drugiej części.

Tagi , , ,  | 18 comments

Comments

  1. Avatar Seban powiedział 15 minutes later:

    Dobre, myślę, że sporo wyjaśni ten tekst osobom, które nie wiedzą co to MVC, logika biznesowa itp.

  2. Avatar Michał powiedział about 14 hours later:

    Niestety kolejny ogólnikowy opis aczkolwiek napisany składnie i jasno, według mnie tłumaczenie czym jest mvc bez podania jakichkolwiek przykładów (czy to kod czy jakiś a’la życiowy przykład) jest trochę bez sensu. Czy osoba która do tej pory miała wszystko w jednym worku będzie w stanie logicznie przenieść/poukładać poszczególne funkcjonalności? PS Świetny blog, Pozdrawiam Autora

  3. Avatar Jarosław Zabiełło powiedział about 14 hours later:

    Przykładów jest od cholery w sieci. Ostatnie dwa lata to okres ogromnej popularności i wysyp różnej maści frameworków MVC. Moim celem było dać przejrzysty opis samego MVC. (Właściwie to chodziło mi o praktyczne porównanie szablonów, a ten tekst powstał przy okazji. W drugiej części będzie o szablonach – głównie dla Pythona – bo jest w czym wybierać)

  4. Avatar Drogomir powiedział 1 day later:

    Mam nadzieję, że będzie choć trochę o szablonach w Rubim – aktualnie szukam czegoś co byłoby dobrym zamiennikiem dla erb.

  5. Avatar mehoweck powiedział 2 days later:

    przykładów na MVC jest więcej niż składnych opisów czym MVC jest w istocie i co w jakiej części powinno się znaleźć. Po za tym jeden suchy przykład i tak nie ma sensu. Sens ma dopiero przejście przez jakiś większy tutorial – np. przez pierwsze rozdziały z książki “Agile Web Development with Rails”. Moim zdaniem praca u podstaw, zrozumienie założeń i generalnych idei jest często ważniejsze niż zaznajomienie się z implementacją konkretnego przykładu. W każdym razie czekam na kolejne części cyklu :)

  6. Avatar karibe powiedział 3 days later:

    Nie chce aby autor popadl w samouwielbienie, ale po raz kolejny świetna robota!!! Oby wystarczylo checi na przyszlość:)

  7. Avatar CzyNapewno powiedział 10 months later:

    Logika aplikacji w kontrolerze?

  8. Avatar Jacek powiedział about 1 year later:

    a możecie podać jakiś link do dobrych przykładów MVC ?

  9. Avatar Luke powiedział about 1 year later:

    “a możecie podać jakiś link do dobrych przykładów MVC ?” chyba nie tak wiele ich jest skoro nikt nie pokwapił się odpowiedzieć, a szkoda bo właśnie sam takowych szukam.

  10. Avatar Jarosław Zabiełło powiedział about 1 year later:

    Przykładów MVC, znaczy się czego? Jakichś aplikacji, frameworków? Od cholery tego jest. Np. Ruby on Rails, Django, Pylons, CakePHP, Symfony, itp. itd.

  11. Avatar Wojtek powiedział over 2 years later:

    Przydał by się przykład lub link do prostej aplikacji, nie frameworków, tylko konkretnej implementacji (prostej) aplikacji bez zbędnych bajerów i ozdobników.

  12. Avatar Jarosław Zabiełło powiedział over 2 years later:

    Wojtek: nie rozumiesz koncepcji czy co?Frameworki używa się po to aby łatwiej stworzyć i potem rozwijać jakieś nietrywialne aplikacje. Jeśli jednak potrzebujesz tylko stworzyć jakąś banalną, jedną stronkę z wizytówką, to nie potrzebujesz do tego MVC. Poza tym frameworki potrafią być bardzo proste. Merb z opcją very_flat redukuje się do jednego pliku. Są też całe mikroframeworki z definicji operujące na takim poziomie jak Sinatra, Camping, Wave itp.

  13. Avatar mosh powiedział over 2 years later:

    Ciekawy artykuł, właśnie jestem w trakcie tworzenia własnego FW…

    trochę ciężko pojąć od razu logikę MVC.. ale dzięki takim artykułom powoli się to staje realne :)

  14. Avatar MrBogus powiedział over 2 years later:

    Wygląda jak wpis robiony metodą kopiego-pejsta: http://www.mephir.net.pl/model-mvc

  15. Avatar Jarosław Zabiełło powiedział over 2 years later:

    MrBogus: faktycznie koleś bezczelnie splagiatował tekst. Nawet nie ma jak umieścić mu tam komentarza bo ta jego strona wywala się z uroczym pehapowym błędem “Fatal error: Call to undefined function drupal_submit_form() in /var/www_prod/mephir.net.pl/sites/all/modules/akismet/akismet.module on line 707 Call Stack”

  16. Avatar wino102 powiedział over 2 years later:

    MVC zaliczają do kategorii wzorców złożonych, a czy ktoś obeznany by mógł wymięć jeszcze jakieś inne wzorce z tej grupy??(wystarczy same nazwy)

  17. Avatar Piotr powiedział over 4 years later:

    Minęły już ponad 4 lata od opublikowania artykułu, a mimo to informacje w nim zawarte w pomogły mi lepiej zrozumieć temat :) Pozdrawiam serdecznie, Piotr Zabrocki

  18. Avatar Jarosław Zabiełło powiedział over 4 years later:

    Dyskusja na temat tego czym jest MVC nadal trwa http://webhosting.pl/Ruby.on.Rails.wcale.nie.jest.frameworkiem.MVC#comment_52683

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz