6. Namespaces and Modules

네임스페이스와 모듈을 알아보자.

57. Keep a type and its nonmember function interface in the same namespace.

비멤버도 함수이다. 비멤버 함수는 클래스 X의 인터페이스의 일부로 설계될 경우 (연산자들과 헬퍼 함수들) 올바르게 불리기 위해 X와 같은 네임스페이스에 있어야 한다.

58. Keep types and functions in separate namespaces unless they’re specifically intended to work together.

이름 찾기 사고를 방지하라. 의도치 않은 인자 의존적 찾기로부터 타입을 분리하라 (ADL, Koenig 찾기라고도 한다) 그리고 의도적인 ADL을 그들의 고유 네임스페이스에 둠으로써 유도하라 (그들의 직접 연관된 비멤버 함수들과 함께). 타입을 템플릿화된 함수나 연산자로서 같은 네임스페이스에 넣는 것을 피하라.

59. Don’t write namespace usings in a header file or before an #include.

네임스페이스 using은 당신의 편의를 위한 것이지 타인과 충돌을 하기 위한 것이 아니다. using 선언이나 using 지시자를 #include 앞에 넣지 마라. 따름정리: 헤더 파일에서는 네임스페이스 수준 using 지시자나 using 선언을 쓰지 마라. 대신 명시적으로 네임스페이스를 모든 이름에 써라. (두 번째 룰은 첫 번째 룰로부터 따라온다. 왜냐하면 헤더들은 그들 이후에 다른 헤더들이 #include하는 것이 무엇인지 알 수 없기 때문이다.)

60. Avoid allocating and deallocating memory in different modules.

무언가를 찾았으면 거기서 되돌려 놔라. 한 모듈에서 메모리를 할당하고 다른 모듈에서 이를 해제하는 것은 이 모듈간 긴 거리 의존성을 만듦으로써 당신의 프로그램을 불안정하게 한다. 이들은 같은 컴파일러 버전과 같은 플래그 (특히 debug vs NDEBUG)와 같은 표준 라이브러리 구현과 함께 컴파일되어야 한다. 그리고 실제로 메모리를 할당하는 모듈은 해제가 일어날 때 로드되는 것이 좋다.

61. Don’t define entities with linkage in a header file.

반복은 비대함을 낳는다. 네임스페이스 레벨 변수나 함수를 포함하는 연결을 가진 독립체는 그들을 위한 메모리를 할당받아야 한다. 그런 독립체를 헤더 파일에 정의하는 것은 링크 시점 에러나 메모리 낭비를 낳는다. 연결을 가진 독립체는 구현 파일에 넣어라.

62. Don’t allow exceptions to propagate across module boundaries.

이웃의 정원에 돌을 던지지 말라. C++ 예외 처리에는 범용적인 바이너리 표준은 없다. 당신이 컴파일러와 컴파일러 옵션이 양쪽을 빌드하도록 제어하지 않는다면 예외가 두 코드 조각 사이에 전염되도록 하지 마라. 그렇지 않다면 모듈들은 예외 전염에 대해 호환 가능한 구현을 지원하지 않을 수 있다. 구체적으로, 이는 다음과 같다: 예외가 모듈/부분시스템 경계를 넘어 전파되도록 하지 마라.

63. Use sufficiently portable types in a module’s interface.

모듈의 가장자리에서는 특별히 신경써라. 모든 클라이언트가 타입을 정확하게 이해할 수 있다는 보장을 할 수 없다면 타입이 모듈의 외부 인터페이스에 등장하도록 하지 마라. 클라이언트가 이해할 수 있는 가장 높은 수준의 추상화를 사용하라.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중