Zkusím poslat svůj názor na pojem Controler a jak si ho vykládám a používám já, bez ohledu na podporu v různých frameworcích. Zároveň nechci tvrdit, že ten můj pohled je správný, prostě s ním jen takto žiju a zdá se mi to zatím docela funkční :).

Můj pohled na aplikaci vychází z pojmu Use Case (UC) - jeden nějaký případ užití aplikace - založení objednávky, vyskladnění zboží, apod. Tento UC má typicky nějaký začátek a řadu alternativních toků, které mohou znamenat i výce způsobů jak ukončit jeho běh (dokončím vše, opustím to přes cancel, opustím ho přes menu, apod.) . Mezi UC se dá provádět navigace, přesně vím, kdy který začíná a kdy končí. Mohu ho autorizovat, apod. (Myslím, že ve springu by se tomuto mohlo říkat Web Flow)

No a když to implementuji, tak k jednomu UC dělám typicky jeden Controler, který ho obsluhuje. UC se může skládat z více stránek (View) - třeba wizardy, apod. Úkolem Controleru je obsloužit veškeré vstupní požadavky z view - validovat vstupy, konvertovat vstupy, na základě vstupů volat příslušnou business logiku (Model). Následně buď volí View, kterým daná data vyrenderuje,nebo získá další (wizzard) a nebo se na základě vrácených dat z business logiky rozhoduje o přechodu na jiný UC (tedy i jiný controler) - tomu říkám Aplikační flow. A to řeším tak, že ten Controler v případě přechodu na jiný UC prostě jen vyšle kód toho nového UC a nějaký centrální handler provede ten přechod. - Tomu se může říkat třeba FrontController. Takže já rozlišuji Application Controller a FrontController - viz patterny. http://www.corej2eepatterns.com/Patterns2ndEd/ApplicationController.htm, http://www.corej2eepatterns.com/Patterns2ndEd/FrontController.htm

No a co se týče toho View - U mě View nesmí nikdy obsahovat logiku, jen renderovat, proto taky nemám rád JSP, PHP a jiné podobné technologie, ale člověk se musí uhlídat. Z pohledu funkčnosti se mi více líbí technologie jako Freemarker, které nic jiného, než vypsání a formátování dat na výstup neumožňují. A k tomu renderingu jak píšete - tak buď bych to řešil tak, že controler volí jen logické označení view, které se má použít - tedy řeknu - ShowFormXYZ a pak nějaký FrontControler, ViewHandler, Filter, nebo jak chcete, na centralizované úrovni vybere podle technologie klienta konkrétní realizaci view, třeba tak, že k ShowFormXYZ přidá technologii: ShowFormXYZ_800x600.jsp to pouze v případě, že opravdu logika je stejná pro všechny variace toho view. V případě, kdy logika je jiná - například pro malé rozlišení by se šlo na wizzard, kdežto pro velké rozlišení je vše v rámci jednoho formu - bych asi už na frontControlleru rozstřelil podle klienta na různé implementace obslužných AplikačníchControllerů.

A pak je tu ještě jedna možnost, použít tzv TwoStep view: http://martinfowler.com/eaaCatalog/twoStepView.html

Controler vybere View, to view ale nerenderuje pro konkrétní technologii, ale sestaví jakýsi metamodel-view - třeba popíše výslednou obrazovku pomocí XML (XUL, XAML, XML-FO, jiné) a toto se pak teprve transformuje podle technologie klienta do výstupu, takže třeba budete mít různé transformace podle rozlišení obrazovky, apod. Takže pak to neřeší controler, ale jakýsi renderovací procesor toho view.

Podle mě je vždycky MVC také otázka granularity pohledu, můžeme se koukat na MVC s pohledu AJAXu, z pohledu serveru, z pohledu konkrétní visuální komponenty. Možností je spousta, takže se těžko odpovídá na podobné obecné dotazy. Jako zajímavé mi připadne řešení MVVM http://en.wikipedia.org/wiki/Model_View_ViewModel.

S pozdravem

Petr


Dne 27.7.2011 14:33, Zdenko Vrabel napsal(a):
Mne neslo uplne o typovo rozne view-s. Toto uz myslim presahuje MVC. Pri niecom takom, kedy uz clovek uvazuje o napriklad tej konzolovke a tak sa uz budeme bavit v rovine backend | frontend (alebo to SEO). Mozno som uviedol blby priklad ale zoberme si MVC v iOS (no flame). Svojho casu to bolo jasne ako facka. Tie devices mali rovnake rozlisenie obrazovky. Zrazu prisli tablety, obrazovka sa zmenila a designeri mali silne nutkanie tuto plochu vyuzit. Funkcionalita sa nemeni, len sa meni rozlozenie ovladacich prvkov. A teraz ci je dobre mat nejaky obecny system na to alebo to s kludom moze riesit controller a netreba tam pridavat dalsiu zlozitost. Podla mojho nazoru sa MVC situuje vo frontende kde by controller mal riesit 'kliklo sa na nejaky button' . View by to fakt mal len a len zobrazovat. Ja osobne uz JSP povazujem za nie idealne, lebo clovek tam moze dat nieco co tam nepatri (a castokrat tam aj da).

Mozete mi pls poslat link na vas clanok ohladom toho SOA?

Och asi strasne spekulujem ale kazdopadne dakujem za kazdy postreh.

Dakujem,
Zdenko

2011/7/27 Oto Buchta <[email protected] <mailto:[email protected]>>

    Ono je to hodně složité. Při různých View (a myslím tím typově
    jiných) je podle mého klasický model MVC trošku zavádějící.
    To, co v takovém případě chceme, je mít obecný model, nad kterým
    postavíme obecnou business logiku. Potom máme nějaké View, tedy
    něco, pod čím rozumíme vlastní renderování. Business logika je pak
    bude ovládána NĚČÍM, co se podle mne dá nazvat Controller
    (minimálně ve Strutsech se tak opravdu jmenuje) přes obecné API,
    ale co už renderování není. Něco, co rozhoduje, co se má zobrazit
    příště. O tom, že je naprosto jiné ovládání aplikace pro Androida,
    Web či z tlustého klienta je více méně jasné, ale přestoi bychom
    spekulovat, že ono rozhodování, co bude dál, ale může být typicky
    stejné pro celou aplikaci a že controller je tedy obecný a stejný
    a že controllerem je ono generické API. Zásadní rozdíl ale nastává
    ve chvíli, kdy si řekneme, že jedním z View bude také příkazový
    řádek, že chceme aplikaci ovládat ze skriptu. Tím se z toho
    skriptu stává do jisté míry controller. A nemyslím, že bychom
    mohli tvrdit, že příkazový řádek pak má možnost pouze komunikovat
    s modelem, tedy že máme zcela nový controller se stejným modelem.
    Nikoli. Chceme komunikovat s onou Business logikou, volat její
    SLUŽBY. Taktéž si nemyslím, že je skript ve stejné situaci
    ovladače jako člověk, tedy že před ním stojí nějaké View, za ním
    je controller a pak model.

    Tím se dostáváme k dalšímu problému, tedy kde je MVC v SOA. Pak by
    každá služba byla MVC sama o sobě. Ale o tom jsem už kdysi psal na
    blogu.


    2011/7/27 Zdenko Vrabel <[email protected]
    <mailto:[email protected]>>

        Dakujem za odpovede. Presne nieco taketo som potreboval
        zistit. Mna zaujimal nazor viacero ludi ako to vidia. Ja
        osobne nejdem sutazit :)

        Zdenko

        Dňa 27. júla 2011 10:25, Dusan Msk <[email protected]
        <mailto:[email protected]>> napísal(-a):

            Tiez nadobudam ten pocit. Nevidim dovod, preco by view
            nemohol vybrat
            controller. Je to na jednom mieste, nemusi sa to patlat
            tonou xml
            konfigurakov filtrujucich cosi kdesi z kadesi. Je mozne,
            ze v urcitych
            pripadoch to tak moze byt vyhodne, ja osobne som si ale zatial
            vystacil v kode v ramci controlleru.


            --
            Dusan

            2011/7/27 <[email protected]
            <mailto:[email protected]>>:
            > Obcas mi  pripada, ze to je soutez "Jak co nejvice vyber
            konkretniho view
            > zasmodrchat"
            >
            > NkD
            >
            >> Od: Petr Prikryl <[email protected]
            <mailto:[email protected]>>
            >> Komu: [email protected] <mailto:[email protected]>
            >> Datum: 27.07.2011 09:48
            >> Předmět: Re: Otazka ohladom MVC
            >> Odeslal: [email protected]
            <mailto:[email protected]>
            >>
            >> Dobry den,
            >> myslim si ze view by nemel vybirat controller, ale
            nejaky filtr na
            >> requestu a mam takovy pocit ze to v spring MVC dokonce
            takto je, ze jde
            >> podle urcitych pravidel urcit jaky filtr se aplikuje.
            >> Dale me v tom navadi to, ze se kontroluje
            accepted-content-type takze
            >> snad se i takovy princip castecne pouziva (ikdyz toto
            je jakoby na
            >> jinou vrstvu).
            >>
            >> PP
            >>
            >> On Wed 27 Jul 2011 09:40:30 AM CEST, Zdenko Vrabel wrote:
            >> > Dobry den,
            >> >
            >> > Moju otazku by som chcel smerovat skor k MVC patternu
            ako ku Jave
            >> > samotnej tak snad to nebude vadit. Ak sa nahodou tiez
            budem pytat
            >> > somarinu, tak ma ospravedlnte ale potreboval by som
            sa len proste v
            >> > niecom uistit alebo naopak aby mi niekto povedal ze
            je to somarina.
            >> > Totizto nedavno som premyslal nad MVC patternom (pre
            web). Totizto
            >> > zaujimalo by ma, ci je spravne/nespravne ak v
            kompetencii controllera
            > je
            >> > rozhodovat o tom aky view sa pouzije alebo naopak.
            Mal by controller
            >> > vobec nieco vediet o viewoch? Vysvetlim na priklade.
            V dnesnej dobe sa
            >
            >> > dostavaju do popredia rozne iPhony, Androidy, iPady a
            neviem co. K
            > tomu
            >> > sa zacina aj prisposobovat design niektorych webov.
            Ide o to, ze dajme
            >
            >> > tomu design pre iPad je nieco uplne ine ako design
            pre klasicky
            > browser
            >> > (z pohladu web designera). To ma privadza k tomu, ze
            je potrebne
            > riesit
            >> > aky view sa na zaklade User Agenta pouzije. Moja
            otazka je vlastne o
            >> > tom, ci je spravne mat v ramci MVC nejaky mechanizmus
            routingu a
            >> > Controller by do toho nemal zasahovat (v podstate len
            produkuje model)
            >
            >> > alebo naopak. Takyto mechanizmus znecistuje MVC/
            zvysuje jeho
            > zlozitost
            >> > a toto by mal riesit prave controller. Alebo je to
            uplne jedno? Este
            >> > doplnim ze hovorim o MVC vseobecne nie o nejakom
            konkretnom ako Spring
            > MVC.
            >> >
            >> > Za odpovede vopred dakujem,
            >> > Zdenko Vrabel
            >>
            >>
            >
            >





-- Oto 'tapik' Buchta, [email protected] <mailto:[email protected]>,
    http://tapikuv.blogspot.com




--
Petr

Odpovedet emailem