Výhoda array accessu (Předmět nesmí být kratší než 25 znaků)
- Mikulas Dite
- Člen | 756
Někomu to může vyhovovat víc než přístup přes property. Jaké konkrétní použití myslíš?
David ve vnitřku Nette většinou používá property (gettery). Napadá mě
jenom array access v DefaultMacros::$macros
a něco s parametry v
Html
objektech.
Array access ani není kratší, s uvozovkami dokonce o dva znaky delší (jako by to něco znamenalo):
$foo->bar; // 2 znaky
$foo['bar'];'// 4 znaky
- Filip Procházka
- Moderator | 4668
Praktické využití? https://github.com/…ontainer.php
přes properties mám přístupné aliasy služeb a přes
ArrayAccess
mám přístupnou configuraci z configu.
// služba s nastaveným aliasem
$entityManager = $serviceContainer->getService('Doctrine\\ORM\\EntityManager');
$entityManager = $serviceContainer->entityManager;
// pole hodnot
$database = $serviceContainer->getProperty('database');
$database = $serviceContainer['database'];
Díky tomu mi funguje i našeptávání, protože mám v annotacích
napsané, že v $entityManager
je instance
Doctrine\ORM\EntityManager
, což by pomocí ->getService nešlo.
V ArrayAccess
, u configu to není potřeba.
Editoval HosipLan (14. 4. 2011 18:28)
- VeN
- Člen | 46
Vím, že se array access používá v presenterech pro přístup ke komponentám, zahlédl jsem ho v service locatoru a možná bude ještě jinde. Také jsem na něj narazil v Nette\Cache, ale tam mi jeho použití přijde ještě relativně přímočaré.
Jenom mě zajímalo, co přesně na něm lidé oceňují, že ho používají. Mně osobně totiž přijde, že naopak znepřehledňuje zdrojový kód. Když totiž přijdu k nějakému kódu a vidím tam array access, nedokážu jednoznačně říct, co se pod ním skrývá a musím pátrat po jeho implementaci, což při čtení kódu zdržuje více než když je na místo array accesu volána klasická metoda.
- David Grudl
- Nette Core | 8228
Používá se pro přístup ke komponentám a v cache. První je věc zvyku, druhé je přirozené.
- Filip Procházka
- Moderator | 4668
To je asi o zvyku. Každopádně Nette tě do toho nenutí :) Je to jenom „zkratka“.
- VeN
- Člen | 46
Používá se pro přístup ke komponentám a v cache. První je věc zvyku, druhé je přirozené.
To že je něco zvykem ještě neznamená, že je to dobré. Stejně tak to může být špatný zvyk :) Přirozenost u cache je IMHO trochu diskutabilní (ale ano, je to subjektivní), protože to má z mého pohledu za následek, že o té instanci cache člověk začne přemýšlet jako o poli. Nehledě na to, že když v kódu uvidím uložení do $cache[‚3b2a4e‘], tak se budu muset ještě podívat, zda je to opravdu pole nebo instance něčeho.
To je asi o zvyku. Každopádně Nette tě do toho nenutí :) Je to jenom „zkratka“.
Jasně, v pohodě, vím, že mě do toho nikdo nenutí a pokud to nechci používat, tak nemusím. Nechci se tu hádat, že ten kdo ho používá je hloupý, to si nemyslím, pravděpodobně pro to má důvody. Spíš mě zajímá, proč ho lidé používají. Jestli jim opravdu přijde dobrý, že jim šetří práci a zda (stejně jako já) nemají pocit, že jim naopak dlouhodobě spíše škodí.
- Filip Procházka
- Moderator | 4668
Mě by zajímalo, čím ti může škodit. Nevidím v tom problém. Snad jen nešikovné našeptávání, ale to třeba u cache ani configu stejně nemá smysl řešit.
- VeN
- Člen | 46
Z mého pohledu jde o to, že jakmile člověk narazí na použití array
accessu, tak mu v hlavně naskočí jako první myšlenka, že se jedná
o pole. Následně zjistí, že to není pravda a musí se podívat, o jakou
instanci se jedná. V horším případě člověk musí znát vnitřní
implementaci array accessu.
Klasické volání metody mi přijde čitelnější, protože člověk vždy
vidí název metody a dokáže si z něj udělat lepší představu
o instanci.
Předpokládal jsem tedy, že použití array accessu má nějakou výhodu, když ho uživatelé Nette používají. „Degradace“ objektů na pole mi jako výhoda nepřijde, protože to IMHO vede k tendenci nevidět na první pohled kontrakty, ke kterým se objekty zavazují.
- David Grudl
- Nette Core | 8228
VeN napsal(a):
To že je něco zvykem ještě neznamená, že je to dobré. Stejně tak to může být špatný zvyk :)
V případě cache je to zatím jediná cesta, protože neexistuje metoda load() (bude existovat, použití metod bude preferované před ArrayAccess, jen stále nevím, jestli mít dvojici metod load+save nebo read+write, ach to názvosloví). V případě komponent je to věc, která se ujala sama od sebe, takže soudím, že to lidem připadá přirozené. Jestli se nepletu, dokonce to tak fungovalo v Delphi.
- Patrik Votoček
- Člen | 2221
VeN napsal(a):
Klasické volání metody mi přijde čitelnější, protože člověk vždy vidí název metody a dokáže si z něj udělat lepší představu o instanci.
David Grudl napsal(a):
V případě komponent je to věc, která se ujala sama od sebe, takže soudím, že to lidem připadá přirozené. Jestli se nepletu, dokonce to tak fungovalo v Delphi.
Pokud si v případě komponent zapamatuješ že $this['foo']
je komponenta s „id“ foo tak je ti to stejně platné jako kdyby
jsi viděl $this->getComponent('foo');
anotace (phpDoc)
s informací o vrácené instanci ti moc nepomůže protože je to
Nette\ComponentModel\IComponent
takže o moc
moudřejší nejsi.
jtousek napsal(a):
V kontextu cache mi připadá přirozenější load+save.
souhlas read znamená přečti a k tomu mě moc nesedí validace zda není invalidní (to zní ale divně :-D)