Názory k článku
Nette Framework: MVC & MVP
more
celé vláknoProblem MVC
celé vláknoNebo proste jenom nevim jak na to?
Re: Problem MVC
celé vláknoRe: Problem MVC
celé vláknoRe: Problem MVC
celé vláknoOsobně si myslím, že v uvedeném příkladu by bylo možné Model a Presenter sloučit. Podle mého chápání MVC oba představují model. Bohužel ale postrádám právě pattern observer, který by zde měl sloužit k notifikacím View, když se změní proměnná $money. Právě proto je potřeba ručně v kodu sáhnout do template a změnit hodnotu (metoda insert).
Re: Problem MVC
celé vláknoRe: Problem MVC
celé vláknoAno, rozumím, že logika fungování automatu může být složitější a bude se muset skládat z vlastních tříd a datových objektů, které mezi sebou budou komunikovat. Tyto objekty pak budou tvořit datový model, což je ale jiný pojem než Model v návrhu MVC.
Re: Problem MVC
celé vláknoRe: Problem MVC
celé vláknoProblém, který pak v příkladu vidím, je těsná vazba modelu na view (metoda insert), což je přesně to, čemu se MVC model snaží vyhnout.
Re: Problem MVC
celé vláknoRe: Problem MVC
celé vláknoVe vseobecne rovine muze jit o problem implementace MVC, ktera, jak David naznacil, stale neni idealni. Kazdemu vyhovuje jiny styl a take proto vznika spousta MVC frameworku. Ustalena pravidla v ramci architektury mohou byt pro vyvoj aplikace omezujici a tak se casto hledaji klicky a vyjimky pro implementaci specifickych funkci. Robustni MVC systemy se sirokou skalou funkci mohou byt slozite na nauceni, jednoduche MVC systemy zase predpokladaji vetsi zasahy do kodu aplikace ze strany programatora, a tim padem i hlubsi pochopeni kodu a logiky MVC.
Re: Problem MVC
celé vláknoTakze modelu predate nova data a pak zavolate fireNeco podle toho, jaky rozsah chcete obcerstvit (pokud neresite vykon, tak vzdycky vsechno :-) ) a o vic se nemusite starat. V idealnim pripade si aplikace vubec nemusi drzet odkaz na zobrazovaci tridu pote, co ji preda model, vsechno se to obstara vnitrne ve swingu.
Rozdeleni modelu a prezenteru
celé vláknoPrvni vyplyva z me neznalosti NETTE frameworku. Jak je uchovavana hodnota instancni promenne $money mezi jednotlivymi kliky? Je zakodovana do URL? Jakym zpusobem je mozne ovlivnit, ktere promenne se maji uchovat a ktere ne? Jak je to s uchovavanim slozitejsich datovych struktur? (pole, slovniky, jine objekty)?
Druha otazka se tyka volby rozdeleni zodpovednosti automatu na kavu mezi model a presenter. Ocekaval bych, ze presenter ma na starosti pouze interakci mezi modelem (tj. fyzickym strojem na kafe) a uzivatelem, tj. v pripade analogie s fyzickym automatem ma prezenter roli predniho panelu s navodem k pouziti, tlacitky, mincovnikem a vydejovym okenkem, ale _nemel_ by jiz resit vnitrnosti stroje, tj. rozhodovaci logiku zda uzivateli vydat ci nevydat kafe podle toho kolik do nej bylo nahazeno penez atd, vareni kafe, uchovavani informaci o tom kolik penez je v mincovniku atd.. V objektovem modelu by podle me mel mit prezenter pouze jedinou instancni promennou, $model, ktere by posilal zpravy jako coinInserted, coffeTypeSelected, getCoffeeMakingProgress, ale veskera obsluzna logika by jiz mela byt v modelu. Pokud zacnete cpat business logiku z modelu do presenteru, veskere vyhody MVC se vytraceji.
Koukam ze to nebyla ani tak otazka, jako spis konstruktivni kritika :)
Jinak framework pusobi vcelku rozumne, dalsi maly krucek k zjednoduseni tvorby webaplikaci..
Re: Rozdeleni modelu a prezenteru
celé vláknoRe: Rozdeleni modelu a prezenteru
celé vláknoAno, rozdělení odpovědnosti je velmi důležitým bodem návrhu MVC aplikace. Tedy zodpovědět otázku, co je "prezentační logika" a co "byznys logika". V uvedeném příkladu ve své jednoduchosti lze rozhodnout tak i tak, obojí bude správně a mně se toto rozdělení lépe hodilo do příkladu.
Jako zásobník na mince, který uchovává informaci, kolik mincí v něm je, si lze totiž analogicky představit třeba "zásobník na písmenka s uchováváním informace", neboli [input type="text"]. U něj by asi nikdo neváhal, že patří do prezentační logiky.
Re: Rozdeleni modelu a prezenteru
celé vláknoJako zásobník na mince, který uchovává informaci, kolik mincí v něm je, si lze totiž analogicky představit třeba "zásobník na písmenka s uchováváním informace", neboli [input type="text"]. U něj by asi nikdo neváhal, že patří do prezentační logiky.
Nevidim zadnou analogii mezi zasobnikem na mince a retezcem("zásobníkem na písmenka s uchováváním informace"), krome toho ze oboje bude zrejme reprezentovano jako kolekce objektu.
Nevim proc bych nemel vahat jestli patri retezec umistit do prezentace nebo byznys logiky, to mi prijde jako dost dulezite a netrivialni rozhodnuti zavisle na tom co modeluji. Jinak samozrejme _vzdy_ lze dat logiku do modelu nebo do prezentace, ale v zavislosti na konkretnim pripade ma jedno nebo druhe lepsi smysl, usnadnuje nebo ztezuje porozumneni a navrh aplikace. Se zbytkem souhlasim.
Volání funkce revoluční jako znovuobjevené?
celé vláknoA vsadil bych se, že určitě nebylo první, kdo s timhle konceptem přišel.
revolucni myslenka?
celé vláknoTohle ale mely Ruby on Rails ohodne driv.
Re: revolucni myslenka?
celé vláknoA co jako? Pan Grudl snad psal ze to ma Nette prvni?? Nechapem
Re: revolucni myslenka?
celé vláknoRe: revolucni myslenka?
celé vláknoRe: revolucni myslenka?
celé vláknoRe: revolucni myslenka?
celé vláknoRe: revolucni myslenka?
celé vláknoDocela by mě zajímalo, jestli je schopný se asp.net mvc v budoucnu prosadit.
Jinak Nette je skvělý kus kodu, ktery clovek neprivadi do depresi, kdyz uz musi programovat v php. Gratulace :)
Textové popisky v controlleru?
celé vláknoVýznam URL
celé vláknoURL by mělo vyjadřovat stav aplikace a nikoliv postup, jak jsme do tohoto stavu dospěli. Stav kávomatu je vyjádřen hodnotou proměnné $money, takže URL ?money=5 by bylo v pořádku. Naproti tomu ?coin=5&do=insert vyjadřuje postup. Podle mého názoru by akce provedená na tomto URL měla přesměrovat právě na ?money=5. A to navíc odhlížím od toho, že akce mění stav aplikace, takže by měla být odesílaná metodou POST. Pokud by se hodnota $money ukládala třeba v session proměnné, tak by reload stránky vedl k nepřípustné změně tohoto stavu.
Re: Význam URL
celé vlákno- Oba si nacteme stranku kde je pro klik na petikorunu vyjadren jako ?money=5
- Ona prihodi petikorunu, vygeneruje se ji stranka s klikem na petikorunu vyjadrenym jako ?money=10, bohuzel uz petikorunu nema tak ceka na me
- Ja prihodim petikorunu, ale tim jen nastavim cilovou castku zase na 5 korun, prijdu i o sveho bura a kafe si nedame protoze automat si mysli (resp. skutecne ma) pouze 5 korun, petikoruna meho devcete jakoby nebyla (ale je klidne mozne ze se ji odecetla z kapsy! pokud neni implementovan nejaky komplikovany kontrolni mechanismus kdy se ptam automatu jestli se nekam neztratily me penize..)
To asi neni stastne reseni, lepsi by v tomto pripade bylo kdyby do URL byla zakodovana akce a stav byl ulozen jinde (na serveru).
Re: Význam URL
celé vláknoMožná jsem se nevyjádřil srozumitelně. URL na provedení akce by samozřejmě mělo vést na ?coin=5&do=insert (lépe navíc metodou POST). Toto URL by ale nemělo v prohlížeči zůstat a mělo by uživatele přesměrovat na ?money=5 (pokud držíme stav v URL proměnné a ne třeba v session).
Ale počkejme skutečně na další díl - jak mi David objasnil, tak přesně tímhle by se tam měl zabývat.
Re: Význam URL
celé vláknoRe: Význam URL
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknoTrygve Reenskaug
celé vláknodoufam, ze ho nemusi umet i vyslovit ;)
RE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknoV Nette má view úzkou vazbu na presenter. Podle mého názoru je zvolené názvosloví správné.
RE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vlákno> Ja teda v "presenteru" nevidim jediny rozdil oproti controleru
V Nette má view úzkou vazbu na presenter, čímž se liší od controlleru ve webovém MVC modelu, kde view většinou o controlleru vůbec neví. Alešův odkaz rozdíl pěkně demonstruje.
RE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknoPokud použijeme tuto definici Controlleru, pak je Presenter de facto Modelem.
RE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknoRE: Nette Framework: MVC & MVP
celé vláknotrygve
celé vláknoJméno Trygve má 6086 Norů, přičemž v celém Norsku jsou méně než tři lidi se jménem Trygve Reenskaug. Příjmení Reenskaug má 34 lidí.
Na druhé straně, i když je jméno David na žebříčku popularity na 6-7. místě (tedy hodně vysoko), tak příjmení Grudl je v Čechách zastoupeno ve 4 případech (včetně cizinců, zemřelých, nezvěstných :). Tedy méně než Reenskaugů. Ale dá se to prezentovat i tak, že jsi výjimečnější než Reenskaug :)
Každopádně ti držím palce, prezentuj, vysvětluj, zjednodušuj, přibližuj, konkretizuj.
Re: trygve
celé vláknoKde se vzala struktura?
celé vláknoDobrý den. Je možné že jsem si toho nevšiml, ale kde je řečeno cokoliv o struktuře, bootstrapu a jiných věcech ze staženého automatu?
Ne, že bych tímto šel proti autorovi, ale rád by jsem pochopil proč volit tuto strukturu a proč máme bootstrap když to "můžu" všechno napcat do jednoho souboru
htmlSpecialChars?
celé vláknoCo je to htmlSpecialChars($display)? Proč to tam je, co to zobrazí a kde je to definované? Díky
Re: htmlSpecialChars?
celé vláknohttp://jonatan.spse.pilsedu.cz/doc/php-man/function.htmlspecialchars.html
- slouží pro ošetření výstupu
Pokud jsem to dobře pochopil, s Nette teprve začínám ale myslím si:
$this->template->display = 'Vhoď ' . Model::COFFEE_PRICE . ' Kč';
Ti vytvoří pro šablonu právě tu proměnnou $display:
<?php echo htmlSpecialChars($display) ?>
Můžeš si zkusit přidat do metody buy() pod řádek
$this->template->display = 'Dobrou chuť'; $this->template->odstavec = 'Nový odstavec';
a pak do šablony přidat třeba:
<?php echo htmlSpecialChars($odstavec) ?>
Doufám, že to je správně :) nemám to odzkoušení je pul třetí a už se mi nechce otevírat PsPad :D