Adresarova struktura Feature-Re-Request (#2)
- Honza Marek
- Člen | 1664
David Grudl napsal(a):
Zaujalo mě, kolik lidí tu kombinuje různé loadery pro různé knihovny. Vždyť RobotLoader je právě lékem na nutnost kombinovat více loaderů.
Pokud chceš načítat RobotLoaderem něco většího (třeba Doctrine nebo něco Symfony), tak to znamená příšerné zpomalení.
- David Grudl
- Nette Core | 8218
Zkusil jsem si nahrát do skeletonu celé Symfony a Zend (37 MB) a první spuštění trvalo 30s – což je samozřejmě neúnosně dlouho. Nicméně každý další rebuild pak trvá asi 2,5 sekundy, což mi připadá úplně v poho.
Ale je možné, že jsem jen zhýčkaný rychlým diskem a jinde to může fakt trvat…
- Elijen
- Člen | 171
David Grudl napsal(a):
ad PSR-0: to je jeden z důvodů, proč má třeba Zend Framework (a zejména Magento) obrovské problémy s výkonností.
V čem spočívá ono zpomalení? Vždyť díky dodržování standardu loader přesně ví kam pro danou třídu sáhnout a nepotřebuje nic načítat.
Jinak k tématu: nemálokrát jsem také narazil na „zrádnou“ adresářovou strukturu Nette a myslím, že je dobrý nápad, aby názvy souborů/složek korespondovali s názvy namespace/tříd. (proti výjimce u složky common nic nemám). Nicméně pokud existuje dobrý důvod (který zatím neznám), proč tomu tak není, tak má David pravdu, že slepé dodržování standardu neni zrovna to pravé ořechové.
Editoval Elijen (3. 1. 2012 1:50)
- Elijen
- Člen | 171
hrach napsal(a):
Přečti si k tomu ty diskuze, at se tady porad neresi to samy.
Cetl jsem toto a vlakno linkovane v uvodnim postu + cast prispevku na root.cz ale prilis padnych argumentu nezaznelo (spise jen zbytecny flame).
- cim vic souboru nactes → pomalejsi aplikace;
- psr 0 → vice souboru = kazda vyjimka vlastni soubor, atp.
- nette v 95 % pripadu psr 0 dodrzuje, vyjimky jsou vyjimky a common.
Adresarova struktura Nette je tak trochu citit premature optimization. Nemyslim si, ze by vycleneni vyjimek do zvlastnich souboru nejak rapidne zpomalilo aplikaci. Precijen vyjimek se v zivotnim cyklu aplikace zas tolik nezavola. (od toho se jmenujou „vyjimky“ :-))
Co se tyce ostatnich trid: Chapu, ze nektere tridy nemohou existovat bez jinych a jsou natolik pribuzne, ze ma opravdu smysl je dat do jednoho souboru. Jak casto se toto ale stava? Natolik, ze by striktni dodrzovani PSR-0 meritelne zpomalilo aplikaci? Nemyslim si. Navic nemela by pripadne zpomaleni aplikace spise resit nejaka forma cachovani?
Pak zbyva slozka common, pro kterou by asi bylo idelani vytvorit namespace Nette\Common a slozku prejmenovat na „Common“, coz by ale byl BC break :-/
Editoval Elijen (3. 1. 2012 13:34)
- Jan Tvrdík
- Nette guru | 2595
Elijen wrote:
Pak zbyva slozka common, pro kterou by asi bylo idelani vytvorit namespace Nette\Common a slozku prejmenovat na „Common“, coz by ale byl BC break :-/
Hlavně bys nasral všechny, kterým se nechce psát
Nette\Common\Image
apod.
Co se týče výkonnosti, tak osobně bych uvítal něco mezi normální a
minifikovanou verzi. Protože jsou soubory, které potřebuji (téměř) vždy
jako třeba Debugger
, Presenter
,
Application
… ale pak je i spousta souborů, které se
používají občas a je zbytečné je načítat pokaždé, k čemuž při
použit minifikované verze pochopitelně dochází.
- Nox
- Člen | 378
Co se týče výkonnosti, tak osobně bych uvítal něco mezi normální a minifikovanou verzi. Protože jsou soubory, které potřebuji (téměř) vždy jako třeba
Debugger
,Presenter
,Application
… ale pak je i spousta souborů, které se používají občas a je zbytečné je načítat pokaždé, k čemuž při použit minifikované verze pochopitelně dochází.
Přesně! Minified Nette mi nevycházelo moc dobře, protože sice je to 1 soubor, ale zase to znamená, že se musí nevyhnutelně přechroustat celé Nette, takže je to nakonec výrazně nejpomalejší řešení (plus ta RAM).
Taky bych bral něco, kde by se načítaly bloky s částmi, které budou nejpravděpodobněji použity/použity dohromady … o level výš by asi byla inspirace NotORM cachováním (select ??? from) – že by se vytvářela jakási definice toho, co se v dané aplikaci nejvíc pouští dohromady a podle tohodle předpisu by se zkonstruovala takovéto optimalizované cache bloky
- Filip Procházka
- Moderator | 4668
Myslím, že by spíš stačilo jenom jednotlivé části Nette sloučit do souborů šablony a latte k sobě, formuláře s prvky k sobě, celý application, … :)
Nápad se mi velice líbí, co na to Davíd? :)
Editoval HosipLan (3. 1. 2012 18:10)
- Patrik Votoček
- Člen | 2221
Nevím ale pokud budu mít na serveru 30 projektů a nastavím vše tak aby používali jedno minifikované nette které bude navíc v nějaké opcode cache. Tak to musí bejt fofr ne (nebo mě něco uniká)?
PS: je fakt že to asi na sdíleném hostingu moc nepořeším… :-/
- David Grudl
- Nette Core | 8218
Elijen napsal(a):
Adresarova struktura Nette je tak trochu citit premature optimization.
Ano, kdyby to tak bylo kvůli rychlosti, šlo by o premature optimization, nicméně důvodem není rychlost, ale přehlednost a pohodlí. (Tj. jsme v naprostém sporu ;-)
- Jsem přesvědčen, že rozdělení
Nette\common\exceptions.php
do 15 souborů způsobí jen a pouze horší orientaci v adresáři. - Jsem přesvědčen, že přejmenování
Nette\Object
naNette\Common\Object
jen a pouze ztíží život programátorům (a teď nemám na mysli otázku kompatibility).
Zabordelit si adresář a ztížit život, jen abych byl kompatibilní s nějakým PSR-0, to mi připadá jako premature optimization for PSR-0.
BTW, neštve vás, že jsem v API rozdělil zvlášť výjimky, rozhraní a ostatní třídy? Dokážete se v tom teď zorientovat? ;-)
- David Grudl
- Nette Core | 8218
Při použití opcode cache (například APC) je minifikovaná verze řádově rychlejší než plná. Bez cache může být teoreticky pomalejší.
- pekelnik
- Člen | 462
Podle mě kompatibilita s PSR-0 není zbytečná.
Část vyjímek by mohla být v namespace
Nette\Common\Exceptions
, část by se mohla přestěhovat ke
komponentám ke kterým patří.
Pojďmě se na ty vyjímky mrknout zblízka:
Vyjímka | Navrhovaný namespace | Použití |
---|---|---|
ArgumentOutOfRangeException |
Nette\Common\Exceptions |
ve frameworku se vůbec nepoužívá |
DeprecatedException |
Nette\Common\Exceptions |
Config\Configurator |
DirectoryNotFoundException |
Nette\IO\Exceptions |
Diagnostics\Debugger , Diagnostics\Logger ,
Caching\Storages\FileStorage , Loaders\RobotLoader |
FatalErrorException |
Nette\Common\Exceptions |
Diagnostics\Debugger , Utils\LimitedScope |
FileNotFoundException |
Nette\IO\Exceptions |
Templating\FileTemplate , Database\Connection ,
Config\Loader , Mail\Message ,
Utils\MimeTypeDetector , Application\UI\Presenter |
IOException |
Nette\IO\Exceptions |
Config\Loader , Templating\Template |
InvalidArgumentException |
Nette\Common\Exceptions |
ve frameworku se používá téměř všude |
InvalidStateException |
Nette\Common\Exceptions |
ve frameworku se používá téměř všude |
MemberAccessException |
Nette\Common\Exceptions |
Iterators\CachingIterator , Environment ,
Security\Identity , Image ,
Object , ObjectMixin |
NotImplementedException |
Nette\Common\Exceptions |
ComponentModel\Component , Forms\Container ,
Database\Drivers\MsSqlDriver ,
Database\Drivers\OciDriver , Database\Drivers\PgSqlDriver |
NotSupportedException |
Nette\Common\Exceptions |
ve frameworku se používá ve větším než malém množství |
OutOfRangeException |
Nette\Common\Exceptions |
Utils\ArrayList |
StaticClassException |
Nette\Common\Exceptions |
ve frameworku se používá ve větším než malém množství |
UnexpectedValueException |
Nette\Common\Exceptions |
ComponentModel\Container , DI\ContainerBuilder ,
Application\UI\Control |
Poznámky:
- Ostatní třídy kromě vyjímek v adresáři
common
s vyjímkouNette\Object
podle mě není problém poslat pod namespaceCommon
– dalo by se diskutovat o jejich rozčlenění do jiných namespace, ale to není předmětem tohoto vlákna. - Například takový
Nette\Object
bych si dovedl dobře představit v rootu – argumenty o zabordelení root adresáře jsou podle mě liché. - Argumenty proti prodlužování namespace sice chápu ale nesouhlasím s nimi.
- Nerad bych viděl
Nette\Nette\Whatever
. - Určitě by nebylo dobré vyjímky jen tak naházet do root adresáře.
Editoval pekelnik (4. 1. 2012 7:25)
- Elijen
- Člen | 171
David Grudl napsal(a):
Ano, kdyby to tak bylo kvůli rychlosti, šlo by o premature optimization, nicméně důvodem není rychlost, ale přehlednost a pohodlí. (Tj. jsme v naprostém sporu ;-)
Bohuzel to tak neprijde vsem. Chapu, ze je tezke se zavdecit kazdemu, ale prave od toho (mimo jine) jsou tu standardy.
Jsem přesvědčen, že rozdělení Nette\common\exceptions.php do 15 souborů způsobí jen a pouze horší orientaci v adresáři.
Proc nemit pro vyjimky vlastni namespace Nette\Exceptions a dat je do vlastniho adresare?
Jsem přesvědčen, že přejmenování Nette\Object na Nette\Common\Object jen a pouze ztíží život programátorům (a teď nemám na mysli otázku kompatibility).
V cem ono ztizeni zivota zpociva?
Tak premyslim, zda ma na toto tema vubec cenu diskutovat. Jednak tu hraji velkou roli osobni preference kazdeho jednotlivce a druhak pouhe presunuti/prejmenovani souboru/adresaru asi nic moc nevyresi, bylo by treba upravit namespaces a to by vedlo ke spouste BC breakum. (a nasranym uzivatelum)
Editoval Elijen (4. 1. 2012 10:55)
- Filip Procházka
- Moderator | 4668
Nema cenu diskutovat. Tohle se řešilo několik měsíců zpátky, svoji šanci jste propásli. :P
Editoval HosipLan (4. 1. 2012 12:28)
- Patrik Votoček
- Člen | 2221
David Grudl napsal(a):
BTW, neštve vás, že jsem v API rozdělil zvlášť výjimky, rozhraní a ostatní třídy? Dokážete se v tom teď zorientovat? ;-)
To je běžné chování Apigenu 2.x ne? Mě se v tom lépe orientuje… :-)
Edit: jen by se v https://api.nette.org mohli zapnout i @internal metody a třídy. Celkem často narážím na to že se k nim prostě nedoklikám. :-(
- Jan Tvrdík
- Nette guru | 2595
Patrik Votoček wrote: jen by se v https://api.nette.org mohli zapnout i @internal metody a třídy.
Ono dává smysl, že tam nejsou, ale hodilo by, aby David generoval i někam bokem (pro nás šťouravé) kompletní verzi. Řeším to tak, že používám API dokumentaci k jednotlivým projektům, na kterých pracuji a ta obsahuje i dokumentaci k Nette.
- Patrik Votoček
- Člen | 2221
V Apigenu 2.x mají internal třídy a metody vlastní class (v defaultním template je nastaven s méně výraznýmy barvamy aby se dal lehce přehlédnout).
Řeším to steně ovšem pokud s někým řeším něco třeba na Jabber-roomu a potřebuju odkázat tak mám problém.
- David Grudl
- Nette Core | 8218
Je ještě nějaké téma, které se tu neotevřelo? ;-)
BTW jediné, o čem má smysl diskutovat, je zda přejmenovat adresář common na Nette, vše ostatní je neprůchozí ;-)