2016-10-25 4 views
1

나는 도서관을 쓰고있다. 이름이 같은 두 개의 클래스가 있지만 각각의 클래스가 다른 네임 스페이스에있는 것은 나쁜 생각입니까?다른 이름 공간에 같은 이름의 클래스

사용하여 이름 공간 :

//forward declaration 
namespace sparse { 
    class matrix; 
} 
namespace dense { 
    class matrix; 
} 

namespace dense { 
    typedef Index uint64_t; 
    class matrix { 
     public: 
     sparse::matrix tosparse(); 
    }; 
} 

namespace sparse { 
    typedef Index uint32_t; 
    class matrix { 
     dense::matrix todense(); 
    }; 
} 

또한, 나는 긴 이름을 사용할 수 있습니다

class sparse_matrix 
... 
+2

라이브러리의 사용자가'namespace *; '를 사용하지 않는 것으로 신뢰합니까? 대답이 '아니오'이면 매우 안전하지 않습니다. 나는 그저 긴 이름을 사용할 것이다. 어쨌든 그렇게 오래 걸리지 않습니다. – DeiDei

+0

@DeiDei가 말한 것을 확장하면 실제로 사용법에 달려 있습니다. 필자의 견해로는 이들이 함께 사용될 수도 있고'dense :: matrix'와'sparse :: matrix'는'dense_matrix'와'sparse_matrix'보다 길다. –

+0

개인적으로 필자는 긴 네임 스페이스의 별명을 지정하고 라이브러리를 사용할 때'namespce *;를 사용하지 않을 것입니다. 그러나 나는 그것이 일어날 수 있다고 생각합니다 ...... –

답변

4

일반적으로 괜찮습니다. 그것이 바로 네임 스페이스가 필요한 것입니다. 이 예제에서는 디자인 목표가 무엇인지 명확하지 않으므로 이것이 네임 스페이스의 적절한 사용인지 여부는 명확하지 않습니다.

+0

나는 'aaa :: bbb :: ccc'에서'abc'와 같은 네임 스페이스를 별칭으로 지정할 수 있기 때문에 네임 스페이스를 더 쉽게 사용하려고 시도했다. 2. aaa_range, aaa_iterator 등에서'aaa_Index_type'을 12 번 반복하는 것은 재미 있지 않기 때문에 더 적은 타이핑이 필요하다. 네임 스페이스에서는 한 네임 스페이스의'a','iterator','Index_type' 만 있습니다. 나는'aaa :: bbb :: ccc'를'aaa_bbb_ccc '로 다시 바꾼 다음'aaa_range'에서 public'typedef aaa_Index_type Index_type'을 사용합니다. 'aaa_bbb_simd_parallel'과 같은 긴 클래스 이름은 쓰기 나 사용에 불편하며 여전히 문제입니다. –

+0

cpp 핵심 가이드 라인에 따르면 기본 클래스와 동일한 네임 스페이스에 도우미 함수를 두는 것이 좋습니다 (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-helper). 나는 메인 클래스와 도우미 클래스를 같은 이름 공간에 넣을 것이라고 생각한다. –

0

네, 그것은 나쁜 생각이다.

  1. 하나 이상의 네임 스페이스가 포함될 수 있습니다. 그래서 이것은 sparse :: matrix 대 dense :: matrix를 작성하는 데 그쳤습니다.
  2. 투명도가 왕이다. sparse_matrix은 해당 개체의 동작을 알려줍니다.
  3. 그들은 클라이언트에 유사한/동일한 유틸리티를 제공합니다. 왜 다른 네임 스페이스입니까?

공통 기반을 갖기를 원할 경우 상속을 수행하십시오 (추상화 또는 비순환 화).

+0

'Sparse_matrix_stride_range'와 같이'Sparse_matrix_stex_iterator'와'Sparse_matrix_index_type','Sparse_matrix_capacity.col','Sparse_matrix :: Sparse_matrix (const Sparse_matrix_capacity & capacity); 등입니다.하지만 동의합니다. 최소한 사용자에게. –

+0

@throw_away_account 다른 문제입니다. typedef를 소개하거나 선언을 사용하여이를 단순화 할 수 있습니다. –

+0

하지만 네임 스페이스 사용을 지원합니다. http://softwareengineering.stackexchange.com/questions/50120/best-practices-for-using-namespaces-in-c 중첩 된 네임 스페이스는 앞으로 선언이 거의 없기 때문에 유지하는 것이 매우 힘듭니다. 불가능한. –

관련 문제