2012-10-25 2 views
0

getter/setter를 구현해야 할 필요가 있다고 가정합니다. (종종 나쁜 디자인을 나타 내기 때문에 가능하면 피하려고합니다.) 다음 두 가지 유형 중 어느 것이 더 좋으며 각각의 의미는 무엇입니까?게터 메소드의 권장되는 서명은 무엇입니까?

가능성 (1) :

class Foo; 
class Bar 
{ 
public: 
    const Foo& getFoo() const {return foo_;} 
private: 
    Foo foo_; 
}; 

또는 (2) : 나는 좀 더 직관적으로 찾을 수 있기 때문에 개인적으로

class Foo; 
class Bar 
{ 
public: 
    void getFoo(Foo& foo) const {foo = foo_} 
private: 
    Foo foo_; 
}; 

, 나는 항상 첫 번째 변종 사용합니다. 두 번째 변형에서는 getFoo를 호출하기 전에 getFoo의 결과를 보유 할 Foo 객체를 생성 한 다음 getFoo를이 객체에 대한 참조로 전달해야합니다. 이 변종은 나에게 반 직관적이라고 느끼지만, 두 번째 변종을 선호하는 사람들이 있습니다. 어떤 이유로 첫 번째 것보다 두 번째 변종이 더 우수할까요?

+11

저는 직감을 지으며 "none"이라고 말 할 것입니다. 'Foo const & getFoo() const'를 고려 했습니까? –

+1

두 번째 버전 w.r.t의 동작을 원한다면'Foo & getFoo()'에 추가하십시오. 당신의 레퍼런스의 가변성 (기술적으로 당신의 2는'const'-conformant가 아니므로 어쨌든이 트릭을 적용해야합니다). –

+1

나는 게터와 세터가 나쁜 디자인을 나타내는 것에 대해 혼란스런 유일한 사람입니까? – Mitch

답변

7

출력 인수는 형사 범죄로 간주됩니다. 사용하기가 더 어렵지만 특히 코드에서 볼 수 없기 때문에 관리하기가 훨씬 더 어렵습니다. 무언가가 지정되면 분명합니다. 메소드가 객체에서 호출되는 경우 변경 될 수 있습니다. 그러나 함수에 전달 된 경우에만 정상적인 유지 관리 프로그래머가 수정되는 것으로 의심하지 않습니다. 게다가 대부분의 경우 임시 변수가 값을 받아들이라는 선언을위한 여분의 라인이 필요합니다.

이런 종류의 일은 주로 C89에 멈춰서 어떻게 든 C++ 구문을 배운 사람들이 작성합니다. 그러나 C++ ++의 elion 복사와 C++ 11의 의미 이동은 코드를 읽기가 더 어렵게 만드는 데는 유효한 이유가 없습니다.

물론 구성원을 반환하는 경우에는 const 참조를 반환 할 수 있습니다. 값이 계산되면 값으로 반환하고 복사 elion이 대부분의 시간을 처리합니다.

0

물론 일반적으로 첫 번째 변형이 바람직합니다. RVO (Return Value Optimization)로 인해 반환 된 객체가 복사되지 않고 성능 오버 헤드가 없기 때문에 두 번째보다 덜 효과적입니다.

전달 된 객체에 대한 예비 설정이 필요하거나 일부 사본을 사용해야하는 경우 두 번째 변형이 더 좋을 수 있습니다. 그러나 이것은 더 이상 사소한 getter가 아니며, 다른 의미로는 다른 기능을합니다.

두 번째 변형을 사용할 수있는 또 다른 이유는 전달 된 객체를 보유 클래스에서 직접 생성 할 수없는 경우입니다 (예 : 그 생성은 일부 팩토리에 의해 캡슐화되고 클래스를이 팩토리에 종속시키지 않기를 원할 것입니다.

0
const Foo& getFoo() const {return foo_;} 
관련 문제