2010-07-21 10 views
1

는 내가이 개 코드 조각을 통해 내 질문에 설명하려고 것 같아요클래스 메서드 구현 : 클래스의 멤버 변수를 변경하거나 인수를 받아야합니까?

// snippet 1 
class FooBar 
{ 
    private int value; 

    public int DetermineSomeResult() 
    { 
     PerformSomeCalculationOnValue(); 
     PerformSomeMoreStuffOnValue(); 

     return value; 
    } 

    public int GetCachedValue() 
    { 
     return value; 
    } 
} 

첫 번째 구현은 기본적으로 개인 정수 멤버에 작동 방법이있다. 모든 계산을 완료 할 때까지

여기 번째 구현의 제 구현

// snippet 2 
class FooBar2 
{ 
    private int value; 

    public int DetermineSomeResult() 
    { 
     int tempvalue =GetCachedValue(); 
     tempvalue = PerformSomeCalculationOnValue(tempvalue); 
     tempvalue = PeformMoreStuffOnValue(tempvalue); 

     SetValue(tempvalue); 
     return tempvalue; 
    } 

    public int GetCachedValue() 
    { 
     return value; 
    } 
} 

있어, 변화는 내부 상태에 이루어지지 않는다. 하나가 더 나은 디자인 현명한?

내가 더 명확하게 두 번째 것을 선호하는 경향이 있습니다. 종속성을 보여줍니다. 그러나 클래스 자체가 이미 계산 된 값을 대상으로하는 클래스 멤버를 저장하기 때문에이를 사용하지 않는 것처럼 보입니다.

이 문제에 대한 의견이 있으십니까?

+0

우려가 스레드 안전합니까? –

+0

아직 없습니다. 내 프로젝트는 현재 스레드에 관련되지 않습니다. – Extrakun

답변

1

를 통해 당신뿐만 단위 테스트하는 기능을보다 쉽게,하지만 당신은 또한을 감소 그 구성원 variabl로 인해 버그가 발생할 가능성 특히 클래스에 이벤트 또는 작업자 스레드 기반 동작이있는 경우에는 순서가 변경됩니다.

그래서 나는 첫 번째보다는 두 번째 예를 들어 보겠습니다.

프로그래밍 언어를 지원하는 경우가 (A C 스타일의 사이비 코드)가되도록 는 또한, 당신이 그 기능을 위해 주어진 변수 유형에 대한 포인터를 사용할 수 있습니다 편집 :

DoSomeWorkOn(pointerto int); 

보다는

int newValue = DoSomeWorkOn(int oldValue); 
1

난 당신이 내가 DetermineSomeResult는() "를 얻을 그것과 유일한 방법을 반환하지 않고 필드"값 "의 새로운 값을 계산에만해야한다고 제안 짧은 Command and state separation

으로 기술 설계 문제에 직면 생각 값이 "매개 변수를 내부 방법을 사용하기보다는 그 클래스의 세계와 같은 클래스 멤버 변수를 처리하여 GetCachedValue()

public void DetermineSomeResult() 
{ 
    PerformSomeCalculationOnValue(); 
    PerformSomeMoreStuffOnValue(); 
    // consider "value" has already been set. 
} 

public int GetCachedValue() 
{ 
    return value; 
} 
1

위의 코드가 주어지면 둘 다 작동합니다.

그러나 여기서 내가 이야기하고 싶은 미묘한 문제가 있습니다. 첫 번째 경우에는 내부 상태가 일관성없는 상태로 유지 될 수 있습니다. PerformSomeMoreStuffOnValue 메서드가 최종 값 상태를 설정하기 전에 Exception을 throw하면이 문제가 발생할 수 있습니다. 두 번째 해결책은 놀 수있는 다른 것들을 고려하지 않고 일관성없는 상태로 두지 않습니다.

관련 문제