2013-01-20 2 views
-1

값이 유한 범위 인 멤버가있는 클래스가 있습니다. 예 :입력을 검증하는 좋은 방법은 무엇입니까?

class Sphere 
{ 
public: 
    void setRadius(double radius) 
    { 
     m_radius = radius; 
    } 

private: 
    double m_radius; // must >= 0. 
}; 

반경을 입력하는 대화 상자도 있습니다. 반경 검증을 setRadius() 메소드에서 확인하거나 대화 상자를 체크 인 할 수 있습니다. 어느 쪽이 더 낫습니까? 이것은 꽤 일반적인 문제로 보인다. 일반적인 방법 또는 최선의 방법은 무엇입니까? 감사.

답변

1

OOP에서는 일반적으로 유효성 검사가 수행되고 값이 허용 범위를 벗어나는 경우 예외가 throw됩니다.

그러나, 당신이 클래스에 대한이 일을하고 아직 예외를 잡기/던지기에 대해 알고 기대하지 않는 경우, 당신은 두 가지 중 하나를 수행 할 수

  1. 이 함수는 int를 반환 한 인수가 범위 내에 있으면 함수는이를 나타내는 값을 반환합니다. 그렇지 않으면 함수는 인수가 범위 내에 있지 않음을 나타내는 값을 반환합니다. 이 같은

뭔가 : "반경"의 인수가 범위 내에 있지 않은 경우 m_radius에 저장된 값을/시작 변경하지 않는

bool setRadius(double radius) 
{ 
    if(radius >= 0) 
    { 
     m_radius = radius; 
     return true; 
    } 
    else return false; 
} 

알 수 있습니다. m_radius의 값을 받아 들일 수없는 값으로 변경하는 것은 아무런 소용이 없습니다. 시간 낭비입니다.

  1. 메인() ("대화 상자에서"?당신이 예외에 대한 자세한 내용을 알고 싶다면)

, 당신은 예외가 무엇의 더 큰 이해를 위해이 페이지를 참조 할 수 있습니다 : http://www.cplusplus.com/doc/tutorial/exceptions/

그래서, 내가 ++ 및 결론,이 협약은 그것을 확인하는 것입니다 값이 허용 범위를 벗어나면 메서드에서 예외를 throw하도록합니다. 수업 시간에 예외를 아직받지 못했다면 수업을받을 필요가 없을 수도 있습니다. 행운을 빈다. :)

+0

당신이 추천하는 웹 사이트는 잘못되었거나 잘못된 문서로 유명합니다. –

+0

정말요? 나는 그것을 많이 언급한다. – user1899020

1

반경 검증을 setRadius() 메소드에서 점검하거나 대화 상자에서 을 점검 할 수 있습니다. 어느 쪽이 더 낫습니까?

시스템이 실제로 작고 GUI가 비교적 간단한 경우 대화 상자 클래스에서 입력을 확인할 수 있습니다. 다른 해결책은 사용자 입력을 검사하는 입력 검증 정책으로 3 등급을 제공하는 것입니다.

다음은 매우 간단한 demostration 코드입니다. 템플릿을 사용하여 다른 GUI에 대해 다른 정책을 설정할 수 있습니다.

class CheckPolicy 
{ 
public: 
    CheckPolicy() {} 

    virtual bool ValidInput(double f) 
    { 
    return f > 0; 
    } 
}; 

class GUI 
{ 
public: 
    GUI(){} 
    void GetInput() 
    { 
     float f = 1.0f; 
     if (policy_.ValidInput(f)) 
     { 
     sphere_.setRadius(f); 
     } 
    } 
private: 
    CheckPolicy policy_; 
    Sphere  sphere_; 
}; 
3

나는 설정 방법은 사용자 입력을 기반으로 호출됩니다 가정합니다. 그렇다면 예외적 인 값이 제공되면 set 메소드가 예외를 throw하는 일반적인 방법이 있습니다. 예외는 UI 전체로 전달되어야합니다.

0

제 생각에는 너무 많은 객체 지향입니다. 2/3 이하의 변수에 대해서는 getter-setter 및 개인 데이터가있는 클래스를 만들지 않습니다. 이는 의미가 없습니다. 불필요한 코드가 많이 필요합니다.

UI 앞면에서 데이터 유효성 검사를 수행하는 것이 좋습니다 (예 : DoDataExchange).

데이터를 보관하고 데이터 유효성 검사를 수행하는 클래스를 고안해야하는 경우 템플릿을 사용하십시오!

+0

나는 귀하의 방법에 매우 흥미가 있습니다. 저는 여러 멤버들과 함께 많은 수업을 가지고 있습니다. 그 사람들을 공개하게 하시겠습니까? 템플릿을 사용하여 데이터를 저장하고 데이터 유효성 검사를 수행하는 매우 간단한 예를 보여줄 수 있습니까? 고마워요 !! – user1899020

+0

먼저 UI에 무엇을 사용하고 있는지 (질문에) 알려주십시오. MFC? Win32? Qt? 몇 가지 코드를 보여주세요! – Ajay

+0

Qt를 사용할 계획이며 설계 단계에 있습니다. – user1899020

1

나는 여기 나머지 방법과 다른 방법을 제안합니다. 나는 거기에 가치를 저장하고 싶습니다. 대신, 내 수정 구슬을 보면, 구체에 Render(Image& target) 함수를 호출하면 모든 매개 변수가 맞는지 확인할 수 있습니다. 또한 렌더링 할 때 구체가 이미지의 경계 내에 있는지 확인하는 동안 반지름이 setter의 음수가 아닌 float인지 확인하는 혼합 식 접근이 가능합니다.

는 접근 방식에 사이에 근본적인 차이가있다 : 효과적으로 음수가 아닌 반경 클래스 불변하다는 것을 의미

  • 는 반경이 부정 될 수 있도록하지 않음. 모든 클래스 불변 값의 유효성 검사를 모든 mutating 멤버 함수의 진입과 종료시 RAII 헬퍼를 통해 호출하는 유틸리티 함수에 넣는 것은 디버깅에 좋은 점입니다. 내부 상태 (더 많은 단지 하나의 스칼라보다 복잡한) 어떤면에서는 모순이된다. 속도를 높이기 위해 일반적으로 릴리스 바이너리에 대한 이러한 검사를 비활성화하므로 광범위한 검사를하더라도 성능을 잃지 않습니다.
  • 반지름을 음수로 허용하지만 나중에 예외를 발생 시키면이 값을 사용하는 작업 (예 : 렌더링)으로 인한 오류가 발생합니다. 어떤 경우에는 유효하지 않은 입력 값을 해당 작업 중 메모리 부족과 구별 할 수 없지만 이러한 오류를 한 곳에서 포착하면됩니다.
관련 문제