Szablony i wzorzec MVC

Posted by Jarosław Zabiełło Wed, 03 Jan 2007 19:30:00 GMT

Wzorzec MVC

MVC to skrót od ang. Model – View – Controller (czyli Model – Widok – Kontroler). Jest to jeden z popularniejszych wzorców projektowych (czy “wzorców architektonicznych w oprogramowanu” 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.

Tags , , ,  | 8 comments

Comments

  1. Avatar Seban said 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ł said 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 said 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 said 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 said 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 said 3 days later:

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

  7. Avatar CzyNapewno said 10 months later:

    Logika aplikacji w kontrolerze?

  8. Avatar Jacek said about 1 year later:

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

(leave url/email »)

   Comment Markup Help Preview comment