[oop] namespaces
Stel ik heb mijn exceptions in de namespace exception staan:
Nu zit ik in mijn framework in de namespace ozzie\cacher. Binnen deze namespace wil ik de bar en foo exception kunnen gooien. Dan moet ik dus "use ozzie\exception" gebruiken.
Deze situatie dat ik "use" moet gebruiken voordat ik bestanden binnen mijn eigen library kan gebruiken komt best vaak voor. Uiteraard valt daar gewoon mee te leven, maar ik vroeg me ineens af... wat nu als ik alleen de namespace "ozzie" zou gebruiken?
In plaats van:
Zou je dan dit krijgen:
Dan staat alles in dezelfde namespace en hoef je dus nooit meer "use" te gebruiken.
Zal wel een stom idee zijn, maar het schoot me ineens te binnen en ik dacht ik gooi het even in de groep...
Gewijzigd op 06/06/2014 18:41:14 door Ozzie PHP
Quote:
Deze situatie dat ik "use" moet gebruiken voordat ik bestanden binnen mijn eigen library kan gebruiken komt best vaak voor.
Nee hoor, \Ozzie\Exception\Foo en je hebt geen `use` nodig! `use` is er nou net voor om niet telkens de volledige FQNS te hoeven typen. Je kan `use` zo vaak of zo weinig gebruiken als je zelf wilt.
>> Hoe ben je dan van plan een overzichtelijke mappen structuur te houden? Heel veel PSR-4 autoloaders aanmaken?
Met een eigen autoloader voor de library kan ik de mappenstructuur aanhouden.
>> Nee hoor, \Ozzie\Exception\Foo en je hebt geen `use` nodig! `use` is er nou net voor om niet telkens de volledige FQNS te hoeven typen. Je kan `use` zo vaak of zo weinig gebruiken als je zelf wilt.
Heb je gelijk in, maar stel ik heb een class van waaruit 3 verschillende exceptions kunnen worden gegooid en in de constructor wordt getypehint op 2 objecten uit een andere namespace. Dan moet ik al 5x use gebruiken. Ik kan ook overal de volledige naam gebruiken, maar dan krijg je dus overal ozzie\zus, ozzie\zo en dat leest niet echt lekker. Ik kan wel in plaats van per exception de complete exception namespace gebruiken zodat je exception\foo en exception\bar krijgt. Dat vind ik op zich wel netjes, maar je moet dan toch altijd use gebruiken. Als alles dezelfde namespace heeft, dus "ozzie", dan hoef je nergens use te gebruiken. Het enige nadeel (denk ik... wellicht zie ik iets over het hoofd) is dat je lange class-names krijgt. Dus ipv class Foo met namespace ozzie\exception krijg je dan iets als Exception-Foo met als namespace ozzie.
Quote:
Dus ipv class Foo met namespace ozzie\exception krijg je dan iets als Exception-Foo met als namespace ozzie.
- is niet toegestaan, _ wel.
Op die manier ga je dus eigenlijk terug naar het niet hebben van namespaces. Behalve dat third-party libraries geen confilten veroorzaken.
Je weet dat het volgende mogelijk is?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
namespace Universe\MilkeyWay\Sol\Terra {
class Ozzie { public function __construct() { echo 'Ozzie', PHP_EOL;}}
class Darsstar { public function __construct() { echo __CLASS__, PHP_EOL;}}
class God { public function __construct() { echo __CLASS__, PHP_EOL;}}
}
namespace {
use Universe\MilkeyWay\Sol;
// dit is het interessante deel
new Sol\Terra\Ozzie;
new Sol\Terra\Darsstar;
new Sol\Terra\God;
}
?>
namespace Universe\MilkeyWay\Sol\Terra {
class Ozzie { public function __construct() { echo 'Ozzie', PHP_EOL;}}
class Darsstar { public function __construct() { echo __CLASS__, PHP_EOL;}}
class God { public function __construct() { echo __CLASS__, PHP_EOL;}}
}
namespace {
use Universe\MilkeyWay\Sol;
// dit is het interessante deel
new Sol\Terra\Ozzie;
new Sol\Terra\Darsstar;
new Sol\Terra\God;
}
?>
Wat betekend dat je Exception\Foo kan gebruiken ipv \Ozzie\B\L\A\Exception\Foo gebruikt.
Verder snap ik niet helemaal wat je tegen `use` hebt. 5x is trouwens niet bepaald wat ik veel noem.
Gebruik je trouwens een IDE of een editor?
Ja, daar komt het inderdaad wel op neer. Maar waren namespaces daar ook niet voor bedacht eigenlijk, om conflicten met andere libraries te voorkomen?
>> Wat betekend dat je Exception\Foo kan gebruiken ipv \Ozzie\B\L\A\Exception\Foo gebruikt.
Ik denk niet dat ik helemaal snap wat je bedoelt. Ik snap dat het kan, maar dat ik toch wat ik hierboven ook zei? Dus stel ik heb een cacher en ik wil daarin exceptions gebruiken, dan zet ik bovenin "use ozzie\exception". Alleen het voelt zo stom op de een of andere manier.
Hoe leg ik dat uit. Ik heb dus een ozzie library, en telkens als ik in een class de eigen exceptions van die library wil gebruiken, dan moet ik óf de fqcn gebruiken ozzie\exception\foo of ik moet "use ozzie\exception" toepassen zodat ik "exception\foo" kan gebruiken. Waarom kan ik niet gewoon in m'n eigen library "foo" gebruiken zonder fqcn of "use". Dat was dus even waarover ik zat te denken.
Quote:
Ja, daar komt het inderdaad wel op neer. Maar waren namespaces daar ook niet voor bedacht eigenlijk, om conflicten met andere libraries te voorkomen?
Ja, maar met jou idee om dan Exception-foo te gebruiken introduceer je je eigen namespace seperator. Gebruik dan aub de officiële...
Quote:
Alleen het voelt zo stom op de een of andere manier.
Jou probleem, leer er mee leven. C, C++, Java, .NET en velen anderen hebben iets soortgelijks.
Ik snap dat je geen `use` wilt gebruiken. Maar vind het geen goede reden. Je hebt meerdere opties, kies er een. `use` gebruiken vind ik het netst. En importeer niet alleen classes maar ook namespaces.
Als je toch alles in 1 namespace gaat gooien, gooi dan lekker het hele namespace gedoe weg, doe alsof je in 2001 leeft en gebruik lekker De_Ouderwetse_Klasse_Namen. Jeeh, ozzie happy geen use statements meer.
En wat is er eigenlijk zo erg aan use statements? Staan ze in de weg? Gebruik dan een IDE die die regels fold of leer gewoon scrollen. Ben je het zat om ze telkens te typen? Anders moet je ze in de code typen, dus geen verschil. Daarnaast kan een beetje IDE voor je automatisch de use statements aanmaken.
Nee, dat is dan een class-naam... geen idee eigenlijk of je daar wel - in kunt gebruiken overigens.
>> Ik snap dat je geen `use` wilt gebruiken. Maar vind het geen goede reden. Je hebt meerdere opties, kies er een. `use` gebruiken vind ik het netst. En importeer niet alleen classes maar ook namespaces.
Dat is ook wat ik doe... de namespace importeren. Het is allemaal geen onoverkomelijk probleem hoor. Maar ik vroeg me af of het ook anders kon...
>> Als je toch alles in 1 namespace gaat gooien, gooi dan lekker het hele namespace gedoe weg, doe alsof je in 2001 leeft en gebruik lekker De_Ouderwetse_Klasse_Namen. Jeeh, ozzie happy geen use statements meer.
Easy Wouter ;) Het was zoals ik zei slechts een gedachtengang. Iets om over na te denken. Stukje reflectie.
Quote:
Exception-foo
Waarom zou je een - gebruiken in een class naam?
Quote:
Dat is ook wat ik doe... de namespace importeren. Het is allemaal geen onoverkomelijk probleem hoor. Maar ik vroeg me af of het ook anders kon...
Waarom zou je dit anders willen doen? Wat is er mis met namespaces?
Ik zit in mijn eigen ozzie library. Stel dat ik in namespace ozzie\foo ozzie\bar wil gebruiken, dan zou het best handig zijn als ik niet telkens use ozzie\bar (of wat dan ook) hoef te doen. Maar goed, het kan niet anders.
Ok, hoe zou jij namespaces willen gebruiken?
Code (php)
Ik gebruik dus die use-statements zodat in de class zelf het woordje "ozzie" wegvalt. Zonder de use statements zou je dit krijgen:
Code (php)
Ik zou het wel mooi vinden als je de 1e optie kan gebruiken, maar dan zonder de use-statements, maar ja... dat kan niet.
Dat kan, zolang ze maar dezelfde namespace gebruiken:
Code (php)
Dat brengt je dan bij een andere oplossing: het aanpassen van de structuur van je namespace. Als je het gevoel hebt dat use overbodig zou moeten zijn, dan kan dat namelijk betekenen dat je de hiërarchie in de namespace moet verbeteren.
Ozzie PHP op 08/06/2014 01:02:43:
Er is niet iets mis mee, maar ik vroeg me af of het efficiënter kan.
Ik zit in mijn eigen ozzie library. Stel dat ik in namespace ozzie\foo ozzie\bar wil gebruiken, dan zou het best handig zijn als ik niet telkens use ozzie\bar (of wat dan ook) hoef te doen. Maar goed, het kan niet anders.
Ik zit in mijn eigen ozzie library. Stel dat ik in namespace ozzie\foo ozzie\bar wil gebruiken, dan zou het best handig zijn als ik niet telkens use ozzie\bar (of wat dan ook) hoef te doen. Maar goed, het kan niet anders.
Maar je typt dit toch ook maar 1x? ( wanneer je een class aan het opbouwen bent ) Overigens is een goed IDE al voorzien van autocompletion en import functionaliteit waardoor je zelfs dit niet hoeft te doen.
>> Dat kan, zolang ze maar dezelfde namespace gebruiken:
Ja, dat weet ik... maar dan zou je complete library dus maar uit 1 namespace bestaan.
>> Dat brengt je dan bij een andere oplossing: het aanpassen van de structuur van je namespace. Als je het gevoel hebt dat use overbodig zou moeten zijn, dan kan dat namelijk betekenen dat je de hiërarchie in de namespace moet verbeteren.
Dat lijkt me vrij onmogelijk eigenlijk. Je zult altijd andere namespaces uit dezelfde libraries moeten importeren, tenzij je dus alles in één-en-dezelfde namespace zet.
@Reshad:
>> Maar je typt dit toch ook maar 1x? ( wanneer je een class aan het opbouwen bent ) Overigens is een goed IDE al voorzien van autocompletion en import functionaliteit waardoor je zelfs dit niet hoeft te doen.
Ja, je typt het ook maar 1x. Maar desalniettemin voelt het soms wat vreemd dat je in je eigen library dingen uit diezelfde library moet gaan importeren.