2012-07-05 2 views
19

중첩 된 네임 스페이스를 사용할 때 정규화 된 이름이 꽤 길어지는 경우가 있습니다. 입력의 양을 줄이기 위해 namespace abc = aaa::bbb::ccc을 사용할 수 있음을 알고 있습니다 (어떤 경우에는 가독성을 향상시킬 수도 있음).C++에서 네임 스페이스의 이름을 바꾸기위한 일관된 접근

그러나 프로젝트의 모든 파일에서이 이름 바꾸기를 수행하는 가장 좋은 방법은 무엇입니까? 직접적인 접근법 (즉, 긴 네임 스페이스의 이름을 사용 기준으로 변경)은 다른 파일에서 동일한 완전한 이름에 대해 서로 다른 짧은 이름을 사용하여 최종적으로 끝날 수 있습니다. 그래서, 나는 이것을하기위한보다 일관된 방법을 생각해 냈습니다.

예를 들어, 같은 것을 가정 해 봅시다 : 나는 감소 된 이름을 포함하여 디렉토리 당 하나의 헤더를 만들 생각

project 
    |- client 
    | |- core 
    | |- plugin 
    | |- util 
    |- server 
     ... 

. 예를 들어 project/client/core/core.h에는 namespace pr_cl_core = project::client::core이 포함됩니다 (이 짧은 이름의 예는 다소 불량하지만 실제 프로젝트에서는 더 의미가 있습니다). 그런 다음 project/client/core의 모든 헤더 파일에 core.h을 포함 시키므로 해당 디렉토리의 헤더가 포함될 때 project/client/plugin/plugin_foo.h이라고 가정 해 봅시다. 짧은 네임 스페이스 버전을 쉽게 사용할 수 있습니다.

이렇게하는 것이 좋은 방법입니까? 다른 더 좋은 방법이 있습니까?

SO에서 C 네임 스페이스에 대한 몇 가지 질문 (예 : 12)이 발견되었지만 프로젝트 차원에서 이름 바꾸기를 해결하는 방법과 관련이 없습니다.

EDIT : 또한 이러한 메커니즘을 사용하여 전체 프로젝트에 대해 긴 네임 스페이스 (예 : 부스트의 이름)를 체계적으로 바꿀 수 있습니다. 현재 내가 번역 단위별로 이렇게

namespace ip = boost::asio::ip; 
namespace ptime = boost::posix_time; 

,하지만 전체 프로젝트에 대한 글로벌 접근 방식을 사용하여 작업을 수행하고 싶습니다 : 예를 들어, 나는 일반적으로 같은 일부 네임 스페이스 이름을 바꿉니다.

+0

이렇게 할 수 있습니다. 또는 더 쉽게 만들 수 있습니다. 모든 네임 스페이스 및 별칭에 대한 프로토 타입을 선언하는 최상위 수준의 머리글이 있어야합니다. 그런 다음 하위 디렉토리에 포함 시키십시오. – Linuxios

+0

@Linuxios 나는 그와 비슷한 것을 생각하고 있었지만, 의존성이 많이 생기게되었습니다. 글로벌 파일을 변경하면 사실상 프로젝트의 모든 파일을 다시 컴파일해야합니다. 즉, 네임 스페이스의 구조가 너무 많이 변경되지 않으면 큰 문제가되어서는 안됩니다. – betabandido

+0

@ 베타 벤 디도 : 아. 신속하고 더러운 해결책은 어떨까요? 전처리 기 매크로! 각 파일에서 앨리어스를 선언하십시오. 이렇게하면 각 파일에 별칭을 지정할 수 있습니다. 예, 사람들은 코드 중복에 대해 파울을 울릴 지 모르지만 항상 빌드 타임 스크립트를 추가하여 사용자를 위해 스크립트를 추가 할 수 있습니다. – Linuxios

답변

1

반복적으로 긴 네임 스페이스 이름을 입력해야하는 경우 네임 스페이스 계층 구조에 문제가 있다고 생각합니다.

클래스와 동일하게 입력하면 반복적으로 obj->sub()->subsub()->some_method()을 입력하는 것으로 가정합니다. 이는 Law of Demeter을 위반하는 것입니다. 클래스의 경우, 래퍼 함수를 ​​작성하여 코드를 리팩터링하여 계층 구조의 클래스가 한 수준 위로 메소드에만 액세스해야합니다.

같은이 네임 스페이스를 수행해야합니다 : 당신이 project::client::core를 호출해야하는 경우 당신은 래퍼 함수를 ​​작성해야/client의 클래스는 project에 필요한 인터페이스를 노출합니다. 장소 전체에서이 작업을 수행해야하는 경우 clientcore이 같은 수준이되도록 네임 스페이스 구조를 병합하지 않는 이유는 무엇입니까?

Boost가 중첩 된 네임 스페이스를 사용한다는 사실은 부분적으로 만 적용됩니다. auxdetail과 같은 대부분의 중첩 된 네임 스페이스는 클라이언트에 의해 호출되지 않아야하기 때문입니다. 예 : Boost.MPL은 중첩 된 네임 스페이스를 불필요하게 노출시키지 않도록주의하는 라이브러리의 좋은 예입니다.

+0

네임 스페이스를 병합하기로 결정했다고 가정 해 보겠습니다. 그래서이 문제를 해결할 수 있습니다. Boost에서 긴 네임 스페이스 문제를 어떻게 해결할 수 있습니까? 나는'boost :: asio :: ip :: tcp :: socket' (또는 유사한 것들)을 타이핑하는 것을 피하고 싶다. – betabandido

+0

@betabandido Boost.Asio에는 네임 스페이스 이름이 지나치게 길어집니다. 최소한 namespace asio = boost :: asio;와 별칭을 사용하여 그 중 일부를 분리하려고 할 수 있습니다. TCP/IP 소켓을 사용하는 저수준 코드에서 네임 스페이스 소켓 = bost : asio :: ip :: tcp :: socket;'예 – TemplateRex

+0

그것은 실제로 내가 지금하고있는 일입니다.하지만 내 질문은 어떻게 프로젝트의 모든 소스 파일을 통해 체계적인 방법으로 그 이름을 바꾸는 것입니다. 체계적인 방법으로이를 수행하는 데는 두 가지 장점이 있습니다. 1) 타이핑 양 감소 (특히 여러 개의 이름 변경이있는 경우) 및 2) 전체 프로젝트에서 일관된 이름 변경. – betabandido

관련 문제