Zalety nazw / pakietów

14

Niektóre języki programowania (np. Java i C ++) mają funkcje językowe zwane „pakietami” lub „przestrzeniami nazw”. Jak przydatne jest używanie przestrzeni nazw? Możliwe jest oznaczenie funkcji i klas jako należących do określonej biblioteki bez użycia takiej funkcji językowej, jak robi to SDL (np SDL_BlitSurface().). Czy przestrzenie nazw nie są wystarczająco pomocne, aby były warte posiadania? Czy są przydatne w bibliotekach, ale nie w aplikacjach? Czy są przydatne wszędzie oprócz małych projektów? Myśli?

compman
źródło

Odpowiedzi:

16

Czy przedrostki nazw nie są tym samym, co przestrzeń nazw , poza tym, że jest to wykonywane w sposób mniej użyteczny i trudniejszy do odczytania / parsowania? Czy samo pytanie nie odpowiada?

Nicole
źródło
Samo umieszczenie przedrostka na początku nazwy identyfikatora to nie to samo, co użycie funkcji języka, takiej jak przestrzenie nazw. Na przykład w C ++ możesz powiedzieć, że jesteś usingokreśloną przestrzenią nazw, a następnie nie musisz umieszczać prefiksu na początku identyfikatorów w tej przestrzeni nazw.
compman
2
@ user9521 - o to mi chodzi ...
Nicole
+1 Jedną wielką zaletą przestrzeni nazw jest to, że możesz pominąć / skrócić prefiks, gdy nie jest potrzebny - w przestrzeni nazw, w której określona rzecz, o której mowa, jest zdefiniowana przez using, przez import xxxxxxxxx as yyy, itp.
1
Ponieważ większość programistów jest leniwa, wolałbyś zadeklarować, using SDL;czy musiałbyś pisać SDL_*wszędzie?
Berin Loritsch,
2
+1, ale myślę, że naprawdę miałeś na myśli „mniej przydatny, trudniejszy do odczytania i nie zweryfikowany przez kompilator”.
Larry Coleman
5

Większość (wszystkich?) Języków z przestrzeniami nazw ma tendencję do obiektowego. Wiele razy odpowiednia jest czytelna dla człowieka nazwa typu, mimo że istnieje wiele niezgodnych implementacji. (powoduje to inne problemy związane z ponownym użyciem obiektowym, ale nie o to chodzi w tym pytaniu). Na przykład w Javie masz Timer, który jest używany do zadań w tle interfejsu użytkownika oraz Timer, który jest używany do zadań w tle (niezwiązanych z AWT / Swing). Przestrzeń nazw pozwala mieć obiekty o tej samej nazwie mieszkające w różnych pod-API.

Powodem, dla którego powstały przestrzenie nazw, było nierozsądne zadanie przewidywania, jak inni programiści będą nazywać swoje obiekty. C ++ wprowadził tę koncepcję (a przynajmniej był to pierwszy język, z którym miałem do czynienia z tą koncepcją) i był pomocny, chociaż nie było żadnych wytycznych dotyczących najlepszych praktyk użytkowania. Java dostosowała tę koncepcję i dodała kilka „najlepszych praktyk”, które obejmowały nazwę Twojej firmy w przestrzeni nazw. W ten sposób martwiłeś się tylko o własną firmę.

Prefiks może stać się dość niechlujny. Kiedy to zastosujesz? Kiedy tego nie zastosujesz? Czy struktury / klasy / metody globalne otrzymują prefiks? Co z metodami? Co z właściwościami w strukturze. Widziałem wszystkie te rzeczy w kodzie, choć na szczęście nie wszystkie naraz. Przestrzenie nazw zapewniają przewidywalność wszystkich tych pytań i sprawiają, że jest to funkcja językowa, a nie osobista „najlepsza praktyka”.

Berin Loritsch
źródło
Haskell ma przestrzenie nazw (moduły) i nie jest zorientowany obiektowo.
Jeremy Heiler,
3

Myślę, że przestrzenie nazw to świetny pomysł. Pomagają zapobiegać konfliktom nazw, ograniczając zakres nazwy. W pakietach Java sugerowana konwencja nazewnictwa pakietów oparta jest na nazwach domen, które powinny być unikalne, co pomaga zapobiegać konfliktom nazw nad bibliotekami niestandardowymi. Ogólnie rzecz biorąc, sprawiają, że nazewnictwo jest nieco bardziej unikalne w szerokim tego słowa znaczeniu, jednocześnie pozwalając programiście na większą swobodę w nazywaniu swoich utworów bez konieczności przestrzegania jakiejś niejasnej konwencji nazewnictwa.

Michael K.
źródło
1
Jednak w przypadku konkretnej konwencji Javy nie każdy ma stronę internetową. Ponadto, jeśli kiedykolwiek przeniesiesz swój program z jednej strony na inną (np. Sourceforge do Github), sensowna byłaby, ale niewygodna jest zmiana pakietów, jeśli inne rzeczy zależą od twojego kodu.
compman
1
Konwencja Java dotyczy Twojej organizacji, a nie miejsca, w którym jest hostowana. Możesz po prostu zgłosić się do organizacji i skończyć z nią. Istnieje również problem z adresami URL, które pozwalają na znaki, których nie można używać w nazwach pakietów. Ale nie pojedziemy tam. Więc dla ciebie, po prostu użyj „me.user9521” jako nazwy pakietu i gotowe.
Berin Loritsch,
1
Konwencja nie dotyczy nazw internetowych, ale nazw domen. Możesz mieć domenę bez strony internetowej.
David Thornley,
1

Przestrzenie nazw / moduły / pakiety są przydatne do unikania konfliktów nazw. Podobnie jest z prefiksem nazw, ale przestrzenie nazw mają tę dodatkową wygodę, że mogą importować symbole do bieżącej przestrzeni nazw, dzięki czemu nie musisz zawracać sobie głowy całą przestrzenią nazw :: *.

Niektóre języki (np. Python) rozszerzają tę zdolność, umożliwiając importowanie tylko określonych symboli do bieżącego modułu lub importowanie symboli pod inną nazwą. Jest to przydatne, jeśli interesuje Cię tylko kilka klas / funkcji / stałych lub jeśli niektóre symbole kolidują z symbolami w przestrzeni nazw, ale niektóre nie.

Niektóre języki (np. Ruby) pozwalają na włączenie metod modułu do twojej klasy. Jest to przydatne w przypadku polimorfizmu i leków generycznych. Na przykład, jeśli masz kilka klas, które mają iteratory działające w ten sam sposób, możesz mieszać metody ze wszystkimi tymi klasami z oddzielnego modułu, który zapewnia metody sortowania i filtrowania danych w obiekcie. Umożliwia to zarówno has arelacje, jak i is a(dziedziczenie).

david4dev
źródło