Výhoda array accessu (Předmět nesmí být kratší než 25 znaků)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
VeN
Člen | 46
+
0
-

Ahoj, rád bych se zeptal, jakou objektivní výhodu má array access v Nette? Snažil jsem se to dohledat, ale bohužel jsem neuspěl.

Je to úspora syntaxe?

Mikulas Dite
Člen | 756
+
0
-

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

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

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

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

To je asi o zvyku. Každopádně Nette tě do toho nenutí :) Je to jenom „zkratka“.

VeN
Člen | 46
+
0
-

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

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

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

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.

jtousek
Člen | 951
+
0
-

V kontextu cache mi připadá přirozenější load+save.

Patrik Votoček
Člen | 2221
+
0
-

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)

David Grudl
Nette Core | 8228
+
0
-

Cache::load added