2010-03-01 2 views
1

저는 모델 기간에 정수를 사용하는 다른 API를 다루고 있습니다. 오직 그들은 유닛들에 동의하는 것처럼 보이지 않습니다. 때로는 초이고 때로는 밀리 초입니다.객체 지향 방식으로 지속 시간을 모델링하는 방법은 무엇입니까?

내가 찾던 오류를 피하는 가장 좋은 방법은 헝가리 표기법 인 durationInMillis, durationInSeconds 등을 사용하는 것입니다.

모델링 기간이 더 좋고 실제로 OO 방식이 아닌지 궁금합니다. 타입 시스템이 실수로 지속 시간을 밀리 세컨드로 처리하는 실수를 피할 수있게 해주는 것입니다.

답변

2

각 기간에 별도의 클래스를 지정하고 계산에 사용 된 신뢰할 수있는 형식으로 밀리 초를 사용합니다. 즉, 두 클래스 모두에서 오버로드 함수 getMilliSeconds()을 사용하십시오.

class Duration 
{ 
... 
    virtual const unsigned long long getMilliSeconds() const; 
... 
} 

class MilliSeconds : public Duration 
{ 
... 
}; 

class Seconds : public Duration 
{ 
... 
}; 

나노 세컨드가 더 나은 권위있는 표현이 될 수 있지만 더 세분화되어 있어야 할 수도 있습니다. 아무리해도 낮은 세분성의 클래스를 추가하는 것은 문제가되지 않습니다 (예 : 시간 또는 일).

편집 : 영감을 얻으려면 boost::date_time을 보길 원할 것입니다. 매력적인 독서물입니다. 애플의 코코아에서

2

물론이 : 바람직 읽기 (

class Duration 
{ 
    public static Duration FromSeconds(int seconds) 
    { 
     // ... 
    } 

    public static Duration FromMilliseconds(int milliseconds) 
    { 
     // ... 
    }   
} 

이 클래스는 단일 제공해야한다 : 지속 시간을 나타내는 초 및 밀리 초에서 Duration 클래스의 인스턴스를 생성하는 팩토리 메소드의 몇 던질 것이다 클래스를 생성 -only) 속성을 사용합니다 (예 : Milliseconds). 특정 인스턴스에 캡슐화 된 밀리 초를 반환합니다.

또한 Seconds 속성을 사용할 수 있습니다.

여기서 암시적인 변환 연산자는 (컴파일러가 허용하는 경우) 피할 수 있습니다. 왜냐하면 여기서만 문제가 복잡하기 때문입니다.

영감을 얻으려면 TimeSpan을 살펴보십시오 (또는 .NET에있는 경우 모두 사용하십시오).

+1

+1 이것을 ** 값 개체 ** 패턴이라고합니다. –

+0

나는 그것을 봤지만 당신과 맞는 Value Object Pattern의 정의를 찾을 수 없다. 근원이 있니? – KaptajnKold

0

는 기간의 유형은 NSTimeInterval이며, 이중 다음과 같이 정의된다

typedef double NSTimeInterval; 

이 그것은 초 단위로 표시되어 10000 년 동안 서브 밀리 초 정밀도를 가지고있다.