2009-10-10 11 views
8

Z tego co rozumiem, kwalifikator global:: umożliwia dostęp do przestrzeni nazw, która została ukryta przez inny o tej samej nazwie. Na przykład MSDN page używa System. Jeśli utworzysz własny obszar nazw System, możesz osiągnąć oryginał za pomocą global::System. Pierwszą rzeczą, która przyszła mi do głowy, było to, dlaczego ktokolwiek miałby wywoływać ich przestrzeń nazw System? Strona mówi dalej, że nie jest to zalecane, ale powielanie przestrzeni nazw jest bardzo możliwe w dużych projektach. Jeśli/kiedy tak się stanie, czy jest to znak, że wszystko zmierza w złym kierunku, czy też istnieją uzasadnione powody, aby mieć sprzeczne przestrzenie nazw?Użycie globalnych :: dla sprzecznych przestrzeni nazw

+0

Czy dobrze pachnie kod? : p –

+0

@rpflo: Być może ma na myśli "czy to jest poważny zapach kodu?" –

+1

W przeciwieństwie do dobrego kodu, który pachnie jak bzy. :) –

Odpowiedz

7

Jednym z uzasadnionych powodów posiadania konfliktów w przestrzeni nazw może być użycie wewnętrznych bibliotek napisanych dla wcześniejszych wersji .Net, które nie zawierają funkcji dodanych w późniejszych wersjach. W .Net 1.1 dni, na przykład, napisałem klasy rejestru, które opakowane wywołania rejestru API. Przez przypadek nazwy metod, które wybrałem, były dokładnie takie same, jak w późniejszej klasie .Net Registry, i zrobiły dokładnie to samo, więc łatwo było odłączyć mój wychowywany kod. W przypadku bardziej skomplikowanych rzeczy przydatna może być możliwość użycia starszego, słabo nazwanego kawałka kodu z kwalifikatorem global::.

Umyślne nadanie nowego fragmentu kodu przy użyciu istniejącej przestrzeni nazw .Net byłoby jednak z pewnością zapachem kodu.

12

Ogólnie rzecz biorąc, global:: służy do wskazania "Chcę rozpocząć na górze struktury przestrzeni nazw". Jeśli mam przestrzeń nazw o nazwie MyProduct.System, wówczas wszystko, co znajduje się w przestrzeni nazw MyProduct, nie będzie mogło uzyskać dostępu do przestrzeni nazw Microsoft System. Czy to zapach kodu? Może czasem, ale nie śmierdząco.

7

Każdy wygenerowany komputerowy kod powinien próbować używać global::, aby zminimalizować potencjalne konflikty przestrzeni nazw, o których może nie wiedzieć. Co więcej, każdy z twoich kodów, który może napotkać konflikty, może użyć go bardziej szczegółowo.

0

Myślę, że od czasu do czasu zdarza się, że jedna z twoich przestrzeni nazw ma inną nazwę. Na przykład mam przestrzeń nazw .Persistence.NHibernate, gdzie NHibernate może być również główną przestrzenią nazw zespołu NHibernate.

Nie widzę tu żadnego kodu zapach, to jest po prostu nazywanie isses;)

2

Microsoft ma kilka dobrych wskazówek przestrzeni nazw w znakomitej książce Framework Design Guidelines 2nd Ed.. Generalnie zalecają przeciwdziałanie wprowadzaniu konfliktów (na przykład nazywanie strumienia typu).

Nie wierzę, że kiedykolwiek użyłem kwalifikatora global :: qualifier. Ogólnie uważam, że jest to zapach kodowy (chociaż są wyjątki, jak wskazują MusiGenesis i sixlettervariables).

Powiązane problemy