문제

누군가가 나에 대해서는 C++스타일에 차이 자신의 팀이 있습니다.나는 내 자신의 관점에서 피사체하지만,내가 관심이 있을 것으로 장점단점 에서 나오는 모든 사람.

그래서,경우에 당신은 클래스를 제공하려는 노출을 통해 두 getter,하나의 읽기/쓰기,다른,readonly(i.e없음 방법 설정).적어도 두 가지 방법으로 그 일의:

class T ;

class MethodA
{
   public :
      const T & get() const ;
      T & get() ;

      // etc.
} ;

class MethodB
{
   public :
      const T & getAsConst() const ;
      T & get() ;

      // etc.
} ;

무엇이 될 것이 장점과의 각 방법의 단점은?

관심이 있어요 더하여 C++기술/의미론적 이유는,그러나 스타일의 이유 있는 환영,너무입니다.

Note MethodB 하나의 주요 기술적 단점(힌트:에서 일반적인 코드).

도움이 되었습니까?

해결책

하게 하는 것은,getAsConst 호출될 때는'이'포인터가 const 지를 수신 할 때 const 개체입니다.그래서 함께 다른 어떤 문제,그것은 미묘하게 잘못된 이름.(호출할 수 있습니다 여전히 그 때'이'은 비상수지만,도.)

을 무시하고는,getAsConst 벌고 당신에게 아무것도 넣는 부당한 부담을 사용하여 개발자 인터페이스입니다.대화"get"을 알고 그는 그 무엇이 필요,지금 그는지 여부를 확인하거나지 않은 그는 현재 사용하 const 변수,그리고 새로운 객체에는 잡아야 합 const.나중에는 경우에,두 개가수로 인해 일부 refactoring 하는 스위치 그의 호출합니다.

다른 팁

C++해야 완벽하게 할 수 있에 대처하는 방법에 거의 모든 상황입니다.나는 항상 그것을 사용하고 나가지 문제가 있었다.

방법 B 입니다 내 의견의 경우 위반 OnceAndOnlyOnce.고,지금 당신이 가야 할 것인지 여부를 알아를 다루고 있어 const 참조 코드를 작성하고 컴파일되는 첫 시간입니다.

나이 양식의 것-기술적으로 그들 모두가 작동하지만,methoda 의하게 컴파일러 작업을 조금 어렵습니다.나를 위해,그것은 좋은 일입니다.

개인적으로,내가 선호하는 첫번째 방법이기 때문에,그것은 더 많은 일관된 인터페이스입니다.또한,나 getAsConst()소리에 대한 서로 getAsInt().

에서 다루고,당신은 정말 하기 전에 두 번 생각 반환 비 const 참조 또는 non-상수 포인터를 데이터의 구성원이 당신의 클래스입니다.이것은 초대한 사람들을 악용하의 내부 동작을 하는 클래스 이 숨겨진해야합니다.다시 말해서 그것을 나누기를 캡슐화합니다.내가 사용하는 것을 얻을()const 및 집합()에 돌아와 비-const 참조하는 경우에만 다른 방법이 없을 때 또는 그것은 정말 의미와 같은 읽기/쓰기 권한을 배열의 요소 또는 매트릭스입니다.

주어진 스타일을 선례를 설정한 표준 라이브러리(즉,시작()및 begin()const 하는 이름 중 하나 예),명백하게 알 수 있는 방법이 올바른 선택이 될 것입니다.내가 질문을 한 사람의 정신을 선택 하는 방법 B.

그래서 첫 번째 스타일은 일반적으로 바람직합니다.

우리가 사용하여 변화의 두 번째 스타일을에서 꽤 codebase 나는 현재에서 작업하기 때문에,하지만 우리가 원하는 큰 차이 const 및 비 const 사용합니다.

서 특정 예를 들어,우리는 getTessellation 및 getMutableTessellation.그것의 구현으로 복사 포인터이다.성능상의 이유로 우리가 원하는 const 버전을 사용 가능한 어디든지,이렇게 우리들에게 이름,짧은 그리고 우리가 그것이 다른 이름을 그래서 사람들이지 않는 실수로 원인을 복사본을 때 그들은하지 않을 어쨌든 쓰.

면서 나타나는 당신의 질문을 해결 방법 중 하나,나는 행복할 것이 내 입에서는 스타일입니다.개인적으로,한 스타일을 이유로 내가 선호하였습니다.가장 Ide 나타납까지 유형의 서명이 기능을 위해 당신입니다.

내가 선호하는 것이 처음이 아니다.그것은 외모에서 더 나은 코드는 때는 두 가지 기본적으로 같은 일을 똑같이 보입니다.또한,그것은 희귀한 있는 당신을 위한 비 const 개체 하지만 부르고 싶 const 방법,그래서 그는지의 경고:등급이 부여되지 않는(최악의 경우에,당신은 필요 const_cast<>).

첫 번째 수 있 변경변수 유형(지 const 지)추가로 수정하지 않고의 코드입니다.물론,이것이 없다는 것을 의미한 통지를 개발자는 이 변경되었을 수 있는 의도에서다.그래서 그것은 정말 당신 값을 수있는 빠르게 리팩터,또는 여분의 안전 net.

두 번째 하나가 관련된 헝가리의 표기는 나 개인적으로 다음과 같다 그래서 나이와 막대기 첫째 방법입니다.

내가 좋아하지 않아 헝가리 표기에 추가하기 때문에 중복되는 내가 일반적으로 미워하에서 프로그래밍입니다.그것은 단지 나의 의견입니다.

때문에 당신의 이름을 숨기는 클래스,이에 대한 생각을위한 음식일 수 있습니다 또는 적용되지 않을 수 있습니다:

그것이 의미하는 말이 두 개체 methoda 의고 methodb 에,"얻는"또는"getAsConst"?신"get"또는"getAsConst"으로 메시지 중 하나가?

방법은 내가 그것으로,사람이 보낸 메시지/사소통의 방법 당신 은 값을 가져;그래서 이에 응답하여"얻는"메시지를 보내고 있는 어떤 메시지를 methoda 의/methodb 에는 결과가 필요로 하는 가치를 얻을 수 있습니다.

예제:신되는 경우 methoda 의,말,서비스에 SOA 및 methoda 의 저장소,그 안에는 서비스의 get_A()호출 methoda 의.find_A_by_criteria(...).

주요 과학 기술의 단점 methodb 에 봤을 때 적용하는 일반적인 코드,그것을 우리는 더블 코드를 모두 처리 const 및 비 const 버전입니다.예를 들어:

말 T 주문할 수 있체(즉,우리는 비교할 수 있는 객체의 T 형식으로 통신수 <고),하자 말로는 우리를 찾고 싶어 최대 사이에 두 개의 methoda 의(resp.두 methodb 에).

에 대한 methoda 의,우리가 필요한 코드:

template <typename T>
T & getMax(T & p_oLeft, T & p_oRight)
{
   if(p_oLeft.get() > p_oRight.get())
   {
      return p_oLeft ;
   }
   else
   {
      return p_oRight ;
   }
}

이 코드는 모두 작동 가 const 체 및 비 const 물체의 형 T:

// Ok
const MethodA oA_C0(), oA_C1() ;
const MethodA & oA_CResult = getMax(oA_C0, oA_C1) ;

// Ok again
MethodA oA_0(), oA_1() ;
MethodA & oA_Result = getMax(oA_0, oA_1) ;

문제는 우리가 원하는 때에 적용하기 쉬운 이 코드를 무언가가 다음 methodb 에 컨벤션:

// NOT Ok
const MethodB oB_C0(), oB_C1() ;
const MethodB & oB_CResult = getMax(oB_C0, oB_C1) ; // Won't compile

// Ok
MethodA oB_0(), oB_1() ;
MethodA & oB_Result = getMax(oB_0, oB_1) ;

에 대한 methodb 에 모두에서 작동하 const 및 비 const 버전을,우리는 모두 사용하여 이미 정의된 getMax 지만,그것에 추가로 다음 버전의 getMax:

template <typename T>
const T & getMax(const T & p_oLeft, const T & p_oRight)
{
   if(p_oLeft.getAsConst() > p_oRight.getAsConst())
   {
      return p_oLeft ;
   }
   else
   {
      return p_oRight ;
   }
}

결론적으로,신뢰하지 않음으로써 컴파일러에 const-사용하여,우리는 부담을 자신의 생성과 두 개의 일반적인 기능을 할 때 해야 하나 충분히 있었다.

물론,충분히 편집증,the secondth 템플릿의 기능을 가지고 있어야라고 getMaxAsConst...따라서,문제를 전파하는 것 자체를 통해 모든 코드를...

:-p

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top