2015-01-08 2 views
2

내에서 메소드 인자로 합격 클래스 멤버 변수는 간단한 예제 코드입니다이 아니 최고의 :OOP 디자인 - 여기 클래스

class Car 
{ 
public: 
    void doSomething() 
    { 
    // doing something 
    onEngineFailure(); 
    } 
private: 
    void onEngineFailure() 
    { 
    // Operate on m_Engine 
    } 
private: 
    Engine m_Engine; 
}; 

전달 멤버를 인수로 : 인수를 거치지 않고 멤버 사용

: 첫 번째 예

class Car 
{ 
public: 
    void doSomething() 
    { 
     // doing something 
     onEngineFailure(m_Engine); 
    } 
private: 
    void onEngineFailure(const Engine& engine) 
    { 
    // Operate on engine 
    } 
private: 
    Engine m_Engine; 
}; 

는 방법 onEngineFailure 클래스의 멤버 변수 m_Engine에서 직접 동작한다. onEngineFailure이 작동하는 엔진과 엔진을 하나만 가질 수 있으므로 함수 인수로 전달할 필요가 없습니다. 항상 m_Engine입니다.

두 번째 예에서 메서드 onEngineFailure은 인수로 전달 된 엔진에서 작동합니다. 어쨌든 항상 m_Engine이 될 것입니다.

그럼 어느 디자인이 더 정확합니까? 메서드가 이미 멤버 변수에 액세스하고 있고 메서드가 항상 해당 변수에서만 작동하는 경우 인수로 인수를 전달하는 이유는 무엇입니까? 그러나 글로벌 변수에 대해서는 동일하지만 글로벌 변수는 가능한 한 최소한 사용해야합니다.

+2

나는 1 하나 더 말하고 싶지만. –

답변

3

그래서 어느 것이 더 정확합니까? 메서드가 이미 멤버 변수에 에 액세스하고 항상 해당 변수에서만 작동하는 경우 을 인수로 전달하는 이유는 무엇입니까?

정확히. 그러나 1

는 같은 특정 객체 인스턴스에 연결 변수를 제외하고

다른 인스턴스로부터 분리 된 상태를 유지하게됩니다 전역 변수에 대해 말할 수있다, 그 일관성은 개체 수준에서 관리됩니다. 캡슐화 덕분에이를 숨기고 올바르게 사용되었는지 확인할 수 있습니다.

모든 변수는 RAM에 있지만 글로벌 변수입니까? 그것이 중요하다고 생각하는 사람들 사이의 논리적 구분이기 때문입니다. 이 예에서


1 , 그것은 아마 훨씬 이해가되지 않습니다. 그러나 함수의 기능이 다른 클래스에서도 사용되기에 충분하다면 자유 함수 또는 정적 공용 함수로 만들 수 있습니다. 함수를 정적으로 만드는 기능은 때때로 다른 이유로도 중요 할 수 있습니다. 이러한 경우 명시 적 (때로는 직접 this) 인수를 사용하여보다 쉽게 ​​/ 더 쉽게 만들 수 있습니다.

+1

각주로 답변을 보완하려고했습니다. 나는 동의한다. –

+0

동의 함, IMHO,이 강의의 향후 단계에 대해서는 http://www.ndepend.com/docs/code-metrics#LCOM도 고려해야합니다. 클래스의 메소드는 정의 된 속성을 사용해야합니다. –

0

첫 번째 코드 스 니펫은 우아하고 깨끗합니다. 멤버 함수는 데이터 멤버에 액세스 할 수 있기 때문에 데이터 멤버를 인수로 전달할 필요가 없습니다.

외부 입력을 기반으로 데이터 멤버 (m_Engine)의 상태를 변경하려면 (엔진) 유형의 인수가 필요합니다. 다음과 같은 방식으로 진행됩니다.

void doSomething(Engine engine) 
{ 
    // doing something 
    onEngineFailure(engine); 
} 
void onEngineFailure(const Engine& engine) 
{ 
    // copy it here say m_Engine.model=engine.model; 
}