Jmenné prostory – Last Call Announcement
- David Grudl
- Nette Core | 8218
Tohle by předpokládalo vznik konvence, že u těchto tříd by se používal poslední díl NS (příjemná konvence, zjednodušuje use) nebo alternativně use Abc\Xyz as XyzAbc;
Nakonec i v Javě se obdoby najdou (např nebo), hlavně při větším zanoření balíčku. Což je i případ nejzanořenějšího Responses.
redhead napsal(a):
@Jan Tvrdík: vždyť ani to
Responses\
nemusíš psát, proč taky? StačíFileResponse
suse
m.
Honza říká něco jiného, že to napíše s code completition rychleji, což je obecně fakt.
- redhead
- Člen | 1313
David Grudl napsal(a):
Nakonec i v Javě se obdoby najdou (např nebo), hlavně při větším zanoření balíčku. Což je i případ nejzanořenějšího Responses.
Linky jsou stejné. Zajímal by mě i ten druhý, prosím oprav.
Špatně: Parser je to co ta třída dělá – parsuje, do pckg odebrali právě tu specializaci, ale ne to co dělá. Porovnej:
Text/Html/Parser
Parsers/Text/Html
Editoval redhead (11. 4. 2011 22:19)
- redhead
- Člen | 1313
Fakt nevidíš rozdíl mezi těma dvěma?
Tak jinak.
Latte/Interpret
Latte/Parser
Latte/Macros
---- vs -----
Interprets/Latte
Parsers/Latte
Macros/Latte
Jenom příklad. Druhý je analogický k současnému návrhu s Responses.
Odděluješ totiž logiku blbě. Specializaci tříd máš jako poslední úroveň a obecnost tříd jako první. Když to obrátíš dává to větší smysl (přesně to, co je na prvním linku).
Analogicky k prvnímu by byli Response třídy ve vlastních NS:
Responses\File\Response
Responses\Text\Response
Opět příklad. Tohle po tobě fakt nechci. V tom prvním linku to udělali proto, že měli třídy, které souvisí s jedním typem parseru. U Response tříd by tohle nemělo smysl, protože žádné „pomocné“ třídy nemají.
Abych to shrnul, třídy mají mít v sobě takový název, aby si věděl co dělají (Parser – parsuje, Response – odpovídá), když to obrátíš (File – soubor? snad jo, Text – nějaký dlouhý string?).
Na závěr snad už velice výstižně, kdybys chtěl zrušit duplicity:
GrepSeedJuiceManager - bez NS
GrepSeedJuice\Manager - správně
Managers\GrepSeedJuice - špatně (současné Response)
Editoval redhead (11. 4. 2011 22:57)
- Vojtěch Dobeš
- Gold Partner | 1316
Podle mě je rozdíl prostě v tom, že někomu se nechce dokola psát to
Managers
(respektive Responses
, whatewer), a v tom je
ta přidána hodnota – pokud nechci, nemusím, použiji use
.
A pokud by to byl mišmaš, use
nu pouze Responses
a
v kódu tuto klíčovou část názvu použiji. Název třídy musí být
v souboru stejně unikátní, takže pokud mi název File
není
jasný, mrknu na začátek souboru a přečtu si kompletní název.
EDIT:
Eh, unikly příspěvky na 3. stránce – reagoval jsem na redhead.
Takže jen maličké doplnění, a že příklad s NS
GrepSeedJuice
v předchozím příspěvku není přesný. První
dva řádky berou třídu Manager
jako unikátní typ, zatímco
3. řádek ji bere jako jednu z mnoha typů Manager
ů, takže to
nejde srovnat, nebo ne?
Úplně na závěr: vzhledem k autocomplete
to asi skutečně
není dramatické, jestli to bude nakonec tak či onak, ale přesto mi pro
Responses\File
(nebo podle mě nejlépe Response\File
)
hrají 2 hlavní výhody, a to jednak flexibilita ručního zápisu (můžu
delší i kratší verzi dle libosti), druhak důstojné vyrovnání se
sdružujícími namespace
vs. opakování stejného slova.
Editoval vojtech.dobes (11. 4. 2011 23:17)
- arron
- Člen | 464
jtousek napsal(a):
if($neco implements IResponse)
nedává smysl. Ten objekt přece nic neimplementuje, to ta třída. To bys rovnou mohl místoinstanceof
zavéstextends
. Vydíš ten nesmysl?
Je to dost off-topic, ale fakt me to neda…nechci az zase tak moc
protestovat proti instanceof
, ackoliv ho taky nepokladam za uplne
vhodne zvolene ve vztahu k interface, nicmene je objekt (trida) rozhrani
opravdu implementuje.
- Filip Procházka
- Moderator | 4668
redhead napsal(a):
GrepSeedJuiceManager - bez NS GrepSeedJuice\Manager - správně Managers\GrepSeedJuice - špatně (současné Response)
Můžu se zeptat jakože je to druhé správně? Přijde mi, že to odporuje pravidlu a),
GrepSeedJuiceManager
GrepSeedJuice\JuiceManager
já bych třídy pojmenoval takhle, a vůbec by mi nevadilo, že je tam
duplikace jednoho slova, protože když si takhle use
nu více
managerů, tak pořád budu vědět se kterým pracuju, pořád bude mít kus
názvu v namespace a navíc je to přiměřeně popisné.
Samozřejmě, když budu mít více ovocných džusíků, tak si moc
nepomůžu, tohle asi není úplně ideální případ, ale vždy se dá najít
jedno slovo, které nepřekáží, ale zkonkretizuje co hledám. Třeba takový
GrepSeedJuice\GrepJuices
mi příjde jako popisný název pro
manager, který reprezentuje, že je to z grepu (nemám duplikace džusíků
v ostatním ovocem) a že je to džus (nemám duplikace s ostatního ovoce
v džusech).
Když bych používal konvenci Namespace\TypTřídy
(GrepSeedJuice\Manager
) a chtěl po našeptávači napovědět use
nebo doplnit namespace na řádek, tak na mě vzvrací 50 managerů a to už je
rychlejší si vzpomenout, v jakém to bylo namespace, než se pročítat tím
našeptávačem.
- Honza Marek
- Člen | 1664
Přečetl jsem si (konečně) pozorně rozpis změněných tříd.
MultiRouter → Nette\Application\Routers\Multiplier
A tohle mi vcelku pobavilo. Co dělá násobitel/násobič v routách? :) Co třeba RouteCollection?
Jinak se mi to až na iterátory a AppForm vcelku líbí. Nicméně jelikož třídu iterátoru z Nette jsem jaktěživ neinstancoval, tak mi to nevadí.
- Filip Procházka
- Moderator | 4668
Zase tak bych to až nehrotil. Jenom je potřeba rozlišovat mezi
$i = new u()
$i->n = 'pepa';
echo $i->f();
a
$user = new User();
$user->name = "pepa";
echo $user->getFullname();
Chvilku jsem v nějakém záchvatu nechutě psát dlouhé názvy takhle programoval a jenom málo věci znepřehlední kód více než zkratky.
Nejvíc mě potrápilo když jsem dostal nastarosti importovat data z cizí databáze, měla sloupce pojmenované zkratkami, prvními písmeny slov. Ty názvy byly německy ⇒ německé zkratky. No hrůza a děs. Nesnáším zkratky.
- Petr Motejlek
- Člen | 293
Ta idea toho škatulkování je docela zajímavá. Osobně si myslím, že je nakonec úplně jedno, jestli se použije \Nette\Responses\Text, nebo \Nette\Responses\TextResponse, protože funkcionalita jedné varianty se dá docílit i tou druhou (s menšími či většími úpravami v kódu).
Když bych dneska někde používal TextResponse, tak jsem bych ho použil tak, jak jsem ho teď napsal. Tzn., že bych si na začátku souboru udělal use \Nette\Responses\TextResponse a to by mi stačilo, protože se mi určitě nestane, že budu mít někde během práce ještě potřebu používat nějakou jinou třídu, která by se jmenovala taky TextResponse…
Když se ale ta třída jmenovala jen Text, tak bych si s tím stejně poradil. Udělal bych si use, kde bych neměl jen přímo tu třídu, ale třeba poslední část namespace (Responses). Pak bych v kódu prostě místo TextResponse psal Responses\Text. Je to samozřejmě o dva znaky delší, než kdybych psal jen TextResponse, ale funkčně je to úplně stejné. Kdyby mi to i přesto nevyhovovalo, tak můžu použít use \Nette\Responses\Text as TextResponse a jsem tam, kde jsem byl předtím.
Za mě určitě hlas pro variantu, kdy je každá část namespace co nejkratší a ať se nic zbytečně neopakuje.
- Petr Motejlek
- Člen | 293
HosipLan napsal(a):
JJ, zkratky jsou super hnus na místech, kde nemám možnost hned vidět, co se pod nimi skrývá. Taky jsem viděl několik databází, kde byly tabulky pojmenované PRCAL, BAZ, ZAK, DOLIVY, atp. ;)
- redhead
- Člen | 1313
Můžu se zeptat jakože je to druhé správně? Přijde mi, že to odporuje pravidlu a),
GrepSeedJuiceManager GrepSeedJuice\JuiceManager
Neodporuje, je to podst. jméno a vím, že něco menežuje, protože hned vidíš Manager. Když ale narazím v kódu na třídu File bez NS, tak vůbec netuším, že jde o Response. A jsme zase u toho.
File
u spojení FileResponse
1) není podstatné
jméno, ale přídavné, 2) bez NS nepoznáš, účel třídy (File je u mě
nějaká abstrakce souboru), takže odporuje celému pravidlu a).
- srigi
- Nette Blogger | 558
Nemam moc chut vstupovat do diskusie, lebo NS povazujem za delikatnu zalezitost, ktoru rad prenecham zodpovednejsim. Ale niekde v uvode zaznelo, „aby sa s tym dobre robilo programatorom“ (alebo nieco podobne).
Za seba preto napisem iba jedno:
\Nette\Responses\Text
vs.
\Nette\Responses\TextResponse
Mne ako koncakovy by najviac vyhovovalo
\Nette\Response\TextResponse
(samozrejme konvencia napriec FW).
Nejake zdvojovanie v ceste mam na haku.
HOWG.
Editoval srigi (12. 4. 2011 11:29)
- xificurk
- Člen | 121
Pořád mi není moc jasná ta potřeba některých lidí, aby jméno třídy bez namespace byla přesným popisem. Pokud třída má mít popisný název i bez namespace, tak jednoduchým řešením je prostě namespace nepoužívat a narvat ho celý do názvu třídy :-) a to se asi shodnem, že není úplně nejlepší přístup.
Objevil se tu argument čitelnosti a srozumitelnost kódu, ale když porovnám obě varianty zápisu:
<?php
use Nette\Application\Presenter,
Nette\Application\Responses\RedirectResponse,
Nette\Application\Responses\ForwardResponse,
Nette\Application\Responses\JsonResponse;
class FooPresenter extends Presenter
{
public function actionBar()
{
if (...) $this->terminate(new RedirectResponse(...));
if (...) $this->terminate(new ForwardResponse(...));
if (...) $this->terminate(new JsonResponse(...));
}
}
?>
<?php
use Nette\Application\Presenter,
Nette\Application\Responses;
class FooPresenter extends Presenter
{
public function actionBar()
{
if (...) $this->terminate(new Responses\Redirect(...));
if (...) $this->terminate(new Responses\Forward(...));
if (...) $this->terminate(new Responses\Json(...));
}
}
?>
Tak rozhodně nelze říct, že by jedna varianta byla objektivně výrazně
lepší než druhá. Mně se subjektivně víc zamlouvá ta druhá; ještě bych
tam použil jednotné číslo Response
(podobně jako mám ve zvyku
u tabulek v databázi), ale to už je celkem maličkost.
- xificurk
- Člen | 121
Na současném návrhu se mi nelíbí:
Nette\Application\Routers\Multiplier
– Multiplier je fakt moc wtf.Nette\Application\Routers
má zavádějící název, protože tam nejsou jen routery ale i např.Route
. Možná by se hodilo to změnit naNette\Application\Routing
. (A jsem trošku na vážkách jestli tam potom nehodit i tenRoutingDebugger
.)AppForm
– o tom už toho bylo napsáno dost
- David Grudl
- Nette Core | 8218
srigi napsal(a):
Mne ako koncakovy by najviac vyhovovalo
\Nette\Response\TextResponse
Konečně pořádný argument!
redhead napsal(a):
V tom prvním linku to udělali proto, že měli třídy, které souvisí s jedním typem parseru.
Ty linky jsem spíš uváděl jako odpověď na to, že vidíš
new File
a nevíš, že to je odpověď. Totéž platí pro
new Array
u Javy. Ale nechtěl bych se dál posouvat cestou
poukazování na nějaké drobné vady v tom či onon jazyce.
Rozdílu mezi specializací a obecností rozumím, nicméně jsou situace, kdy lze obojí spojit do jednoho slova a o to jsem se pokoušel (MappingIterator → Mapper, Filter, ButtonControl → Button, …), alternativně i konvencí (Response\File). Cílem je řešit konkrétní existující problém, který se týká i Javy (nebo alespoň její dokumentace), takže nelze to všechno šmahem smést ze stolu.
xificurk napsal(a):
Nette\Application\Routers
má zavádějící název, protože tam nejsou jen routery ale i např.Route
.
Což je také router. IRouter.
- redhead
- Člen | 1313
David Grudl napsal(a):
Totéž platí pro
new Array
u Javy.
new Array
je hloupost, Array je statická třída, která
poskytuje nějaké užitečné metody pro práci s poli. V Javě hlavně není
něco jako array()
jako v PHP, ale pole se definuje např. jako
int[]
. Ale nechme Javy.
Rozdílu mezi specializací a obecností rozumím, nicméně jsou situace, kdy lze obojí spojit do jednoho slova a o to jsem se pokoušel (MappingIterator → Mapper, Filter, ButtonControl → Button, …), alternativně i konvencí (Response\File). Cílem je řešit konkrétní existující problém, který se týká i Javy (nebo alespoň její dokumentace), takže nelze to všechno šmahem smést ze stolu.
Je ale nezbytně nutné skládat dvě slova do jednoho?
FileResponse
→ File
je prostě hloupost. Co se
týká Mapper
u a Filter
u, tam to není tak
markantní, ale také to není nejlepší, nevím, že jde o iterátor.
Zavést tuto konvenci je sice hezké, ale k čemu, když pak stejně budete psát Response\File namísto FileResponse.
Já ale s dokumentaci problém nemám, mám problém se špatnými názvy tříd, které jako programátor budu používat (mnohem častěji než číst dokumentaci).
Editoval redhead (12. 4. 2011 14:46)
- Petr Motejlek
- Člen | 293
Je také dobré si uvědomit, že když se půjde směrem Responses\File místo FileResponse, tak bude taky potřeba předělat i Presentery. Dneska je pořád potřeba, aby měly suffix Presenter.
- Petr Motejlek
- Člen | 293
HosipLan napsal(a):
Což si můžeš změnit pomocí
Nette\Application\IPresenterFactory
.
Což jsem si už dávno udělal, protože se mi verze bez suffixů líbí víc… Chtěl jsem jen ostatní diskutující upozornit na to, že tu řešíme případy typu TextResponse vs Responses\Text a na Presenters\My vs MyPresenter se zapomíná a přitom už ve FW je dávno vyžadováno to suffixování. Jen jsem chtěl, aby to tu zaznělo.
P. S.: Pokud bude mít někdo zájem o tu implementaci IPresenterFactory, která pracuje s těmy namespacy, můžu ji někam bokem postnout.
- bojovyletoun
- Člen | 667
- Souhlasím se Šamanem a jedním namespacem Nette. (vážně!)
- Podle mě je smysl namespace vidět na příkladu FormContainer. Má metody addTextarea, addRadioList. -Špatně by bylo na začátku vypisovat use ..\..\Textarea;use ..\..\RadioList. Takže namespace by měly při používání nějakého balíku ušetřit práci psát absolutní cestu ..\..\ a stačí psát jen relativní cestu.
- Pak tu byl argument
new Manager
– v tu chvíli v ide vyskočí 10 managerů - Konečně
Latte\Parser
vsParsers\Latte
. Tím se nezbavíme předchozího bodu, ale je zřejmé, že správné je mít Latte pohromadě a ne ho mít roztoušené v Parsers,Lexers.
Dovolím si návrh na to jak vyřešit tento problém. Jak byste všechny ty třídy zapsali, kdyby namespace neexistovaly?
- David Grudl
- Nette Core | 8218
Uzavřel bych to.
Level-up namespaces (třídy Nette\Component a Nette\Component\Container nebo Nette\Cache a Nette\Cache\FileStorage) mají své kouzlo, rozbíjí pohled na namespaces jakožto balíčky, čímž řeší některé problémy, ale zároveň jiné vytvářejí. Protože si neumím představit, jak bych vytvářel API dokumentaci a vysvětloval dvojjakost třída-namespace, používat je nebudu.
Balíčkové odstranění duplicit (třídy Nette\Http\Request, Nette\Latte\Filter apod.) je cool, lze je dobře kombinovat s parciálním namespace (use Nette\Http + new Http\Request) a neporušují názvosloví tříd, používat je budu.
Sdružující namespaces (např. Responses, Routers, Storages, …) zjednodušují orientaci v API dokumentaci (bez nutnosti zavádět speciální anotace) a také zjednodušují psaní kódu v editoru s code complete, proto je používat budu (výjimkou jsou výjimky). Pro pojmenování se mi o něco přirozenější jeví množné číslo.
Sdružující odstranění duplicit (např. Responses\File,
Storages\File) je bez zavedení speciálních konvencí nesrozumitelné, proto
je používat nebudu. Pochopitelně třídy s plnohodnotným názvem nebudou
mít koncovku (RouteRouter, ButtonControl,
MapperIterator).
- Petr Motejlek
- Člen | 293
@David Grudl: Líbí se mi to. Jen zamáčknu slzu za Responses\File a Cache\Storages\File. Přijde mi hezčí dostat opkaující se věci do namespace, než do názvu třídy, ale (asi se budu opakovat) nakonec je jedno, jak to bude, protože jde jen o to si zvyknout.
Hlavně, aby se ta stejná konvence dodržovala všude, aby i někdo, kdo třeba prvně začne programovat a vezme si na pomoc Nette, tak ať je rovnou veden ke standardizaci ;).
- Jan Tvrdík
- Nette guru | 2595
Teď už chybí jen přejmenovat AppForm
na Form
a
Debug
na Debugger
(lépe vyjadřuje podstatu).
U přejmenování AppForm
je hlavní a pokud vím jediný
problém v tom, že začátečníci budou mít tendenci vytvářet instance
Nette\Forms\Form
. Napadá někoho, co s tím?
Editoval Jan Tvrdík (12. 4. 2011 21:01)
- Jan Tvrdík
- Nette guru | 2595
Ještě přemýšlím nad vytvořením pevného aliasu
Nette\Debug
/ Nette\Debugger
pro
Nette\Diagnostics\Debugger
. Co si o tom myslíte? Psát
Nette\Diagnostics\Debugger::barDump(...)
je šílenost. Řešit to
lze také povinným uvedením use Nette\Diagnostics\Debugger
do
každého souboru nebo vytvořením globálních funkcí dump
a
barDump
(resp. d
a bd
), což mi připadá
asi jako nejlepší varianta.
Jak hodláte dumpovat vy?
- jtousek
- Člen | 951
dump
přece existuje. Jsem rozhodně spíš pro vytvoření
globální fce než aliasu, ten to zas o tolik nezkrátí.
S Davidovým rozhodnutím jsem rovněž spokojen. :-)
Jan Tvrdík napsal(a):
Teď už chybí jen přejmenovat
AppForm
naForm
aDebug
naDebugger
(lépe vyjadřuje podstatu).
Přesně tak. Doufám, že se tyto dvě změny do finální verze dostanou.
Editoval jtousek (12. 4. 2011 20:34)
- David Grudl
- Nette Core | 8218
redhead napsal(a):
Uzavřel jsi to hezky. S tímhle jsem nanejvýš spokojen.
Díky za oponenturu.
FYI: Dialog. okno „Máte rozepsaný příspěvek ..“ se mi zobrazí i při pokusu o odeslání příspěvku tlačítkem
Poslat
:)
V jakém browseru?
- Filip Procházka
- Moderator | 4668
Honzo, já to řeším právě těmi zkratkami d()
a
bd()
, plus teď nově i wc()
https://gist.github.com/915330, což
mi začalo připadat vtipné až teď :D
- jtousek
- Člen | 951
jj taky používám podobný zkratky. Např. fci ml(), která mi pošle e-mail s hlášením. Hodí se mi v situaci kdy vím, že by něco nastat i když by teoreticky mohlo a není to taková chyba na vyhození výjimky. Potom si na mejlu zkontroluju co se stalo a jestli je vše ok a časem to odstraním.
- David Grudl
- Nette Core | 8218
To je nápad Kravča, super.
Třídy z prostoru Nette umístím nejspíš do adresáře
common
(s malým písmenkem).
- Vojtěch Dobeš
- Gold Partner | 1316
Jen maličkost: Nette\Application\Routers\Namespace
není
přípustné, ne? U MultiRouter
u.
- Patrik Votoček
- Člen | 2221
Jan Tvrdík napsal(a):
Jak hodláte dumpovat vy?
už hodně dlouho používám globální barDump
(dump
je přímo v Nette)
Koukám po pár dnech jak se to tu posunulo a s výsledkem nelze než
souhlasit. Teď už jen aby se to objevilo v repu
Už to v repu je ale ne v nightly-build balíku v sekci download :-)
- juzna.cz
- Člen | 248
U commitu je odkaz na https://doc.nette.org/updating-2-0, coz ale neexistuje. Je uz dokumentace k prechodu sepsana na jine url, nebo se na tom teprve pracuje?
Programatori si ted mohou dat pohov a ke slovu se dostavaji dokumentatori – upravit veskerou existujici dokumentaci na nove namespaces :) To bude jeste sranda.
- David Grudl
- Nette Core | 8218
Stránka zatím není. Dokumentaci jsem ti zatím neposílal, protože to vázlo právě na namespaces.
- Patrik Votoček
- Člen | 2221
Začal jsem převod a tak sem budu psát na co narazím…
- proč není
Nette\Application\IRouter
vNette\Application\Routers
? - proč není
Nette\Forms\IControl
vNette\Forms\Controls
? - nebylo by lepší kdyby
User
aIUser
byly vNette\Security
?
EDIT: pro rejpaly proč jsem to neřešil před pushnutím: protože mám raději praktickou zkušenost než jen teorii.
- Patrik Votoček
- Člen | 2221
1 + 2 ok beru ale 3 protoze: „User authentication and authorization.“ případně udělat ze Security ACL.