네임 스페이스 / 패키지의 장점


14

일부 프로그래밍 언어 (예 : Java 및 C ++)에는 "패키지"또는 "네임 스페이스"라는 언어 기능이 있습니다. 네임 스페이스를 갖는 것이 실제로 얼마나 유용합니까? SDL과 같은 언어 기능을 사용하지 않고 함수 및 클래스를 특정 라이브러리에 속하는 것으로 표시 할 수 있습니다 (예 :) SDL_BlitSurface(). 네임 스페이스는 가치가있을만큼 충분히 도움이되지 않습니까? 라이브러리에서는 유용하지만 응용 프로그램에서는 유용하지 않습니까? 소규모 프로젝트를 제외하고 어디에서나 유용합니까? 생각?

답변:


16

덜 유용하고 읽기 / 파싱하기 어려운 방식으로 수행된다는 점을 제외하고는 namespacing 과 동일한 이름을 접두사로 사용 하지 않습니까? 질문 자체가 대답하지 않습니까?


식별자 이름 앞에 접두사를 붙이는 것은 네임 스페이스와 같은 언어 기능을 사용하는 것과 다릅니다. 예를 들어, C ++에서는 using특정 네임 스페이스이고 해당 네임 스페이스의 식별자 시작 부분에 접두사를 넣을 필요 가 없다고 말할 수 있습니다 .
compman

2
@ user9521-그게 내 요점 ...
Nicole

+1 네임 스페이스의 가장 큰 장점 중 하나는 접두사가 필요하지 않을 때 접두사를 생략 / 단축 할 수 있다는 것입니다. 참조하는 특정 것이 using, by import xxxxxxxxx as yyy등으로 정의 된 네임 스페이스에서

1
대부분의 프로그래머는 게으 르기 때문에, 대신에 모든 using SDL;것을 선언 하거나 타이핑해야 SDL_*합니까?
Berin Loritsch

2
+1,하지만 당신이 정말로 "유용하지 않고, 읽기가 더 어려우며, 컴파일러에 의해 검증되지 않았다"고 생각합니다.
Larry Coleman

5

네임 스페이스가있는 대부분의 (모든?) 언어는 객체 지향적 인 경향이 있습니다. 호환되지 않는 구현이 여러 개 있지만 유형에 대해 사람이 읽을 수있는 이름이 여러 번있는 경우가 많습니다. (이것은 객체 지향 재사용에 관한 다른 문제를 가져 오지만, 이것이이 질문에 관한 것이 아닙니다). 예를 들어 Java에는 백그라운드 UI 작업에 사용되는 타이머와 백그라운드 응용 프로그램 (AWT / Swing에 묶이지 않음) 작업에 사용되는 타이머가 있습니다. 네임 스페이스를 사용하면 동일한 이름의 객체가 다른 하위 API에있을 수 있습니다.

네임 스페이스가 존재하는 이유는 다른 개발자가 객체의 이름을 지정할 것을 예상하는 비합리적인 작업과 관련이있었습니다. C ++은 개념을 도입했으며 (적어도 개념에 노출 된 첫 번째 언어였습니다) 모범 사례에 대한 지침이 없어도 도움이되었습니다. Java는 개념을 조정하고 네임 스페이스에 회사 이름을 포함하는 "모범 사례"를 추가했습니다. 그렇게하면 자신의 회사 만 걱정하면됩니다.

접두사는 꽤 지저분해질 수 있습니다. 언제 신청합니까? 언제 않습니다 하지 적용? 구조체 / 클래스 / 글로벌 메소드는 접두사를 가져 옵니까? 방법은 어떻습니까? 구조체의 속성은 어떻습니까? 고맙게도 한 번에 전부는 아니지만 코드에서 이러한 모든 것을 보았습니다. 네임 스페이스는 이러한 모든 질문에 대한 예측 가능성을 제공하며 개인 "모범 사례"가 아닌 언어 기능으로 만듭니다.


Haskell은 네임 스페이스 (모듈)를 가지고 있으며 객체 지향적이지 않습니다.
Jeremy Heiler

3

네임 스페이스는 좋은 생각이라고 생각합니다. 이름의 범위를 제한하여 이름 충돌을 방지합니다. Java 패키지에서 제안 된 패키지 이름 지정 규칙은 고유 해야하는 도메인 이름을 기반으로 하며 사용자 정의 라이브러리와의 이름 충돌을 방지합니다. 전반적으로, 그들은 넓은 의미에서 이름을 조금 더 독특하게 만들면서도, 프로그래머는 모호한 이름 지정 규칙을 따르지 않고도 그의 이름을 지정할 때 좀 더 자유로울 수 있습니다.


1
그러나 Java의 특정 규칙의 경우 모든 사람이 웹 사이트를 가지고있는 것은 아닙니다. 또한 프로그램을 한 웹 사이트에서 다른 웹 사이트로 이동하는 경우 (예 : Sourceforge에서 Github로) 다른 것들이 코드에 의존하는 경우 패키지를 변경하는 것이 바람직하지 않습니다.
compman

1
Java의 규칙은 조직이 호스팅되는 장소가 아닌 조직에 적용됩니다. 당신은 단순히 자신을 조직으로 선언하고 그것을 할 수 있습니다. 패키지 이름에 사용할 수없는 문자를 허용하는 URL의 문제도 있습니다. 그러나 우리는 거기에 가지 않을 것입니다. 따라서 "me.user9521"을 패키지 이름으로 사용하면 설정됩니다.
Berin Loritsch

1
컨벤션은 웹 이름이 아니라 도메인 이름에 관한 것입니다. 웹 사이트없이 도메인을 가질 수 있습니다.
David Thornley

1

네임 스페이스 / 모듈 / 패키지는 이름 충돌을 피하는 데 유용합니다. 이름 접두사도 있지만 네임 스페이스는 기호를 현재 네임 스페이스로 가져올 수있어 편리하게 추가되므로 전체 네임 스페이스 :: *를 사용하지 않아도됩니다.

Python과 같은 일부 언어는 특정 심볼 만 현재 모듈로 가져 오거나 다른 이름으로 심볼을 가져올 수 있도록하여이 기능을 확장합니다. 일부 클래스 / 함수 / 상수에만 관심이 있거나 일부 심볼이 네임 스페이스의 심볼과 충돌하지만 일부는 그렇지 않은 경우에 유용합니다.

Ruby와 같은 일부 언어를 사용하면 모듈의 메소드를 클래스에 포함시킬 수 있습니다. 다형성 및 제네릭에 유용합니다. 예를 들어, 동일한 방식으로 반복자가있는 여러 클래스가있는 경우 개체의 데이터를 정렬하고 필터링하는 메서드를 제공하는 별도의 모듈에서 이러한 모든 클래스에 메서드를 혼합 할 수 있습니다. 이것은 has a관계와 is a(상속) 관계를 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.