Zrušení properties v Nette\Object
- Ondřej Mirtes
- Člen | 1536
Nette 2 chce omezit v sobě obsaženou magii. Po několika měsících
každodenní práce s frameworkem vyvstalo několik argumentů, proč by měla
být zrušena podpora „properties“ – aneb přistupování ke
getterům/setterům pomocí jednoduššího zápisu
$obj->foo
.
- Když se člověk dozví, že existují nějaké
magické
metody __get a __set a umí už trochu objektově programovat, tohle využití napadne snad každého. Ale i přesto to žádný jiný framework v sobě nemá. - Je to magie. Magii poznáte tak, že si programátor při pohledu na kód řekne „WTF?“. „Jaktože mají ty třídy všechno public? Na to se musím podívat. Vždyť je tu všechno private. Jaktože to funguje? Vždyť tohle je PHP a ne C#.“
- Vede to k těžko odhalitelným chybám. Protože je to PHP a v něm je
viditelnost atributů a metod implementovaná na úrovni tříd, musí si
programátor dávat pozor na to, kdy může použít property zápis a kdy musí
přistupovat přes getter/setter, vždy, pokud tyto metody obsahují nějakou
další logiku, typicky FormControl::getControl(), kde
$control
je protected atribut třídy. Ve výsledku pak properties přidělávají práci při bughuntingu a je jednodušší všude psát gettery a settery.
Člověk k tomuto názoru musí dospět. Není to tak dávno, co jsem navrhoval rozšíření properties i do výjimek. Dnes už vím, že podobná magie by se protežovat neměla.
Co zpětná kompatibilita? Můžeme ji odstřihnout, anebo doplnit do Nette\Object podporu pro vlastní callback do __set/__get. Je otázka, co je menší zlo. Možná dokonce to odstřihnutí :)
- Honza Marek
- Člen | 1664
Ondřej Mirtes napsal(a):
- Vede to k těžko odhalitelným chybám. Protože je to PHP a v něm je viditelnost atributů a metod implementovaná na úrovni tříd, musí si programátor dávat pozor na to, kdy může použít property zápis a kdy musí přistupovat přes getter/setter, vždy, pokud tyto metody obsahují nějakou další logiku, typicky FormControl::getControl(), kde
$control
je protected atribut třídy. Ve výsledku pak properties přidělávají práci při bughuntingu a je jednodušší všude psát gettery a settery.
Ano, toto je zásadní argument proti properties. Nicméně se obávám, že „properties“ se v Nette tak důkladně zabydlely, že už je nejde vyhodit.
doplnit do Nette\Object podporu pro vlastní callback do __set/__get
WTF?
- _Martin_
- Generous Backer | 679
S tim nemohu souhlasit=)
- V Nette je spousta věcí, které jiné frameworky nemají – a právě proto jej používáme, ne?
- Podle stejné logiky bychom měli odstranit i továrny na komponenty. Gettery a settery mají v Nette pevně daná pravidla a pokud programátor ví, že pracuje v Nette, těžko obstojí otázka nejsem přeci v C#.
- Uvnitř těch tříd je lepší psát vždy gettery a settery, o tom žádná.
A ještě přidám jeden bod, proč si myslím, že je toto výhodné:
4. Šablony – volání přímo properties je přehlednější, než
volání funkcí
<ul n:inner-foreach="$article->comments as $comment">
<li><span>{$comment->author}</span><br />{$comment->text}</li>
</ul>
<!-- vs. -->
<ul n:inner-foreach="$article->getComments() as $comment">
<li><span>{$comment->getAuthor()}</span><br />{$comment->getText()}</li>
</ul>
Edit: Ještě mě napadla otázka: Nette tě nenutí properites využívat. V případě, že ti/vám vadí, nestačila by jen dohoda ve tvém vývojářském týmu, že se používat nebudou?
Editoval _Martin_ (2. 10. 2010 10:54)
- Inza
- Člen | 330
Jako Ondro tvé argumenty jsou správné (souhlasím s nimi) – ale zase na druhou stranu:
To, že má Object tyhlety magické properties je IMHO jedna z naprosto základních věcí v Nette Frameworku – a pro mě to byl a je jeden z dosti podstatných důvodů proč jej používat.
Ano je to magie, ale tahleta magie „opravuje nedostatky PHP“. Já jsem také pro zrušení (některé) magie v Nette – ale když zrušíte i ty featury Nette, které z PHP dělali trochu normálnější a použitelný jazyk, tak to IMHO zlikviduje pár důvodů, proč je Nette vhodné používat.
Dále – to že Object tyto vlastnosti má by měl vědět každý Nette programátor, protože je to naprostý základ. A když to víš a počítáš s tím při ladění aplikací, tak ti to tolik komplikací zase nezpůsobuje.
Nevím jestli je dobrým řešením toho, že Nette programátoři neznají nějakou core featuru frameworku a neumí s ní pracovat, to, že ji z frameworku odstraníme místo toho, abychom ty programátory naučily ji používat…
Mohu vám dát za příklad Rails – ty také mají spoustu takovéto magie – a skutečně to tam funguje tak, že když to neznáš a nevíš jak to používat tak jsi naprosto v pytli – nehneš se a jsi v loji. Ale když vezmeš tu chybu, kterou ti Rails vyplivnou, a dáš ji do googlu, tak najdeš odpověď prakticky ihned (ať už v dokumentaic, nebo na stackoverflow) – a často žasneš WTF? „Jakej osel to vymyslel? Jak jsem na to měl sakra přijít?“
Ale když pak za pár dnů musíš použít tu featuru znovu, tak jsi zase zcela mimo z toho, jak je to skvěle vymyšlené a jak ti to šetří práci – ohromným způsobem.
Dle mého názoru je to zde skutečně o tom, že znalost ti ohromným způsobem ušetří práci, neznalost ti zase přivodí bezesnou noc. A mě tento obchod nepřipadá zcela špatný, spíše naopak.
Já bych doporučoval tyhlety klíčové featury neodstraňovat a spíše je zachovat a soustředit se na to, jak naučit nettisty je správně používat a pracovat s nimi…
Edit: Martin +1
Editoval Inza (2. 10. 2010 10:54)
- pave.kucera
- Člen | 122
@OndřejMirtes: –1
ad 3
Volat gettery můžeš všude už teď, nic programátora nenutí tuhle magii využívat.
Edit: formátování
Editoval JannBaill (2. 10. 2010 10:58)
- westrem
- Člen | 398
@Ondrej Mirtes -1
Nette 2 chce omezit v sobě obsaženou magii
To je dobre, na urcitych miestach naozaj magia bola a clovek musel dohladavat ako co funguje – toto vsak nepovazuju za magiu Nette ale core magiu v PHP – to je rozdiel.
Když se člověk dozví, že existují nějaké magické metody __get a __set a umí už trochu objektově programovat, tohle využití napadne snad každého. Ale i přesto to žádný jiný framework v sobě nemá
Vyuzitie metod __get
a __set
moze byt roznorode,
Nette ich vyuzilo na podporu properties, regulerne vyuzitie, ktore je spravene
tak, ze v pripade volania neexistujucej property sa predsa hadze
vynimka nie?
Je to magie. Magii poznáte tak, že si programátor při pohledu na kód řekne „WTF?“. „Jaktože mají ty třídy všechno public? Na to se musím podívat. Vždyť je tu všechno private. Jaktože to funguje?
Ak niekoho napadne „wtf?“ pri tom, ze sa pristupuje „priamo“ a pritom je to „private“ tak to ocividne smrdi nedostatkom znalosti OOP v PHP a nie zlou magiou v Nette.
musí si programátor dávat pozor na to, kdy může použít property zápis a kdy musí přistupovat přes getter/setter, vždy, pokud tyto metody obsahují nějakou další logiku
Neviem ako ty, ale properties pouzivam len mimo triedy kde viem, ze mi
skracuju a sprehladnuju zapis – to je aj ich ucel, vo vnutrie tried hadam
kazdy vie, ze ak ma v metode setXX
aj nejaku logiku a napriek tomu
pouzije vo vnutri triedy priame priradenie, ze tato logika sa nevykona – to
uz ani nie je o znalostiach PHP ale o zakladnych znalostiach programovania
obecne.
- VeN
- Člen | 46
Souhlasím s Ondrou, tahle magie člověku občas připraví pěkně pitomý bug. Většinu času se to hodí, ale dá s v díky tomu udělat chyba, kterou nemusí člověk na první pohled vidět. Je to přesně ten aspekt, který je na Nette sexy. A funguje to stejně jako se ženskýma. Vytáhnete sexy ženskou na výlet do hor a ona při prvním stoupání začne skuhrat. Podíváte se jí na nohy a zjistíte, že jde v lodičkách :)
Ale zpět k tématu. Souhlasím i s Honzou Markem. IMHO je tohle neodstranitelná featura z frameworku. Jediné řešení ji z mého pohledu přikázat striktní používání getterů a setterů v aplikaci, která na základě Nette vzniká.
Jsem ale rád, že na tuhle vlastnost Ondra upozornil a rozjel debatu.
- Ondřej Mirtes
- Člen | 1536
Tyto reakce a argumenty jsem očekával. Já vím, kde properties mohu a nemohu použít, ale přemýšlení, jestli to v daném případě lze, mě stojí daleko víc úsilí než namačkat tři písmenka a shift. Pokud někdo takto nezanalyzuje situaci, bezmyšlenkovitě napíše property a vy pak po něm musíte projít celý kód a najít tento „misuse“, získáte úplně jiný názor.
Situace není tak jednoduchá. Nejde jen o přistupování uvnitř té samé třídy, ale i napříč jednotlivými objekty stejného typu nebo se společným předkem, viz dundeeho článek. Zvlášť ve formulářích nebo v komponentovém modelu Nette je to velmi „chutné“.
Obhajovat tuto featuru tím, že mi to umožňuje „core PHP“ pomocí __set a __get je taky vedle. PHP mi kvůli své skriptovací povaze umožňuje nerozumné věci. Např. obalovat definice metod a tříd podmínkami :o) __set a __get mají využití např. v Template nebo v Html. Jejich využití na properties napadne každého, ale jiné frameworky to nepoužívají kvůli tomu (IMHO), že se k danému atributu přistoupí přes getter nelze zajistit všude.
- Vyki
- Člen | 388
@czecher: Dostatky či nedostatky PHP tu asi nemá cenu řešit, protože s tím asi stejně nic neuděláme. Nette se snaží ty nedotažené aspekty PHP řešit, díky čemuž se dá s PHP docela dobře pracovat. Nebýt Nette, už bych dva roky v PHP nedělal. Spíše je otázka co ještě je přiohnutí technik programování v PHP správným směrem a co je už moc velká magie.
Properties v Nette používám docela vydatně a zvykl jsem si na ně. Rozumím tomu, že to někomu nevyhovuje, ale v takovém případě to nemusí používat. Pamatuji si, že na Davidově školení to byla jedna z prvních věcí, kterou nám ukázal. Je to jedna ze základních features a myslím, že by měla zůstat.
Editoval Vyki (2. 10. 2010 11:47)
- Inza
- Člen | 330
v6ak napsal(a):
Inza: Pokud reaguješ na úpravu Nette\Object, pak zkus navrhnout lepší řešení. Tyto metody může používat nějaká jiná knihovna, takže úplně zakázat je není možné.
Já je nechci zakazovat:-) – ani Object upravovat – já jsem pro to to nechat jak to je a vysvětlit těm Nettistům, kteří to neumějí používat jak se to používá;-)
Mě třeba přemýšlení kdy mám property použít a kdy ne žádný problém nedělá. V těch situacích, se kterými jsem já pracoval, mě bylo vždy naprosto jasné, kdy mám použít property a kdy napsat normálně getter a co mohu od properties v nette a od toho kódu co píšu, očekávat.
Ale chápu, že když někdo spolupracujete s lemrama, co ten kód pak zaprasí a vy to po nich musíte ladit, tak se vám to nelíbí. Ale IMHO je zde řešením naučit vaše méně zkušené kolegy programovat a nepřizpůsobovat framework tomu, že někdo neumí programovat…
- Yrwein
- Člen | 45
Božínku, a já myslel, že jsem s tímhle názorem na properties sám. :)
Ještě bych přidal jeden důvod: Rychlost __set/get obecně, nehledě na další zpomalení vzhledem k implementaci ku potřebám Nette/Objectu. (Upřímně řečeno by mi stačil Nette/Object tak, že by házel výjimky na nenalezení property/metod.)
Co se týče argumentu na téma „zkrácení zápisu“ – v normálním PHP kódu pro to nevidím důvod, spíše naopak vzhledem k fičurám dnešních IDE. U šablon – je spíš otázka, zda se o to nemá starat šablona sama. :)
Na druhou stranu – existence properties nikoho nezavazuje je používat. Spíš bych se zamyslel nad používáním __get/set obecně u tříd ala SessionNamespace, kde defakto neexistují metody pro nastavování proměnných (když nepočítám samotné __get/set a implementaci php nějakých rozhraní).
_____
Warning on line __LINE__: Tento příspěvek není na téma „vymazat či ne“, na odmazání je už imho pozdě. Z mého hlediska jediný návrh na změnu rozhraní SessionNamespace (__get a offsetGet by volaly metodu pojmenovanou třebas getVariable() plus zanesení do dokumentace, aby se člověk nedivil, že se někde chovají v Nette properties jinak a že existuje i alternativa v podobě změnění implementace __get/set). Plus souhlasím s Inzovou poslední větou (edit: z jeho prvního příspěvku).
Editoval Yrwein (2. 10. 2010 11:51)
- VeN
- Člen | 46
Ale chápu, že když někdo spolupracujete s lemrama, co ten kód pak zaprasí a vy to po nich musíte ladit, tak se vám to nelíbí. Ale IMHO je zde řešením naučit vaše méně zkušené kolegy programovat a nepřizpůsobovat framework tomu, že někdo neumí programovat…
<citově zabarvený příspěvek>
Inzo, programoval jsi někdy něco, nebo děláš jenom konzultanta na plný úvazek? Nechce se mi věřit, že bys nikdy neudělal v kódu chybu a nehledal jí. Není to o tom, že člověk nechápe důsledky téhle vlastnosti, ale jde o to, že si toho člověk občas nevšimne. Pokud je takový člověk lemrou… No, tak jsem lemrou…
</citově zabarvený příspěvek>
- redhead
- Člen | 1313
Zatím se mi nikdy nestalo, že bych musel hledat bug při použití properties. Vím kde a jak se používají, to mi stačí. Když se to pořádně vysvětlí nováčkům, žádný WTF nebude. Ostatně WTF dotazy tu byli stále a pokud vím, tak snad ani jeden nebyl na properties (až kromě nového QS s metodou getModel() a použití property model, kde se to ale nevysvětlilo!).
Za mě nechat!
- Inza
- Člen | 330
VeN napsal(a):
<citově zabarvený příspěvek>
Inzo, programoval jsi někdy něco, nebo děláš jenom konzultanta na plný úvazek? Nechce se mi věřit, že bys nikdy neudělal v kódu chybu a nehledal jí. Není to o tom, že člověk nechápe důsledky téhle vlastnosti, ale jde o to, že si toho člověk občas nevšimne. Pokud je takový člověk lemrou… No, tak jsem lemrou…
</citově zabarvený příspěvek>
Ok, možná ta formulace nebyla zcela výstižná – ale přijde mi že směr typu: „no, tak ono nám to dělá problémy, tak to raději zrušíme, než abychom se to naučili používat“ je zcestný způsob uvažování.
Ano, programoval jsem a programuji. Aktuálně nejvíce v Ruby on Rails a Nette, ale mám zkušenosti i s jinými jazyky (Java, AspectJ, C++, C#). Možná byste také mohli zkusit si občas něco napsat i v jiném jazyce – člověku to tak trochu otevírá obzor.
Jinak v kódu jsou už udělal spoustu chyb – a strávil jsem spoustu oněch „bezesných debugovacích nocí“. A nemyslím si, že programátor, které takovou věci zažije je lemra. Myslím si, že lemra je ten programátor, který takovou noc zažije a potom se snaží změnit framework, místo toho aby se s ním naučil pořádně zacházet a programovat.
- V mém případě to tak dopadlo. Z těch nocí jsem se poučil a teprve s odstupem se zamýšlel nad tím, proč je to v tom frameworku „tak blbě udělané“ – a většinou jsem došel k závěru, že ten, kdo to dělal blbě jsem byl já a ne framework. A proto jsem se to naučil používat místo toho, abych se to snažil změnit.
- teď se opravdu omlouvám, ale (trochu offtopic):
Tohleto je přesně ten důvod, proč si vždy, když se vrátím z nějakého fóra o Ruby, o Rails, nebo o XNA zpět na Nette fórum, připadám jako bych se vrátil o deset let zpátky někam do programátorské mateřské školky…
Neberte to nijak osobně, ale upřímě: Všimli jste si, že tu v tomhletom topicu řešíme, zda jsou k něčemu properties, že má PHP bugy a že Nette některé tyto bugy opravuje?
Že tu řešíme to, co je spoustě lidí jasné?
- to že mám PHP bugy ví každý (a ten chytrý se ho snaží nepoužívat)
- to k čemu jsou properties a jaké mají benefity a zápory ví také každý (a ti chytří to už zakomponovali do programovacích jazyků)
- to že nette se snaží některé neduhy PHP opravit víme a IMHO to je to, co na něm máme rádi – a tenhleten topic je o návrzích na odstranění části této vlastnosti?
Já vím, jsem zlý ošklivý rubysta… ale…prostě… já nevím jak to lépe vyjádřit – to je něco co musí člověku prostě dojít…
- Josef Richter
- Člen | 2
Ondřej Mirtes napsal(a):
- Když se člověk dozví, že existují nějaké
magické
metody __get a __set a umí už trochu objektově programovat, tohle využití napadne snad každého. Ale i přesto to žádný jiný framework v sobě nemá.
Neznám moc dobře PHP/Nette, ale z toho co jsem tady četl se mi zdá že je to to stejný jako attr_accessor v Ruby. Tím pádem to v sobě mají všechny Ruby frameworky včetně Rails, Sinatra, atd. a je to hojně využívaná záležitost. Něco málo se o tom dá přečíst třeba tady: http://kev.in/…-part-1.html a vyzkoušet se to dá tady: http://TryRuby.org/
- Yrwein
- Člen | 45
Inza: „Argumenty“ s odvoláváním na „ty chytré“/„kteří už neřeší“ si dovolím ignorovat. Absence možnosti změny frameworku na základě kritiky mě taky dráždí, ale nechci to tu zanést flamem. :)
K tématu: PHP má chyby, nicméně i používání properties v PHP může mít svá úskalí. Takže jedno WTF chování je nahrazeno druhým, je zaneseno do FW a tebou prezentováno jako osvícený krok, jehož neradno zpochybňovat, protože… proč? Protože to je v jazycích, kde to má nativní podporu a funguje to tam bez problémů? To ale PHP není.
Aneb nezpochybňuji užitečnost části implementace Nette\Object, ale jiná část mi (plus asi i dalším lidem) tak přínosná nepřijde (a naopak). :)
Editoval Yrwein (2. 10. 2010 12:52)
- arron
- Člen | 464
Ja normalne neprestavam zirat…
Mozna trochu OT, ale predpokladam, ze to pochopite. Mnozi se tu na foru pomerne hodne prizpevku, ktere jsou dost mimo misu hlavne proto, ze dany pisatel je zjevne liny si precist cokoliv z dokumentace, nedej boze, aby se podival primo do zdrojaku Nette. Jasne, stane se, ale mam z toho posledni dobou cim dal tim silici pocit naproste neochoty si cokoliv nastudovat sam, naucit se taky sam neco noveho. A ted nemluvim jenom o Nette, ale i napr. o dibi nebo samotnem PHP.
Nette ma spoustu vyjmecnych feature a obecne celou svoji filozofii vede programatory naprosto sprirozene ke spravnemu navrhu. Kolik bezesnych noci jsem stravil tim, ze jsem prolezal zdrojove kody Nette a hledal, jak ze to vlastne funguje, abych nakonec zjistil, ze jsem fakt levak, ze to mam cele blbe navrzene a blbe napsane. A kupodivu byla chyba vzdycky na me strane.
Mistama mi prijde, ze si programatori predstavuji, ze si stahnou framework, nekam neco rozbali a pak se budou koukat, jak se jim ty stranky hezky vytvareji. A za chvili budeme chtit, aby nam u toho Nette jeste pustilo hudbu a udelalo kafe. Jenze ono to tak snadne neni, ze jo. Clovek proste musi vedet co je to OOP, musi si precist nejakou tu dokumentaci a pokud chceme frameworku opravdu dobre rozumnet a vyuzivat vsechny jeho moznosti, tak stejne skoncime u jeho zdrojaku.
Nejsem si jisty, jestli jsem uplne presne vystihnul pointu, ale verim, ze to alespon nekdo pochopil…
P.S.: Jinak jsem nechtel nekoho urazit, je to proste jenom takovych par poznamek:-)
P.P.S.: Kdo nechce pouzivat properties, necht nededi od Object;-)
Editoval arron (2. 10. 2010 13:01)
- Blizzy
- Člen | 149
arron napsal(a):
P.P.S.: Kdo nechce pouzivat properties, necht nededi od Object;-)
Nebo ještě líp, kdo je nechce používat, ať si klidně dědí a nepoužívá je. :-)
Já jsem s properties nikdy problém neměl, je to jednoduchý princip a vždy mi pouze ulehčil práci. Tečka.
Editoval Blizzy (2. 10. 2010 13:04)
- Yrwein
- Člen | 45
„Kolik bezesnych noci jsem stravil tim, ze jsem prolezal zdrojove kody Nette a hledal, jak ze to vlastne funguje, abych nakonec zjistil, ze jsem fakt levak, ze to mam cele blbe navrzene a blbe napsane. A kupodivu byla chyba vzdycky na me strane.“
?! Nette má šílenou dokumentaci, takže musíte prolézat zdrojáky (a api evidentně taky moc nevede), a je to vaše chyba? To je nějaký vtip nebo vstoupilo do módy programátorské flagelanství?
___
Jinak debata se stačí docela do offtopicu.
Editoval Yrwein (2. 10. 2010 13:04)
- arron
- Člen | 464
Yrwein napsal(a):
?! Nette má šílenou dokumentaci, takže musíte prolézat zdrojáky (a api evidentně taky moc nevede), a je to vaše chyba? To je nějaký vtip nebo vstoupilo do módy programátorské flagelanství?
Zjevne jsem tam zapomnel dopsat, ze mi neco nefungovalo, takze jsem hledal, kde je ten bug. Nakonec jsem skoncil ve zdrojacich Nette (ano dokumentace tehdy byla jeste opravdu v plenkach…). Jednak jsem se toho spoustu naucil o vnitrni architekture Nette a jednak jsem zjistil, ze kdyz se mi neco chova divne nebo ne uplne podle ocekavani, tak je to spatne navrzene nebo naprogramovane. Mozna to svedci o tom, ze jsem spatny programator, ale na druhou stranu me to Nette vzdycky donutilo naprogramovat to lepe a cisteji.
Jinak debata se stačí docela do offtopicu.
To sice mozna ano, ale nerekl bych, ze to az zase tolik vadi, ne?
Editoval arron (2. 10. 2010 13:12)
- pekelnik
- Člen | 462
Jestli je na „properties“ něco nepříjemné tak to, že je nejde
používat uvnitř třídy, protože se nezavolá g/setter, ale přistoupí se
přímo k $property
.
- Řešením je buď uložit vnitřně hodnotu jinam než do stejnojmenné
$property
, např.: tedy do $data[‚property‘]. - Druhá možnost je vůbec to nepoužívat a všude pracovat přímo s g/settery.
Například v šablonách je to ale nutnost. Psát gettery je fakt nuda.
Nadruhou stranu něco jako $foo->bar ⇒ Foo::getBar() ⇒ $foo->getContext()->getService(‚…‘) je už trochu kombo…
Ale jak někdo napsal je potřeba mít znalosti ;)
- Ondřej Brejla
- Člen | 746
Nečetl jsem to celé, stačil mi titulek: @Ondra +1…když jsem o tom někdy před dvěma lety mluvil, tak mě všichni kamenovali :-D Bohužel mám dojem, že teď je pozdě bycha honit ;-)
- VeN
- Člen | 46
arron: Přesně tohle se mi na Nette komunitě nelíbí. Přijde mi, že příliš často razíte Nette-way a kdo řekne, že se mu to nezdá, tak je hned hňup, který nečte manuál. Ale není to výjimka, jinde je to stejné.
Pokud jsme Ondru správně pochopil, tak jeho problém není v tom, že by tomu nerozuměl, dostatečně nečetl manuál nebo neznal zdrojáky Nette. Problém je v tom, že tato vlastnost může vést k programátorským chybám. Ano, je sexy, když nemusím volat getter či setter, ale je to magie, za kterou se platí. Mimochodem, ještě horší je volání továrničky presenterovským $this[‚komponenta‘].
Je sice hezké, že jsi se kvůli mizerné dokumentaci naučil lépe Nette, ale nemyslím si, že by to bylo něco pozitivního. Pro tebe možná, ale pro framework samotní nikoliv.
- Patrik Votoček
- Člen | 2221
Cca pře 1hod jsem se vzbudil takže můj mozek ještě stále nejede na 100% (běžného provozu).
Když jsem vyděl titulek tak jsme se musel podívat na datum jestli není náhodou 1.4.20xx (ano jsem jeden z lidí, kteří strácí pojem o čase). A ono ne. A on to ani není blbej vtip ono je to myšlené vážně! No lol!
Kde začít? No je tu tuna textu takže s velkou pravděpodobností budu opakovat co tu už zaznělo. Nicméně pro ty, kteří nechtějí číst další řádky mého textu verdikt už teď: JSEM PROTI ZRUŠENÍ JEDNÉ Z NEJVĚTŠÍCH FEATUR NETTE.
A teď ta omáčka. Připadá mě to tak trochu že někdo narazil na problém a strávil jeho řešením spoustu času a pak zjistil že udělal někde nějakou botu protože použil něco jinak než měl. A tak aby tomu pro příště předešel přesedne z měkkého křesla na dřevěnou rozvrzanou židli.
Properties tak jak jsou v Nette implemtovány jsou naprosto dokonalá vlastnost a pokud při programování člověk přemýšlí a píše @phpDoc komentáře jsou o to lepší. Používám je rád a řekl bych že o honě zpřehledňují kód. To že PHP nemá nativní podporu tady každej ví stejně jako každej ví že PHP nemá ENUM. Nette obecně se snaží programátora odstínit od možných problémů a nedostatků PHP (to jestli je tomu tak dobře nebo ne je asi na jinou diskusi). A properties jsou jednou z nich navíc jsou implementovány celkem striktně a hlavně nikdo nikoho nenutí je používat. Já je používám a rád!
Teď k onomu volání uvnitř třídy kde se název property shoduje
s jinou privátní proměnou třídy. Tohle je problém, na který jsem narazil
už mnohokrát. Pak jsem přišel k Doctrine 2 a divil se proč sakra
používají pořád private $_em
? Vždyť je to přežitek z doby
PHP4! Proč to proboha používají v době PHP 5.3? Když v tom mě to asi po
měsíci došlo… Ano je to přesně řešení tohoto problému.
Závěrem bych chtěl říct naučte se property používat a při psaní kódu počítejte s problémy které jsou s nimi spojené. Nebo se na to vykašlete a nepoužívejte je!
Editoval vrtak-cz (2. 10. 2010 18:51)
- arron
- Člen | 464
VeN napsal(a):
Přesně tohle se mi na Nette komunitě nelíbí. Přijde mi, že příliš často razíte Nette-way a kdo řekne, že se mu to nezdá, tak je hned hňup, který nečte manuál. Ale není to výjimka, jinde je to stejné.
Ja asi dost dobre chapu, co tim presne myslis a na jednu stranu s Tebou souhlasim:-) Na druhou stranu jsem se za tu dobu, co jsem s Nette (cca 2 roky) mnohokrat presvedcil, ze to ‚Nette-way‘ je o dost lepsi nez ‚My-way‘ popripade ‚Other-way‘. Nechci tim rict, ze je vsechno dokonale (to asi neni nikdy), ale opravdu je to v drtive vetsine pripadu lepsi nez jinde. Takze dneska uz to chapu, proc to Nette komunita dela:-)
Pokud jsme Ondru správně pochopil, tak jeho problém není v tom, že by tomu nerozuměl, dostatečně nečetl manuál nebo neznal zdrojáky Nette. Problém je v tom, že tato vlastnost může vést k programátorským chybám. Ano, je sexy, když nemusím volat getter či setter, ale je to magie, za kterou se platí. Mimochodem, ještě horší je volání továrničky presenterovským $this[‚komponenta‘].
Ani me nedoslo, ze bych mohl takhle nekoho omylem nařknout, to fakt sorry:-) Nicmene je zajimave sledovat, jak se z vic magie urcene na to, aby se proste clovek nemusel o nektere veci starat, nakonec stava min magie:-) Misty mi to prijde velmi usmevne;-)
- westrem
- Člen | 398
Než se tu rozjede flame: @czecher: myslím, že věta od @westrem se svým smyslem rozhodně netýkala „správnosti“ přístupu PHP k OOP a tudíš něco takové řešit je bezpředmětné.
Samozrejme netykala, tykala sa toho ako je OOP implementovane v PHP a ak niekto robi v PHP a pouziva OOP mal by vediet ako v tomto jazyku funguje (ci uz to je nejak stastne alebo nestastne implementovane je subjektivna debata – islo mi len o: poznaj jazyk v ktorom pracujes, ale do detailov!)
.. by mi stačil Nette/Object tak, že by házel výjimky na nenalezení property/metod.
Ano, to je imho jedine rozumne druhe vyuzitie magic methods, kde prve su prave properties v Nette. Sam kym som nepouzival Nette tak som mal vlastny Object, ktory fungoval takto striktne, ked sa sahalo na neexistujucu premennu tak sa vyhadzovala Exception
Mnozi se tu na foru pomerne hodne prizpevku, ktere jsou dost mimo misu hlavne proto, ze dany pisatel je zjevne liny si precist cokoliv z dokumentace, nedej boze, aby se podival primo do zdrojaku Nette
Bohuzial mam podobny pocit, neobvinujem nikoho z toho akym stylom sa stavia k novym veciam, ale obcas ma zaraza, ze sa niekto spytuje aj na tak jasne veci, ktore su vo FAQ pripadne priamo v distribucii vysvetlene a ukazane.
vrtak-cz napsal:
Teď k onomu volání uvnitř třídy kde se název property shoduje s jinou privátní proměnou třídy.
Viem, ze je to offtopic ale dost ma to zaujalo, mozes ozrejmit co mas na mysli? Aky typ konfliktov a ako to je riesene, staci ak ma odkazes na nejaky web ak sa ti to nechce vypisovat, dakujem.
- Josef Richter
- Člen | 2
Mnozi se tu na foru pomerne hodne prizpevku, ktere jsou dost mimo misu hlavne proto, ze dany pisatel je zjevne liny si precist cokoliv z dokumentace, nedej boze, aby se podival primo do zdrojaku Nette
Bohuzial mam podobny pocit, neobvinujem nikoho z toho akym stylom sa stavia k novym veciam, ale obcas ma zaraza, ze sa niekto spytuje aj na tak jasne veci, ktore su vo FAQ pripadne priamo v distribucii vysvetlene a ukazane.
- westrem
- Člen | 398
Josef Richter napsal
Uzasne!
V skutocnosti vsak tak ako pisem, nikoho neodsudzujem. Kazdemu, kto na forum postne nejaky problem a je v mojich silach pomoct mu (ci uz tym ze ten problem viem vyriesit alebo odpoved dohladat) vzdy rad pomozem a niekedy k tomu naviac poznamenam, kde moze nabuduce sam najst odpoved (je to rychlejsie ako cakat na fore na odpoved).
Osobne to totiz beriem tak, ze ak sa opakuju otazky, ktore su casto odpovedane vo FAQ pripadne na nejakom inom dohladatelnom mieste, asi je chyba v nas, ktori sa o FW starame a rozsirujeme ho. Nieco sa asi potom robi zle, ked ludia nie su schopny dojst ani k tymto pomocnym zdrojom. To je uz ale debata hodna ineho threadu ..
- David Grudl
- Nette Core | 8228
Uznale kývám před odvahou s podobnou myšlenkou vystoupit. Váhu tomu dává také odkaz na „tvé“ měsíc staré RFC, kde žádáš pravý opak.
Ondřej Mirtes napsal(a):
Nette 2 chce omezit v sobě obsaženou magii.
Už jsem říkal dříve, že rozlišuju magii a „magii“. Na WebExpu jsem si všiml, že zbavování se magie je teď jakási frameworková móda a dělá se vskutku důsledně. S tímhle ale nemá Nette nic společného. Mým cílem není zbavení se magie, ale co nelepší API pro programátora – magie se zbavuju tam, kde to k tomuto cíli vede.
- Když se člověk dozví, že existují nějaké
magické
metody __get a __set a umí už trochu objektově programovat, tohle využití napadne snad každého. Ale i přesto to žádný jiný framework v sobě nemá.
„Žádný jiný“ je odvážné tvrzení, těžko prokazatelné, ale třeba je to pravda. Mám to brát i jako No.1 argument pro zrušení kontextového escapovaní v šablonách? ;-)
- Je to magie. Magii poznáte tak, že si programátor při pohledu na kód řekne „WTF?“. „Jaktože mají ty třídy všechno public? Na to se musím podívat. Vždyť je tu všechno private. Jaktože to funguje? Vždyť tohle je PHP a ne C#.“
Ano, magije, byl jsem to zkontroloval v kuchyni ;-) Ale je to ten typ magie, kterému se říká konvence a ta v současné době docela frčí. V případě Nette by mělo jít o první věc, kterou se člověk naučí.
- Vede to k těžko odhalitelným chybám. Protože je to PHP a v něm je viditelnost atributů a metod implementovaná na úrovni tříd, musí si programátor dávat pozor na to, kdy může použít property zápis a kdy musí přistupovat přes getter/setter, vždy, pokud tyto metody obsahují nějakou další logiku, typicky FormControl::getControl(), kde
$control
je protected atribut třídy.
Nette\Forms je poslední místo, kde se nacházejí protected attributy, ale i ty časem zmizí. Nicméně existuje řešení, které NObject od počátku své existence cíleně nabízí a tím je psát properties s velkým prvním písmenem.
Ve výsledku pak properties přidělávají práci při bughuntingu a je jednodušší všude psát gettery a settery.
Samozřejmě bych nechtěl, aby properties přidělávaly práci. Sám na takové případy nenarážím a když už někdy ano, snažil jsem se je vyřešit (Debug třeba ukazuje řádek kódu s voláním property namísto kódu ObjectMixin, kde k vyhození výjimky dochází). Takže tohle téma mě zajímá, budu rád, když ho rozebereš podrobněji.
Člověk k tomuto názoru musí dospět. Není to tak dávno, co jsem navrhoval rozšíření properties i do výjimek. Dnes už vím, že podobná magie by se protežovat neměla.
Vyhovím tvé žádosti a podporu properties z frameworku skutečně odstraním. Jen to nebude hned. Udělám to s přechodem na verzi PHP, která je nativně zavede. Takže zkuste tlačit tímto směrem.
(Zaujalo mě, že nikoho nezaujalo, že samotné Nette properties nikdy nepoužívá.)
- Cifro
- Člen | 245
„Tu máte properties, funguje to tak a tak. Môžete ale nemusíte to používať.“
„Ale to je veľká mágia, a veľké WTF. Zrušme tie magické properties.“
„Ok zrušime ich, a zrušime to aj to, a hotovo. Tak som povedal, ja veľký DG.“
„Ale to nemožeš, to je diktatúra, my chceme slobodu.“
„Ok, tu máte properties, funguje to tak a tak. Môžete ale nemusíte to používať.“
*RECURSION*
Ľuďom nevyhovieš. A programátorom dupľom nie…
Edit: Vraj som už týmto príspevkom povýšený na Nette guru ^_^ uiii ale skôr by som tam mal mať asi Nette lama.
Editoval Cifro (3. 10. 2010 12:57)
- Honza Kuchař
- Člen | 1662
Nevím proč by Nette mělo být jako všechny ostatní produkty. Nette mám rád, právě díky odvážným nápadům, přehlednosti a kvalitě. Properties jsou poměrně odvážný tah, jakási důmyslná inovace a podle mě – velmi povedená. Nikdy mi nestížily debugování. Tedy opravdu nevím o čem tu mluvíte. Properties používám rád, zapisuji je do dokumentace pomocí @property, není to tedy žádná magie. A nakonec, nejsem zaujatý, toto je můj názor, který se vyvinul už kdysi dávno. Properties byla jedna z věcí, která mě pro Nette nadchla. Stejně jako velice povedený Debug a hromada dalších věcí. Na Nette\Object a jeho funkce člověk narazí na jako jednu z prvních věcí v Nette a je z nich rozhodně velmi příjemně překvapený.
- Ped
- Člen | 64
Ondřej Mirtes napsal(a):
- Vede to k těžko odhalitelným chybám. … Ve výsledku pak properties přidělávají práci při bughuntingu a je jednodušší všude psát gettery a settery.
O cem to proboha mluvis? Jake chyby, jaky bughunting? :)
Kdyz to projde testy, je to spravne. Kdyz to testy prochazi a nedela to to co
ma, je potreba pridat dalsi test. Kdyz to testem neprochazi a netusis proc ani
po tretim pokusu o fix, je dobre zkusit kod vymazat a napsat znovu.
Properties urcite nechat, zkracuji mi zapis a ja jsem ve svem veku jiz velice liny, naopak mi nedela problem se v nich orientovat a tu „magii“ prokouknout i pri letmem pohledu.