Zrušení properties v Nette\Object

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Mirtes
Člen | 1536
+
+1
-

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.

  1. 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á.
  2. 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#.“
  3. 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
+
0
-

Ondřej Mirtes napsal(a):

  1. 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
+
0
-

S tim nemohu souhlasit=)

  1. V Nette je spousta věcí, které jiné frameworky nemají – a právě proto jej používáme, ne?
  2. 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#.
  3. 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)

Aurielle
Člen | 1281
+
0
-

Martin: +1, properties používám právě kvůli zkrácení zápisů, jsem proti zrušení…

Inza
Člen | 330
+
0
-

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
+
0
-

@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)

dundee
Člen | 23
+
0
-

No fuj, to je ale blbej nápad :)

Magické metody jsou IMHO jedna z nejlepších feature, které PHP má. Nepoužívat je, by byla velká škoda. To by pak třídy vypadaly stejně hnusně jako v Javě nebo Zendu :/

v6ak
Člen | 206
+
0
-

V Javě máme ProjectLombok.org, co mají v Zendu? :P

Možná problém vyřešíš, když na dev si Nette\Object upravíš tak, aby __get a __set podle stacktrace zakazovalo použití z Tvého kódu.

westrem
Člen | 398
+
0
-

@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.

Inza
Člen | 330
+
0
-

v6ak napsal(a):

V Javě máme ProjectLombok.org, co mají v Zendu? :P

Možná problém vyřešíš, když na dev si Nette\Object upravíš tak, aby __get a __set podle stacktrace zakazovalo použití z Tvého kódu.

God!:-D – teda…o takových věcech by se nemělo snad ani žertovat:-D

VeN
Člen | 46
+
0
-

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.

czecher
Člen | 1
+
0
-

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.

Teď je otázka, jestli je OOP v PHP ten „správný“ přístup.

Ondřej Mirtes
Člen | 1536
+
0
-

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.

v6ak
Člen | 206
+
0
-

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é.

_Martin_
Generous Backer | 679
+
0
-

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é.

Vyki
Člen | 388
+
0
-

@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
+
0
-

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…

Inza
Člen | 330
+
0
-

Vyki napsal(a):

… Nebýt Nette, už bych dva roky v PHP nedělal. …

Tak až kluci z Nette ty properties odstraní, jak navrhuje Ondra, tak se mrkni na Ruby On Rails ;-)

Yrwein
Člen | 45
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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…

_Martin_
Generous Backer | 679
+
0
-

Kucí, nehádejte se – své názory jste už řekli a všichni je četli, nač přecházet do roviny osobních útoků? A prosím, Tomáši: nereaguj na tuhle mojí poznámku dvacetiřádkovou esejí=)

Inza
Člen | 330
+
0
-

_Martin_ napsal(a):

Kucí, nehádejte se – své názory jste už řekli a všichni je četli, nač přecházet do roviny osobních útoků? A prosím, Tomáši: nereaguj na tuhle mojí poznámku dvacetiřádkovou esejí=)

Neboj:-) – já jsem jen argumentoval, na nikoho neútočím;-).

Josef Richter
Člen | 2
+
0
-

Ondřej Mirtes napsal(a):

  1. 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/

pekelnik
Člen | 462
+
0
-

Rušení properties bude na pořadu dne hned jak budou nativně podporované v php ;)

Yrwein
Člen | 45
+
0
-

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
+
0
-

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)

Inza
Člen | 330
+
0
-

arron napsal(a):

Já bych tu chtěl mít tlačítko „líbí se mi“ :-) – bych tvůj příspěvek ihned označil;-).

Jinak SOUHLAS!

Blizzy
Člen | 149
+
0
-

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
+
0
-

„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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.20×x (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
+
0
-

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;-)

pekelnik
Člen | 462
+
0
-

@vrtak „…aby tomu pro příště předešel přesedne z měkkého křesla na dřevěnou rozvrzanou židli…“

celkem trefný :D

Vyki
Člen | 388
+
0
-

VeN napsal(a):
Mimochodem, ještě horší je volání továrničky presenterovským $this[‚komponenta‘].

To taky používat nemusíš jestli ti to vadí. Je to velmi praktická věc a dobře se s tím pracuje. Nic ti nebrání všude datlovat getComponent.

Editoval Vyki (2. 10. 2010 21:44)

krissott
Člen | 48
+
0
-

Ondro chápu tě, ale taky bych nerušil.

westrem
Člen | 398
+
0
-

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
+
0
-

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.

http://yehudakatz.com/…ry-of-noobs/

westrem
Člen | 398
+
0
-

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 | 8082
+
0
-

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.

  1. 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? ;-)

  1. 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čí.

  1. 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
+
0
-

„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)

jtousek
Člen | 951
+
0
-

Cifro: +11 x))

Honza Kuchař
Člen | 1662
+
0
-

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ý.

redhead
Člen | 1313
+
0
-

Honza Kuchař napsal(a):

Nikdy mi nestížily debugování. Tedy opravdu nevím o čem tu mluvíte.

+1

phx
Člen | 651
+
0
-

Takova drobnost: pravdepodobne pouzivani properties ma vliv na vykon aplikace. Preci jen se musi vykonat vice radku kodu:))

Ped
Člen | 64
+
0
-

Ondřej Mirtes napsal(a):

  1. 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.