Nette\Collection – je to k něčemu?
- David Grudl
- Nette Core | 8227
Odstranil jsem z frameworku zbytečnosti nebo nikdy neimplementované
třídy jako Nette\Loaders\SimpleLoader
,
Nette\Config\ConfigAdapterXml
,
Nette\Forms\RepeaterControl
(teda předpokládám, že nikomu
nechybí).
Uvažuju, co ještě dalšího je dnes ve frameworku zbytečné. David Majda
mi před nějakou dobou psal, že se mu tak jeví třídy
Nette\Web\Ftp
a Nette\Images
. S tou první má
možná recht (přesunout do extras?), s tou druhou nesouhlasím, ta má ve
frameworku své místo.
Nejsem si jistý, jestli svého účelu dostála sada Nette\Collection. Sice její část využívá Config a MultiRouter, ale docela dobře by se bez něj dokázaly obejít. Ptám se proto uživatelů frameworku – používáte Collection? Vidíte v jeho třídách reálný přínos oproti použití nativního PHP pole?
- Honza Marek
- Člen | 1664
David Grudl napsal(a):
Odstranil jsem z frameworku zbytečnosti nebo nikdy neimplementované třídy jako
Nette\Loaders\SimpleLoader
,Nette\Config\ConfigAdapterXml
,Nette\Forms\RepeaterControl
(teda předpokládám, že nikomu nechybí).
RepeaterControl – pravda, jako neimplementovaná byla poněkud zbytečná, ale bude se ve formulářích nějak řešit to, k čemu měla být určená?
Uvažuju, co ještě dalšího je dnes ve frameworku zbytečné. David Majda mi před nějakou dobou psal, že se mu tak jeví třídy
Nette\Web\Ftp
aNette\Images
. S tou první má možná recht (přesunout do extras?), s tou druhou nesouhlasím, ta má ve frameworku své místo.
Ftp jsem použil ještě dřív, než to bylo zahrnuto do frameworku. V extras by ale stačila. Image – potřebuju vždy a všude.
Nejsem si jistý, jestli svého účelu dostála sada Nette\Collection. Sice její část využívá Config a MultiRouter, ale docela dobře by se bez něj dokázaly obejít. Ptám se proto uživatelů frameworku – používáte Collection? Vidíte v jeho třídách reálný přínos oproti použití nativního PHP pole?
Možná by se to mohlo hodit na ORM, to musim prozkoumat :-D
- Jan Tvrdík
- Nette guru | 2595
předpokládám, že nikomu nechybí
Nette\Forms\RepeaterControl
chyběl. Zrovna nedávno jsem ho pro
Clevis psal.
Párkrát jsem použil třídu ArrayList
kvůli kontrole typu
prvků. Vzhledem k tomu, že pro Nette\Collection
neexistuje
dokumentace, tak je docela možné, že někteří lidé ani nevědí, že to
v Nette je :)
Vidíte v jeho třídách reálný přínos oproti použití nativního PHP pole?
Je to takové hezčí, čistší, objektovější… Kdybych si myslel, že to bude i stejně rychlé, jako klasické pole, tak to asi používám všude.
- romansklenar
- Člen | 655
Kolekce používám, například u ORM, pokud ale budou třeba v extras tak to ničemu vadit nebude.
- Petr Motejlek
- Člen | 293
Přesně, kolekce jsou super hlavně kvůli ORM, ale jsou i jiná místa, kde mi přijde čistší použít ISet namísto array. Pokud je Nette webový framework, tak do něj ale asi takové třídy nepatří; Pokud je teda už náhodou něco z Nette přímo nevyužívá. Pokud je potřeba s nimi něco udělat, přesunul bych je do extras.
- pekelnik
- Člen | 462
uáááá!
Rozhodně ponechat – tyto třídy hojně využívám ve svých aplikacích – určitě by měly zůstat v jádru.
Ad „…Pokud je Nette webový framework, tak do něj ale asi takové třídy nepatří…“
Nette není jen webový framework ačkoli při psaní webů velmi pomáhá. A vůbec, co má společného webovost frameworku s tím, zda má obsahovat třídy pro práci s kolekcemi? Cožpak na webu ňemajů kolekce?
- David Grudl
- Nette Core | 8227
Bavil jsem se o tom ted z klukama z twobits a nevyjadril jsem se uplne presne. Otazka zni, jestli Collection nabizi neco, co by neslo nahradit za proste ArrayObject nebo lehkou Object-like obalku nad nim. Jestli skutecne programator rozvazi, kterou ze trid Collection pouzit a jeji specifika vyuzije.
- Petr Motejlek
- Člen | 293
Je fakt, že kdyby měly kolekce dávat super smysl, tak by musel Nette\Object mít i metody jako equals a hashCode, které jsou v Javě, nebo nějakou jejich obdobu. Pak by dávalo smysl mít některé populární kolekce jako např. Set v jádře a umět s nimi pracovat.
Ad Nette webový framework: To je fakt, špatně jsem to formuloval ;).
- Honza Marek
- Člen | 1664
Nezkoušel jste někdo vyrobit ArrayList s lazy loadingem? Nedaří se mi to provést tak, abych se nikde nezacyklil.
- David Grudl
- Nette Core | 8227
Tak asi Collection přesunu do extras a nahradím jedinou třídou, šikovnějším potomkem ArrayObject.
Něco jako ArrayList nabízí PHP 5.3 SPL pod názvem SplFixedArray, něco jako Set existuje od PHP 5.1 pod názvem SplObjectStorage.
Zjednodušený HashTable bude mít oproti ArrayObject navíc
Nette\Object
& Nette\FreezableObject
chování a
kontrolu typů objektů.
- Honza Marek
- Člen | 1664
Ta třída SplFixedArray je nějaká divná. V příkladech pořád čachrují s nějakým setSize.
- jakubkulhan
- Člen | 55
Honza Marek napsal(a):
Ta třída SplFixedArray je nějaká divná. V příkladech pořád čachrují s nějakým setSize.
To bude tím, že SplFixedArray je pole pevně alokované velikosti (pouze pro určitý počet prvků), narozdíl od klasického pole v PHP, což je vlastně jedna velká dynamicky rostoucí hashtabulka.
- arron
- Člen | 464
Tak tedy za me urcite Collection (a ostatní) ponechat. Jen by to chtelo alespon zlehka zdokumentovat co vsechno umi (a jsem presvedceny, ze toho neumi malo). Prave u trid zastresujici databazova data se hodi mit nejakeho chytreho predka, ktery dokaze data poskytnout ruznymi zpusoby a proc neco takoveho psat znovu, kdyz mam pocit, ze ve tridach z Collection neco takoveho je, ze?
- Honza Marek
- Člen | 1664
Možná bych byl pro kolekce ještě více zchytřit. Hodily by se metody shift, pop, push, first, last, …
- David Grudl
- Nette Core | 8227
Nezapomeňte, že kolekce jsou potomky ArrayObject, protože tento objekt má magické vlastnosti, především se umí přetypovat na pole. Zároveň jde o třídu funkčně krapet bohatou, je tam spousta metod na třídění. Hrozí však poměrně velké nebezpečí, že její autor Marcus Boerger přidá další metody a mohou tak vzniknout kolize. Hlavně mi vadí, že Marcus je co se týče návrhu API megaprase, protože když někdo v roce 2005 vymyslí tohle, tak má šanci uplatnit se leda v PHP ;)
Tím průsery nekončí. Zkuste si spočítat, kolikrát je ArrayObject zmíněn v changelogu, v různých verzích se mírně jinak chovají offsetExists vs. isset, neuměl se správně unserializovat, nehledě na to, že vymrdanci z PHP nemají ani jasno v tom, jak se co má chovat. Naopak chyb v klasických polích je celkem málo.
Obejdou se kolekce bez ArrayObject? Jeho schopnost přetypovat se na pole
skrze (array)
je docela sexy vlastnost, bez ní by bylo
používání kolekcí nepohodlnější. Také by nešlo jej předávat do
některých funkcí očekávájících pole (ale ani ArrayObject nejde předat
všude). To by asi nějak šlo, nevím.
Zkrátka, použití ArrayObject bych raději zcela minimalizoval a dal do frameworku pouze lehkou vrstvu nad ním řešící některé bugy a přidávající Nette\Object funkcionalitu. Zchytření kolekcí je na PHP příliš velké sousto a muselo by se obejít bez ArrayObject.
- David Grudl
- Nette Core | 8227
On jde každý objekt přetypovat na pole (a naopak), výhoda ArrayObject je v tom, že v podstatě volá funkci getArrayCopy() a nevzniká pole obsahující všechny proměnné včetně private a protected.