"get()const"대."getAsConst()const"
-
01-07-2019 - |
문제
누군가가 나에 대해서는 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