Experimentální aliasy tříd frameworku Nette\Object → NObject
- David Grudl
- Nette Core | 8218
Zkusil jsem do poslední revize frameworku pro PHP 5.3 přidat velice
experimentální záležitost: automatický generátor aliasů tříd. Pro
jakoukoliv třídu nebo interface z frameworku existuje alias bez jmenného
prostoru prefixovaný písmenem „N“. Jinými slovy, místo
Nette\Object
můžete kdekoliv klidně psát
NObject
. Dá se tedy říct, že na verzi pro PHP
5.3 můžete bez jakýchkoliv úprav provozovat aplikace psané pro
prefixovanou 5.2 verzi. *)
K čemu je to dobré? Především jde o experiment, kde by teprve praxe měla ukázat, jestli jde o přednost nebo naprostý nesmysl. Jaké jsou výhody?
- Programátorům se dostává do rukou možnost psát doplňky fungující pod 5.3 a 5.2 verzí
- Vzniká alternativa k jmenným prostorům: dříve nebo později dojde k odstřihnutí podpory PHP 5.2, což dosud znamenalo i nutnost přejít na ukecanější jmenné prostory, které nemusí každému vyhovovat
- pokud se tato technika osvědčí, lze ji využít také pro 100% zpětně kompatibilní přechod na jemnější jmenné prostory
- teoreticky by aliasy nemusely být ve tvaru
NTrida
, ale třebaNette\Trida
neboN\Trida
, což by ovšem zrušilo bod 1) – ačkoliv může zároveň fungovat obojí…
Celá záležitost má i své kontroverzní stránky. Dvojitý způsob, jak psát kód; magie; omezené našeptávání. Jsem si těchto věcí vědom, proto mi prosím nespílejte.
*) oproti verzi 5.2 prefixed je rozdíl v tom, že N
se
vkládá i před názvy rozhraní, takže je tu třeba
NIAuthenticator
. Samozřejmě je to možné upravit, ačkoliv jako
chybu spíš vnímám ty chybějící enka v prefixed verzi.
- Jan Tvrdík
- Nette guru | 2595
Experiment zajímavý, ale časem (za dlouho, až umře PHP 5.2) může ve
frameworku vznikout potřeba mít dvě stejné pojmenované třídy. (Ona tam ta
potřeba teda už je, ale vyřešila se prefixem – AppForm
.)
Osobně to používat nebudu, protože se mi to nelíbí a IDE nebude napovídat (což by teda zrovna šlo řešit snadno).
- Honza Marek
- Člen | 1664
Nezdá se mi, že by to mělo být součástí frameworku. Pokud by to chtěl někdo použít jako volitelný plugin, tak prosim, ať si dělá co chce.
- jasir
- Člen | 746
No, budu zřejmě v menšině, ale mě se to docela zamlouvá. Moc mě
nebaví vyjmenovávat třídy frameworku pomocí use (a zejména teď, kdy je na
spadnutí „zjemnění“, rozuměj „překomplikování“ namespaces, viz
RFC zde na fóru), a již jsem přemýšlel o přechod na prefixovanou verzi
(pod 5.3).
Možnost psát doplňky kombatibilní napříč verzemi je prostě
super. Jen to napovídání v IDE mě trochu pálí. Netvrdím, že to budu používat,
ale špatný nápad to rozhodně není.
Přijde mi, že argument „mě se to nelíbí“ je dost málo. Přednosti jsou
jasné. Jaké jsou zápory (kromě napovídání)?
- Honza Marek
- Člen | 1664
jasir napsal(a):
Jaké jsou zápory (kromě napovídání)?
Třeba to, že si navždy odřízneš možnost pojmenovat dvě třídy stejně. Prostě se to chová jako jeden velký namespace Nette.
- bene
- Člen | 82
Zajímavá mýšlenka, dal bych asi možnost to zapnout/vypnout.
Neprefixované interfaces mě osobně docela zaskočily, očekával bych je.
Navíc jsem narazil, že v prefix verzi 0.9.6 je neprefixovaná třída
SafeStream
. Moc se mi ani nelíbí, že jsou metody této třdy
prefixovány (stream_open
, stream_read
, …). Je
k tomu nějaký důvod?
- David Grudl
- Nette Core | 8218
bene napsal(a):
Navíc jsem narazil, že v prefix verzi 0.9.6 je neprefixovaná třída
SafeStream
.
Opraveno v 0.9.7