Jmenné prostory – Last Call Announcement
- Semik
- Backer | 135
David Grudl napsal(a):
Jsem pro
Nette\Application\Responses\ForwardingResponse
. Sám to používám, když mám skupinu tříd, které dělají podobnou činnost (responses, Iterators, …).Jsem pro
Nette\Application\Responses\Forward
:-)
Není to proti pravidlu a) ?
Přijde mi to stejné jako:
chybně: Nette\Application\Responses\Download – nelze dovodit, že Download je odpověď
Edit: Byl jsi rychlejší :-)
Editoval Semik (7. 4. 2011 8:40)
- kravčo
- Člen | 721
Začínam mať pocit, že si z nás robíš prdel :) go on!
FunctionReflection
→
Nette\Reflection\Function
– toto asi nepôjde, škoda, toto nám
kazí viaceré jednoslovné pomenovania…
namespace Nette\Reflection;
class Function extends \ReflectionFunction // PHP Parse error: ...
{
}
Myslím, že Nette\Application\Responses\File
a jemu podobné
štruktúrovanie je síce nejednoznačné ale verím, že používa namespaces
veľmi dobre. Mám k odpovediam ľahký prístup pomocou
use Nette\Application\Responses;
, a následne píšem
Responses\File
. Napíšem sa oveľa menej ako v predošlej
verzii.
Odbočím: nepripadá vám to množné číslo umelé? Nechceme predsa
kategorizovať, ale dať triedam čo možno najkratší názov, pričom budú
oddelené funkčné celky.
use Nette\Application\Response; return new Response\File
.
Na druhej strane, pokiaľ to nebude celoplošné, bude to
WTF (prečo táto trieda z Nette\Responses\
nemá
suffix Response ale GenericRecursiveIterator
z
Nette\Iterators\
áno? podľa čoho viem, že tam suffix je alebo
nie je? A prečo je to rôzne aj v samotnom Nette\Iterators\
?
v budúcnosti bežný používateľ Nette nebude poznať pravidlo
a))
tipy:
AutoLoader
→ Nette\Loader\Nette
:)
RenderResponse
→ Nette\Application\Response\Text
RoutingDebugger
→
Nette\Application\Routing\Debugger
Debug
→ Nette\Debugger
DebugPanel
→ Nette\Debugger\DefaultPanel
IDebugPanel
→ Nette\Debugger\IPanel
DebugHelpers
→ Nette\Debugger\Helpers
na záver:
IComponent
→ Nette\IComponent
Component
→ Nette\Component
IComponentContainer
→ Nette\Component\IContainer
ComponentContainer
→ Nette\Component\Container
A… som jediný, ktorému pripadá namespace DI
úplne mimo?
Doplnené:
namespace Nette\DI
zrušiť (pretože mne príde čiste
kategorizačné)
Cache
→ Nette\Cache
ICacheStorage
→ Nette\Cache\IStorage
ICacheJournal
→ Nette\Cache\IStorageJournal
V duchu mojich predošlých tvrdení by mohlo byť i namespace
Nette\Exception
:
InvalidStateException
→
Nette\Exception\InvalidState
NotImplementedException
→
Nette\Exception\NotImplementedFeature
NotSupportedException
→
Nette\Exception\NotSupportedFeature
DeprecatedException
→
Nette\Exception\DeprecatedFeature
MemberAccessException
→
Nette\Exception\InvalidMember
FatalErrorException
→ Nette\Exception\FatalError
… čo ale robí problém pri výnimkách hlbšie v štruktúre.
… Takže predsa len zametáme, akurát do Nette\Utils
:)
na prvý pohľad je zdanlivá nekonzistentnosť v Nette\DateTime
a Nette\Utils\String
, lenže je treba povedať, že sa jedná
o triedy s dosť odlišnou funkcionalitou. Kým Nette\DateTime
objektovo reprezentuje dátum a čas, Nette\Utils\String
reprezentuje súbor funkcií na prácu so stringami…
viem, že sa to už raz nedoriešilo,
ale naozaj by nešlo Nette\Utils\String::<func>()
→
Nette\String\<func>()
?
Editoval kravčo (7. 4. 2011 11:48)
- jtousek
- Člen | 951
- Ty iterátory se mi nyní zdají poněkud podivné. Někdy v nich je slovo Iterator, jindy zase ne. Mělo by se to sjednotit.
- Myslel jsem, že rušíš ingové tvary (
CachingIterator
,Nette\Latte\CachingHelper
,Nette\Caching\...
). Nebo to slovo Caching jako jediné zůstane takto? AppForm
→Form
+1, Form a AppForm jsem v jednom skriptu v životě nepoužil a nevidím k tomu žádný rozumný důvod. Nijak to tedy neodporuje pravidlu c).RenderResponse
→Nette\Application\Responses\TextualOutput
se mi ale opravdu nelíbí. Když už takNette\Application\Responses\String
(neboNette\Application\Responses\Text
).Nette\Application\UI\PresenterLink
bych zkrátil naNette\Application\UI\Link
, k čemu tam je to slovo Presenter? Odkazovat mohu přece i na komponentu, ne?Debug
→Debugger
+1, IMHO to lépe vystihuje podstatu.LimitedScope
→Nette\LimitedScope
je v tom postu 2×. ;-)- Nemělo by se celé
Latte
přesunout doTemplates
? Bez šablon přece k ničemu není, nebo ano? - Pokud čistíme jmenný prostor Nette tak
Nette\Html
→Nette\Utils\Html
aNette\DateTime
→Nette\Utils\DateTime
.
EDIT1:
kravčo napsal(a):
Odbočím: nepripadá vám to množné číslo umelé? Nechceme predsa kategorizovať, ale dať triedam čo možno najkratší názov, pričom budú oddelené funkčné celky.
use Nette\Application\Response; return new Response\File
.
S tím naprosto souhlasím. :-)
tipy:
AutoLoader
→Nette\Loader\Nette
:)
RenderResponse
→Nette\Application\Response\Text
RoutingDebugger
→Nette\Application\Routing\Debugger
Debug
→Nette\Debugger
DebugPanel
→Nette\Debugger\DefaultPanel
IDebugPanel
→Nette\Debugger\IPanel
DebugHelpers
→Nette\Debugger\Helpers
S tou RenderResponse
souhlasím. Ale ten zbytek… to myslíš
vážně? :-)
EDIT2:
Nette\Reflection\FunctionParameter
– jaký význam zde má to slovo function? Může to být stejně dobře metoda.Nette\Reflection\Parameter
si stejně nikdo s ničím splést nemůže.
Editoval jtousek (7. 4. 2011 10:29)
- Honza Marek
- Člen | 1664
kravčo
Taky mi všude ty množný čísla nějak rozčilujou… Na DI se ti nezdá název nebo to, že to existuje? Pokud se to týká názvu, taky bych tam nedával zkratku, ale napsal to v plné verzi DependencyInjection.
- kravčo
- Člen | 721
Honza Marek napsal(a):
Na DI se ti nezdá název nebo to, že to existuje?
To že to existuje, doplnil som svoj pôvodný príspevok
- David Grudl
- Nette Core | 8218
Vím, že poslední návrh vypadá jako úlet, ale zdá se mi to jako úlet dobrým směrem. Stále dodržuje pravidlo a) s podmětem (tj podstatné jméno v 1. pádě) a vede ke kódu, který je jazykově přirozený (presenter jako odpověd poslal soubor vs. Presenter poslal souborodpověď vs. Presenter poslal staženíodpověď) a šikovně dokáže pracovat s use, viz kravcovo Response\File nebo třeba Latte\Filter či Http\Request.
Chce to jen doladit detaily a bude to mega fasa coool!
- Filip Procházka
- Moderator | 4668
To je otřesné :) Nechceš si na to přemýšlení vzít ještě pár týdnů a pak založit „Last Last Call“? Při psaní názvu třídy od půl namespace skřípu zuby. Strašně mi to vadí, buď celý namespace, nebo jenom třída.
Já si vždycky myslel, že třída se má jmenovat podle toho co dělá, nebo představuje. Není to tak dávno, co jsi se urputně bránil stylu Symfony. Když už teda podléháš, tak alespoň podléhej většině. https://github.com/…pping/Driver Většina to dělá takhle (a teď nemám na mysli to, že název třídy odpovídá složce, to v dobách RobotLoaderu není vyžadováno)
./Doctrine/ORM/Mapping/Driver/XmlDriver.php => Doctrine\ORM\Mapping\Driver\XmlDriver;
Byť mi přijde, že popisnější by to bylo v namespace Drivers. Voni ti kluci co napsali Symfony (nebo Doctrine, …) taky nebudou úplně vypatlaní…
Editoval HosipLan (7. 4. 2011 14:59)
- Honza Marek
- Člen | 1664
Názvy typu Nette\Response\File, Nette\Latte\Filter, Nette\Http\Request apod. se mi líbí. Kdysi jsem se tady na podobných snažil ukázat, že podrobnější namespacy nemusí nutně vést k více psaní. Ale nevim, jestli jsem byl onehdá úplně pochopen.
- Ondřej Mirtes
- Člen | 1536
Response\Text je nesmysl, ve mně to evokuje odezvu s typem
text/plain
. Nechal bych to tedy jako Render
, protože
je v ní echo
.
- bojovyletoun
- Člen | 667
Pro mě je důležitý, aby název třídy vystihoval, o co jde, takže RenderResponse je OK, ale Text ne. Na začátku vypíšu use use use a dál mám klid a jsem rád, když názvy tříd jsou popisné
- David Grudl
- Nette Core | 8218
HosipLan napsal(
teď nemám na mysli to, že název třídy odpovídá složce, to v dobách RobotLoaderu není vyžadováno)
Jak se říká, jen blbec nemůže změnit názor, avšak v tomto případě vůbec nevím, co se snažíš říct. Buď konkrétní.
- David Grudl
- Nette Core | 8218
Ještě aby nedošlo ke zmatení. Příklad:
- ArrayIterator → SPL\Iterator\Array ŠPATNĚ
- FilterIterator → SPL\Iterator\Filter DOBŘE
Vnímáte ten rozdíl?
- Filip Procházka
- Moderator | 4668
Se změnou názora máš samozřejmě pravdu Davide. Nejspíš jsem spatlal moc myšlenek, do moc málo vět :) Tvrdím, jako Bojovyletoun, že název třídy by měl být dostatečně popisný (!= zbytečně dlouhý), část názvu by měla být v namespace, ale funkce třídy (request) a odlišení od ostaních funkcí (http) by měla být v názvu. Namespace nepovažuju za název třídy, ale za zařazení nějaké logiky do balíku/skupiny podobných/souvisejících funkcí.
V logu od 15:37 do 16:14 je to rozepsané do víc než dvou vět.
Editoval HosipLan (7. 4. 2011 17:43)
- Jan Tvrdík
- Nette guru | 2595
David Grudl wrote:
Ještě aby nedošlo ke zmatení. Příklad:
- ArrayIterator → SPL\Iterator\Array ŠPATNĚ
- FilterIterator → SPL\Iterator\Filter DOBŘE
Vnímáte ten rozdíl?
Ne. (Třída se nemůže jmenovat Array
, ale to předpokládám,
že není ten důvod, proč je první varianta špatná.)
- Vojtěch Dobeš
- Gold Partner | 1316
Tyhle „rozebrané“ namespacy
a krátké názvy tříd podle
mě využívají to nejlepší, co mohou jmenné prostory přinést. Buď
prostě vím, o čem daná třída, kterou píšu, je a co za další třídy
vyžaduje, a klidně si nechám krátký název (klidně i ten
Text
/Render
nebo cokoliv), nebo mi to přijde
příliš zmatené, a zcela bez problémů mohu použít
Response\Text
– popisné, přehledné a zároveň flexibilní
jak sviňa.
Mně namespace
určitě přijde jako součást názvu
třídy – s tím, že mohu pomocí jednoho řádku na začátku skriptu
používat kratší verzi toho názvu. Přijde mi, že
kategorizační/balíčkovací funkce je určitě možnost, jak jmenné prostory
využít, ale až druhotná – prvotní je pohodlnější (kratší) zápis
názvu třídy.
- paranoiq
- Člen | 392
zapisovat namespace od půlky mě doteď nenapadlo a docela se mi to líbí (Response\File, Latte\Filter, Http\Request). názvy jsou tak popisné, jak je komu libo. zkracovači si to můžou zkrátit. ti co se v tom chtějí vyznat napíšou poslední dvě části názvu. neporušuje se pravidlo duplicity. mezi FileResponse a Response\File je rozdíl jediného znaku. samá pozitiva a jistoty…
upozornění: nejde to dohromady s množným číslem u katalogizačních ns: Driver\Mysql je určitě lepší než Drivers\Mysql
Editoval paranoiq (7. 4. 2011 20:02)
- David Grudl
- Nette Core | 8218
- ArrayIterator → SPL\Iterator\Array ŠPATNĚ
- FilterIterator → SPL\Iterator\Filter DOBŘE
Vnímáte ten rozdíl?
Ne.
Jak nazvat iterátor, který filtruje prvky? Co to je? Filtr? Jasně, je to Filtr.
Jak nazvat iterátor, který iteruje nad prvky pole? Je to pole? To stěží, je to iterátor. Je to stále iterátor nad pole, ArrayIterator.
- David Grudl
- Nette Core | 8218
kravčo napsal(a):
FunctionReflection
→Nette\Reflection\Function
– toto asi nepôjde, škoda, toto nám kazí viaceré jednoslovné pomenovania…
Class a Function to kazí, co s tím?
*Odbočím: nepripadá vám to množné číslo umelé?
Hodně mi to připomíná (nerozhodný) problém jednotných a množných čísel u DB tabulek.
podľa čoho viem, že tam suffix je alebo nie je? A prečo je to rôzne aj v samotnom
Nette\Iterators\
? v budúcnosti bežný používateľ Nette nebude poznať pravidlo a))
Někdy prostě neexistují jednoslovné názvy jako
Button, Checkbox
a musí se použít přídavné jméno +
podstatné jméno, jako HiddenField
. Ten přitom nikomu nevadil.
Takže v tom nevidím tak zásadní problém. BTW: Lze nazvat RecursiveIterator
jako Recursor
?
Cache
→Nette\Cache
ICacheStorage
→Nette\Cache\IStorage
ICacheJournal
→Nette\Cache\IStorageJournal
Spíš bych držel jedno téma vždy v jednom NS. I kvůli dokumentování.
Případ Nette\Cache
a podobných se dá považovat za jakousi
default třídu NS, takže bych spíš uvažoval jen o vytváření
jejich pevných aliasů.
V duchu mojich predošlých tvrdení by mohlo byť i namespace
Nette\Exception
:
InvalidStateException
→Nette\Exception\InvalidState
Tady (a dalo by se to říct i v případě iterátorů) bude vhodnější
dodržet konvenci PHP, ačkoliv logika věci by byla pro
Nette\Exception\InvalidState
(s rezervou: nevím, zda lze brát
NotSupported nebo Deprecated za podmět).
… Takže predsa len zametáme, akurát do
Nette\Utils
:)
na prvý pohľad je zdanlivá nekonzistentnosť vNette\DateTime
aNette\Utils\String
.
Ano, trošku váhám se zametáním. Nicméně zrovna
Nette\Utils\String
je úplně špatně pojmenovaná třída a
Nette\Utils\StringUtils
je nepěkné, takže se stejně vrátím k
Nette\StringUtils
. BTW utils (užitečnosti) je asi lepší než
tools (nástroje).
- Pokud čistíme jmenný prostor Nette tak
Nette\Html
→Nette\Utils\Html
aNette\DateTime
→Nette\Utils\DateTime
.
V případě Html to zvažuju, ale DateTime mi nesedí. Pokud čtu
Nette\Utils\cosi
jako cosiUtil
, tak dělat objekt
DateTimeUtil mi přijde divné, je to přece ryzí DateTime.
HosipLan napsal(a):
Tvrdím, jako Bojovyletoun, že název třídy by měl být dostatečně popisný (!= zbytečně dlouhý), část názvu by měla být v namespace, ale funkce třídy (request) a odlišení od ostaních funkcí (http) by měla být v názvu.
Bavíme se o velmi tenké hranici, mezi odlišením v rámci NS nebo odlišením v rámci všeho. Docela mi dostačuje odlišení v rámci NS.
vojtech.dobes napsal(a):
Tyhle „rozebrané“
namespacy
a krátké názvy tříd podle mě využívají to nejlepší, co mohou jmenné prostory přinést.
Taky se mi zdá. Buď lze s NS bojovat, nebo je šikovně (vy|zne)užít.
- jtousek
- Člen | 951
Nicméně zrovna Nette\Utils\String je úplně špatně pojmenovaná třída …, takže se stejně vrátím k Nette\StringUtils
Proč je Nette\Utils\String
špatně pojmenovaná třída?
Nevidím rozdíl oproti např.
Nette\Application\Responses\Json
.
U výjimek i iterátorů mi připadá lepší dodržet PHP konvence, tedy
slova Exception
respektive Iterator
na konci názvu
třídy. A to bez ohledu na (ne)existenci vlastního namespace. Tedy žádný
Recursor
ačkoli ten název se mi líbí. :-)
- David Grudl
- Nette Core | 8218
Proč je
Nette\Utils\String
špatně pojmenovaná třída? Nevidím rozdíl oproti např.Nette\Application\Responses\Json
.
„Aplikace vrátila JSON“ zní přirozeně.
Vidím rozdíl mezi třídou představující řetězec a třídou představující nástroje pro řetězce.
- Yrwein
- Člen | 45
David Grudl napsal(a):
Proč je
Nette\Utils\String
špatně pojmenovaná třída? Nevidím rozdíl oproti např.Nette\Application\Responses\Json
.„Aplikace vrátila JSON“ zní přirozeně.
Vidím rozdíl mezi třídou představující řetězec a třídou představující nástroje pro řetězce.
Když aplikace vratí JSON, budu si u JSONu představovat metody typu toArray, getValue($key) a podobně, nikoliv send. Aplikace imho nevrací JSON, ale JSONResponse, která teprve musí být odeslána metodou „send“ (a „send“ zároveň asi těžko je obecnou metodou JSONu, protože JSON nic neodesílá — to dělají jen třídy, které ho používají).
Podobně u FilterIteratoru (a asi dalších příkladů, které tady jsou uváděny) — Filter pouze vyfiltruje, FilterIterator při iterování filtruje (a dle toho se taky chová — tzn. má určité metody).
Edit: Smazána připomínka k délkám (…namespace a tříd… .]), ať neplevelím diskuzi.
Editoval Yrwein (11. 4. 2011 9:49)
- Filip Procházka
- Moderator | 4668
Davide, jestli chceš doporučovat práci se třídami ve tvaru
Iterator\Filter
atp, bylo by dobré, to dodržovat globálně, viz
Response\Json
. Sice se mi to nelíbí (nějaký mentální blok
kvůli bůhvíčemu), ale nemám proti tomu argumenty. Tak to aspoň udělej
konzistentní, díky :)
- David Grudl
- Nette Core | 8218
HosipLan napsal(a):
Tak to aspoň udělej konzistentní, díky :)
Jestli máš na srdci něco konkrétního, tak to napiš, fakt nevím, jak si tvé připomínky vyložit.
- Filip Procházka
- Moderator | 4668
Tak píšeš, že chceš prosazovat zápis Driver\Mysql
ale
v přehledu
změn máš pořád Responses\Json
, je to trochu
matoucí :)
- David Grudl
- Nette Core | 8218
HosipLan napsal(a):
Tak píšeš, že chceš prosazovat zápis
Driver\Mysql
ale v přehledu změn máš pořádResponses\Json
, je to trochu matoucí :)
Kde píšu že chci prosazovat Driver\Mysql
? A co by mělo být
místo Responses\Json
? Se trošku snaž, to mám z tebe tahat jak
z chlupaté deky?
- Filip Procházka
- Moderator | 4668
Ajaj to byl Paranoiq :) To je tak když člověk dělá 10 věcí zaráz… Mě už je to asi jedno, jak říkal Patrik, ať už to tam je:)
- Honza Marek
- Člen | 1664
David Grudl napsal(a):
A co by mělo být místo
Responses\Json
?
No přece Response\Json :-D
- David Grudl
- Nette Core | 8218
Nejrozumnější a nejpřirozenější by bylo zavést jmenné prostory
obráceně, tj. místo Nette\Application\Response\Json
používat
Json\Responses\Application\Nette
nebo
InvalidArgument\Exception\Nette
či
Filter\Iterator\Nette
. Výhodu to má i v tom, že by se všechny
třídy jmenovaly Nette, tudíž by se programátor nemohl splést.
- Cifro
- Člen | 245
David Grudl napsal(a):
Nejrozumnější a nejpřirozenější by bylo zavést jmenné prostory obráceně, tj. místo
Nette\Application\Response\Json
používatJson\Responses\Application\Nette
neboInvalidArgument\Exception\Nette
čiFilter\Iterator\Nette
. Výhodu to má i v tom, že by se všechny třídy jmenovaly Nette, tudíž by se programátor nemohl splést.
:D
Dlho sa o tom diskutuje. Urob to tak ako si urobil pri https://forum.nette.org/…aciho-jazyka a bude kľud :))
- redhead
- Člen | 1313
Tak abych zase rozpustil ledy. Současný návrh je strašný.
Nette\Application\Responses\File
myslíte vážně?? Až bude NB
umět automatické psaní use
a já budu moct napsat pouze
(necelý) vlastní název třídy bez NS a pak Ctrl+Space, Enter, tak budu mít
jako v kódu třídu File, která nemá se souborem vlastně nic společnýho,
protože je to vlastně odpoveď serveru? To samé \Text atd.
Hodně věcí teď porušuje pravidlo a) a to nemyslím podstatným jménem, ale že nevystihují podstatu třídy bez uvedení namespace, což považuji za mnohem důležitější než že to musí být pods. jméno (například IRenderable je naprosto správný název interfacu)
Sice bych mohl napsat třídu s poslední úrovní NS, ale proboha proč??
Navíc tam budu mít ohavné lomítko. A nemluvte tady o délce, za chvíli
nějaké use
nebude muset psát vůbec.
Zamyslete se znovu nad tím, co tu obhajujete.
- Šaman
- Člen | 2659
Doufám, že mě 30. dubna neupálíte jako heretika a kacíře, když prohlásím, že mě by se nejvíc ze všeho líbil jediný namespace Nette :)
Vyřeší se tím problém neprefixované verze (obsazené třídy User a Image) a přitom by se všude jen napsalo use Nette a byl by od NS pokoj.. :)) A staré projekty by se docela snadno přepsaly.
- Honza Marek
- Člen | 1664
redhead: Ty to pořád srovnáváš s Javou. A ta má názvy všech tříd tak strašně dlouhý, že by se obešla i bez jmenných prostorů (packageů).
- redhead
- Člen | 1313
Určitě jsem ovlivněn Javou, ovšem vůbec nechápu důvod, proč tu navrhujete, co tu navrhujete a už vůbec nevidím žádný přínos. Kratší zápis? Pff.
Java používá package pro oddělení logických celků – java.net (třídy pro práci se sítí), java.io (pro práci se soubory, proudy, atd.), většinou se neopakují ani názvy package a třídy (třeba Responses\NecoResponse). Jde mi ale hlavně o popisnost těch tříd. Co mi řekne třída File nebo Text bez namespace? Nic.
V javě by si nikdo nedovolil udělat třídu java.io.readers.Buffered, protože radši budu číst o 6 znaků delší (co máte vůbec furt s tou délkou?) než mít naprosto dementní nicneříkající název.
A vůbec, nemusím se ani omezovat na Javu jako nějaký guru jazyk (FYI si to ani nemyslím), i .NET používá popisné názvy tříd.
Opravdu by mi i pouhé namespace Nette nevadilo, možná třeba pár podnamespaců pro logické oddělení – nějaké to Application, Templates, Utils apod. a dost (aby se páni neupsali). A spokojeni budeme všichni.
Editoval redhead (11. 4. 2011 20:22)
- David Grudl
- Nette Core | 8218
redhead napsal(a):
Tak abych zase rozpustil ledy. Současný návrh je strašný.
Nette\Application\Responses\File
myslíte vážně?? Až bude NB umět automatické psaníuse
a já budu moct napsat pouze (necelý) vlastní název třídy bez NS a pak Ctrl+Space, Enter, tak budu mít jako v kódu třídu File…
A až bude NB umět automatické psaní use
s poslední
úrovní NS, bude problém vyřešen ;-)
…která nemá se souborem vlastně nic společnýho, protože je to vlastně odpoveď serveru?
No a taky je to soubor, a taky je to objekt
(FileResponseObject
).
Mimochodem, všiml sis problému ve slovech „je to odpověď serveru“? Pokud to je odpověď, pak by nemělo jít o implementaci rozhraní IResponse, ale o potomka třídy AbstractResponse (is-a vs -able or can-do). Jelikož proti IResponse nic nenamítáš, mohu ti rozporovat, že to vlastně odpověď serveru není ;) Je to soubor, jehož lze použít jako serverové odpovědi.
- redhead
- Člen | 1313
No a taky je to soubor, a taky je to objekt (FileResponseObject).
Držme se při zemi. Vynechme to, jak je to akademicky správně. Btw přemejšlíš už nad hodně velkejma kravinama – jsme programátoři a ne Ústav jazyka anglického.
Výhody:
- kratší zápis
Nevýhody:
- nepopisný název tříd (porušuje pravidlo a))
- nekonzistence v případě názvů kolidujících s klíčovými slovy
Něco dalšího?
Jinak by mě docela, Davide, zajímalo, co přesně tě tak obrátilo, první návrh byl téměř bezchybný.
Mimochodem, všiml sis problému ve slovech „je to odpověď serveru“? Pokud to je odpověď, pak by nemělo jít o implementaci rozhraní IResponse, ale o potomka třídy AbstractResponse (is-a vs -able or can-do).
Nevšiml, protože to není můj problém (ale nejspíš tvůj).
Btw, nechceš prosím zavést nějaké nové klíčové slovo? Protože
instanceof
se dá použít i na rozhraní a rozhraní přece
nemůžeme instancovat, takže to při čtení nedává smysl :)
Editoval redhead (11. 4. 2011 21:05)
- David Grudl
- Nette Core | 8218
redhead napsal(a):
Jde mi ale hlavně o popisnost těch tříd. Co mi řekne třída File nebo Text bez namespace? Nic.
Předně: těmto námitkám velmi dobře rozumím, protože stejným způsobem bych namítal sám, nicméně zajímavé je i oponovat.
K praktického hlediska je dokumentace java.io (platí i pro .NET) neúhledná hromada tříd rozdělená na tři skupinky interface, class, exceptions. Mnohem praktičtější by bylo rozdělení na okruhy Reader/Writer, InputStream/OutputStream a ostatní. Mohly by se označit nějakou Javadoc anotací. A tu by mohl respektovat nejen generátor dokumentace, ale i IDE, čímž by se zjednodušilo psaní tříd. To by byl jasný praktický přínos.
Primárně však chci říct, že určitý rozlišovací nedostatek v Javě vidím. V Nette ho rozhodně mít nechci a vlastně je jen otázka, jestli k tomu využít anotace nebo namespaces.
V javě by si nikdo nedovolil udělat třídu java.io.readers.Buffered, protože radši budu číst o 6 znaků delší
To je ale velmi, velmi zavádějící přirovnání. Jak si můžeš
všimnout, taky nechci použít Nette\Iterators\Recursive
.
- redhead
- Člen | 1313
Třeba udělat nový význam pro slovo implements
.
if($neco implements IResponse)
vypadá fáákt dobře.
Když už ses teda začal dál pitvat do Javy. Tak mu upřímně řekni co si budeš myslet o tomto kódu, když ho při procházení souboru najdeš:
File f = new File("a.txt");
Co? Abstrakce nad souborem „a.txt“? Ahá, ale bacha radši vyscrolluj nahoru, páč třída File je v package java.io.writer!
Co se týče toho Buffered, to jsem napsal schválně, protože to dodržuje stejný scénář (ano, vím, není to podst. jméno..), ale je to stejně tak nepopisný název třídy jako Response/File bez ns.
Ano, je dobré oponovat a sám jsem nad tímto způsobem ns také dost přemýšlel, ale když jsem si pak představil práci s takovýmto kódem, tak jsem to naprosto zavrhl.
Já v tom tolik výhod zas nevidím. Navíc, někteří psali, že budou
psát: Response\File
v čem je to jiné než psát
FileResponse
(bacha! o jeden znak kratší, whee).
- Jan Tvrdík
- Nette guru | 2595
Přestože je Responses\FileResponse
delší než
Responses\File
, tak to napíši stejně rychle díky code
completion. Zatím stále preferuji tu delší variantu, ale musel bych tak
nějakou dobu programovat, abych se rozhodl definitivně.
- redhead
- Člen | 1313
@Jan Tvrdík: vždyť ani to Responses\
nemusíš psát,
proč taky? Stačí FileResponse
s use
m.
@jtousek: Taky pravda. Ale tohle byl jenom vtípek, zase to neberte tak vážně.
Napadl mě ještě hezký příklad:
GrapeSeedJuiceManager
je manažer džusu z jadérek grepu.
Když tam to Manager
nebude, bude to jen džus z jadérek grepu.
Tak a teď ta třída něco menežuje nebo ji můžu vypít? Ano mohl bych
napsat NS Managers\
, v čem ale pak bude rozdíl?
Editoval redhead (11. 4. 2011 22:06)