2010-05-20 3 views
4

가변 세분성 일일 일정으로 시간 슬롯을 모델링 한 클래스를 만들었습니다. 예를 들어 첫 번째 시간 슬롯은 30 분이지만 두 번째 시간 슬롯은 40 분, 첫 번째 사용 가능한 슬롯은 (1과 비슷한 값으로) 시작합니다.C++ : 클래스의 최대/최소 한계 정의

지금하고 싶은 것은이 클래스에서 허용되는 최대 및 최소 허용 값을 어떻게 든 정의하는 것입니다. 두 가지 실질적인 질문이 있습니다. do :

1. 맞춤 클래스에 대해 절대 최소값과 최대 값을 정의하는 것이 이치에 맞습니까? 또는 클래스의 정의 된 관계 연산자가 min을 정의하도록 주어진 값이 항상 다른 유형의 가능한 값보다 낮게 비교하는 것으로 충분합니까?

2. 이전 질문에 "예"(또는 "그렇지만 ...")를 모델로 한 대답이 있다고 가정하면 은 최대/분을 어떻게 정의합니까? 나는 std::numeric_limits<>이 있다는 것을 알고 있지만, 내가 읽은 것은 "숫자 형"을위한 것입니다. 이를 "숫자로 표현 된"의미로 해석 할 수 있습니까? 아니면 "숫자로 표현"또는 "정수와 일치하는 것"과 같이 더 넓은 가정을 할 수 있습니까? 결국, 날짜 클래스와 사전 클래스의 최소값과 최대 값을 정의하는 것이 타당하지만, numeric_limits은 그러한 용도로 사용되지 않을 수도 있습니다. (나는 그것에 대해 많은 경험이 없습니다). 또한 numeric_limits에는 많은 회원과 정보가있어서 무엇을 만들지 모르겠습니다. 이 아니면 numeric_limits을 사용하면 C++에서 클래스에 사용할 수있는 값의 범위를 나타내는 다른 잘 알려진 널리 사용되는 메커니즘은 무엇입니까?

답변

1

최소값과 최대 값을 반영하는 const 정적 멤버를 만들면됩니다.

2

질문에 대한 느낌이 잘못되었습니다. 나는 당신이 요구하는 것은 클래스의 도메인 (그것을 먹을 수 있고 이해할 수있는 데이터)에 대해 독단적인지, 만약 그렇다면 독단적 인 방법인지에 대해 생각하는 것입니다.

첫 번째 질문은 매우 명확합니다. 예, 물론입니다. 당신은 수업을 "올바르게 사용하기 쉽고 잘못 사용하기가 어렵습니다."라고 원합니다. 여기에는 학급의 고객에게 뭔가 잘못되었을 때 알려주는 것이 포함됩니다.

덜 명확한 대답이 있습니다. 대부분의 경우 assert() 함수를 사용하여 함수 나 클래스의 도메인을 선언하기 만하면됩니다. 다른 경우에는 예외를 던지기를 원할 것입니다. 때로는 둘 다하고 싶을 때가 있습니다. 성능이 문제가 될 수있는 경우가 아닌 인터페이스를 제공하려는 경우가 있습니다. 일반적으로 클래스 나 함수에 피드를 제공하기 전에 클라이언트가 유효/유효하지 않은 입력을 알 수 있도록 최소한 점검 할 수있는 인터페이스를 제공하려고합니다.

예외를 던지면 스택 정보가 손상되고 디버깅이 어려워 질 수 있지만 빌드 중에 만 발생하고 계산을 수행하거나 일을 수행하지 못하도록 실제로 아무것도 수행하지 않기 때문에 충돌 또는 데이터 무효화의 원인이 될 수 있습니다. 따라서 asserting 및 throw하는 것이 가장 좋은 대답이기 때문에 테스트하는 동안 디버깅 할 수 있지만 사용자가 버그를 선반에 맞출 때 사용자를 보호 할 수 있습니다.

클래스의 경우 최소/최대를 제공하는 몇 가지 방법을 고려해보십시오. 하나는 클래스 인터페이스에 최소/최대 기능을 제공하는 것입니다. 또 다른 기능은 외부 기능을 사용하는 것일 수 있습니다. 그렇습니다. numeric_limit는 범위가 숫자 수량 유형이기 때문에 숫자 일 수도 있습니다. 적절한 비교를 할 수 있도록 클래스에 validate_input() 함수가있는보다 일반적인 인터페이스를 제공 할 수도 있습니다.

질문의 두 번째 부분에는 개인적인 취향을 비롯한 다양한 변수에 따라 유효한 답변이 많이 있습니다.

+0

답변을 주셔서 감사합니다. 그리고 네, 저는 때때로 너무 장황하다고 생각합니다. 그러나 당신은 그것에 문제가없는 것 같았고 제가 가고 싶었던 곳에 정확하게갔습니다. 예, "내 수업의 도메인에 대해 단정적"으로하고 싶습니다. 나는 asserts를 사용하는 데 많은 어려움을 겪지 않거나 코드를 망치지 않기 위해 시도하거나 잡으려고한다. 나는 단지 두 가지를 원한다. 즉 내 클라이언트에게 같은 (또는 비슷한) 정보를 제공 할 수 있어야한다. 그들은 또한 그에 따라 결정을 내릴 수 있으며 그 정보는 자연스럽게 제공 될 수 있습니다. 일반적인 유효성 검사 인터페이스를 제공하는 데 도움을 주셔서 감사합니다. – luismachuca

2

일정/슬롯 코드의 설계자는 원하는 유연성/실용성에 달려 있습니다.

두 가지 간단한 방법은 그 클래스

const long MIN_SLOT = 1; 
const long MAX_SLOT = 999; // for example 

에 자신의 값을 정의 또는 정의

모든 것 열거의
class SchedLimits{ 

public: 
const static long MIN_SLOT = 1; 
const static long MAX_SLOT = 999; 
} 

간단한을 보유하고 다른 클래스를 정의 중 하나가 될 것입니다. (저에게 상기시켜 준 작성자에게 감사드립니다.)

enum {MIN_SLOT = 1, MAX_SLOT = 999}; 
+0

가장 간단한 방법이 거의 항상 최고입니다. – Crashworks

+0

... enums :'enum {MIN_SLOT = 1, MAX_SLOT = 999} '를 사용하는 것이 더 좋으며 컴파일 타임에 사용할 수 있습니다. –

+0

enums도 좋은 생각입니다. 나는 그것을 반영하기 위해 나의 대답을 편집 할 것이다. –