( 깨끗한 코드를 읽지 않았으며 Java를 많이 알지 못합니다.)
책임을 명확하게 정의한 많은 작은 엔티티를 생성하는 아이디어를 네임 스페이스에 적용하는 것이 합리적입니까?
예, 여러 클래스와 여러 함수로 리팩토링하는 것과 마찬가지입니다.
소규모의 관련 클래스 그룹은 항상 네임 스페이스로 묶어야합니까?
실제로 대답하지 않으면 : 예, 최소한 하나의 최상위 네임 스페이스를 사용해야합니다. 이것은 프로젝트, 조직 또는 원하는 것을 기반으로 할 수 있지만 전역 이름을 거의 사용하지 않으면 이름 충돌이 줄어 듭니다. 다른 모든 것을 그룹화하는 단일 네임 스페이스는 하나의 전역 이름 만 도입합니다. extern "C"함수는 제외하지만 C 상호 운용성으로 인해 다른 extern "C"함수에만 영향을줍니다.
소규모의 관련 클래스 그룹을 전용 네임 스페이스로 래핑 해야합니까? 아마. 특히 FrobberThing, FrobberThang, FrobberDoohickey 클래스에서 공통 접두사를 사용하는 경우 네임 스페이스 (frobber :: Thing 등)를 고려해야합니다. 더 큰 프로젝트의 일부인 경우 여전히 루트 네임 스페이스 또는 다른 네임 스페이스 아래에 있습니다.
이것이 많은 작은 클래스를 갖는 복잡성을 관리하는 방법입니까, 아니면 많은 네임 스페이스를 관리하는 비용이 엄청 날까요?
위의 접두사 이름 예제를 사용하면 FrobberThing보다 frobber :: Thing을 관리하는 것이 어렵지 않습니다. 문서화 및 코드 완성과 같은 일부 도구를 사용하면 더 쉬울 수도 있습니다. ADL과 다른 점이 있지만 이는 유리한 방식으로 작동 할 수 있습니다. 연결된 네임 스페이스의 이름이 적을수록 ADL을 알아내는 것이 더 간단 해지며 선언을 사용하여 특정 네임 스페이스에 특정 이름을 주입 할 수 있습니다.
네임 스페이스 별명을 사용하면 특정 컨텍스트에서 더 긴 네임 스페이스에 더 짧은 이름을 사용할 수 있으므로 다시 쉽게 사용할 수 있습니다.
void f() {
namespace CWVLN = Company_with_very_long_name; // Example from the standard.
// In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
namespace fs = boost::filesystem; // Commonly used.
}
다양한 라이브러리에 대해 단일 루트 네임 스페이스, boost 및 여러 하위 네임 스페이스 (boost :: asio, boost :: io, boost :: filesystem, boost :: tuples 등)가있는 Boost를 고려하십시오. 일부 이름은 루트 네임 스페이스 로 "승격" 됩니다.
모든 정의는 namespace :: boost :: tuples에 있지만 가장 일반적인 이름은 선언을 사용하여 namespace :: boost로 들어갑니다. 이 이름은 tuple, make_tuple, tie and get입니다. 또한 ref와 cref는 :: boost 네임 스페이스에서 직접 정의됩니다.
"실제"모듈을 가진 언어와의 가장 큰 차이점은 더 평평한 구조를 사용하는 것이 얼마나 흔한 지입니다. 중첩 된 이름을 정의하기 위해 특별한 노력을 기울이지 않는 한 주로 작동하기 때문입니다.