Experimentální aliasy tříd frameworku Nette\Object → NObject

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

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?

  1. Programátorům se dostává do rukou možnost psát doplňky fungující pod 5.3 a 5.2 verzí
  2. 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
  3. pokud se tato technika osvědčí, lze ji využít také pro 100% zpětně kompatibilní přechod na jemnější jmenné prostory
  4. teoreticky by aliasy nemusely být ve tvaru NTrida, ale třeba Nette\Trida nebo N\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
+
0
-

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

Majkl578
Moderator | 1364
+
0
-

Ani mně se to nelíbí.

Honza Marek
Člen | 1664
+
0
-

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.

Patrik Votoček
Člen | 2221
+
0
-

Nelíbí se mě to ale nikdo mě nenutí to používat a nějak mě to nepřekáží…

paranoiq
Člen | 392
+
0
-

ad 1. kdo chce využít plugin napsaný pro jinou verzi může si sám jednoduše potřebné aliasy vytvořit

(já například v jednom novém projektu spokojeně používám namespacovanou Dibi)

Editoval paranoiq (24. 11. 2010 12:01)

arron
Člen | 464
+
0
-

Moznost prechodu z php 5.2 na php 5.3 pouhym nahranim knihoven mi prijde jako killer-feature :-)

jasir
Člen | 746
+
0
-

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

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.

jasir
Člen | 746
+
0
-

Já si to neodříznu, framework si to odřízne pro své třídy. To je ale obecně problém prefixovaného Nette a s tímto to nesouvisí, ne? Ale beru…

bene
Člen | 82
+
0
-

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?

Aurielle
Člen | 1281
+
0
-

bene: ano, důvod to má, jelikož metody třídy SafeStream se nevolají přímo, ale pracuje se s nimi přes klasické PHP funkce.

David Grudl
Nette Core | 8218
+
0
-

bene napsal(a):

Navíc jsem narazil, že v prefix verzi 0.9.6 je neprefixovaná třída SafeStream.

Opraveno v 0.9.7

knyttl
Člen | 196
+
0
-

Mně se to líbí. Například, pokud používám Nette\Web\Html::el několikrát na jednom řádku, tak je to pak zbytečně dlouhé a hlavně otravné.

grey
Člen | 94
+
0
-

knyttr wrote:

Mně se to líbí. Například, pokud používám Nette\Web\Html::el několikrát na jednom řádku, tak je to pak zbytečně dlouhé a hlavně otravné.

tak od toho máš v php use

David Grudl
Nette Core | 8218
+
0
-

Tuhle vlastnost jsem nakonec z frameworku odstranil.