Nette\Collection – je to k něčemu?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8109
+
0
-

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

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

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

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

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

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

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

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

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

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

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

Ta třída SplFixedArray je nějaká divná. V příkladech pořád čachrují s nějakým setSize.

jakubkulhan
Člen | 55
+
0
-

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.

Honza Marek
Člen | 1664
+
0
-

Tedy – není to náhrada třídy Nette\Collections\ArrayList.

arron
Člen | 464
+
0
-

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

Možná bych byl pro kolekce ještě více zchytřit. Hodily by se metody shift, pop, push, first, last, …

crempa
Člen | 198
+
0
-

2HM: super napad, myslim ze to je jedna z poslednich veci co v kolekcich jeste chybi pro „masovejsi“ pouziti…

Editoval crempa (13. 1. 2010 20:36)

David Grudl
Nette Core | 8109
+
0
-

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.

Jod
Člen | 701
+
0
-

Mne ide pretypovať na pole aj fantóm stdClass :)

David Grudl
Nette Core | 8109
+
0
-

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.

v6ak
Člen | 206
+
0
-

Mohlo by existovat něco jako java.util.Arrays nebo java.util.Collections, které by pomohlo tyto rozdíly setřít.