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?
organization
naming
packages
compman
źródło
źródło
using
określoną przestrzenią nazw, a następnie nie musisz umieszczać prefiksu na początku identyfikatorów w tej przestrzeni nazw.using
, przezimport xxxxxxxxx as yyy
, itp.using SDL;
czy musiałbyś pisaćSDL_*
wszędzie?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”.
źródło
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.
źródło
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 a
relacje, jak iis a
(dziedziczenie).źródło