2009-05-19 6 views
3

어떤 종류의 작업을 수행하는 하위 시스템이 있다고 가정합니다. 그것은 무엇이든 수 있습니다. 분명히이 서브 시스템의 진입 점 (들)에는 입력에 대한 특정 제한 사항이 있습니다. 이 서브 시스템이 주로 GUI에 의해 호출된다고 가정하십시오. 서브 시스템은 유효한지 확인하기 위해 수신하는 모든 입력을 점검해야합니다. 유효하지 않은 입력이있는 경우 FireTheMissles()를 사용하지 않을 것입니다. UI는 또한 잘못되었는지보고해야하기 때문에 유효성 검사에도 관심이 있습니다. 어쩌면 사용자가 런치 패드 자체에서 목표를 지정하는 것을 잊었거나 미사일을 타깃으로 삼았을 수도 있습니다. 물론 null 값을 반환하거나 예외를 throw 할 수는 있지만 사용자에게 구체적으로 무엇이 잘못되었는지는 알 수 없습니다 (물론 각 오류에 대해 별도의 예외 클래스를 작성하지 않으면 if 그게 최선의 방법입니다).입력 유효성 검사에 중복 코드 피하기

물론 예외적 인 경우에도 문제가 있습니다. 사용자는 "Fire Missles!"를 클릭하기 전에 입력이 유효한 지 알고 싶을 수도 있습니다. 단추. 별도의 유효성 검사 함수를 작성할 수 있습니다 (물론 IsValid()는 잘못된 내용을 알려주지 않으므로 실제로 도움이되지 않습니다), 버튼 클릭 핸들러에서 호출하고 FireTheMissles에서 다시 호출합니다) 함수 (이것은 모호한 서브 시스템에서 미사일 발사 프로그램으로 어떻게 바뀌 었는지 정말로 모른다). 분명히 이것은 세계의 끝이 아니지만, 특히이 유효성 검사 기능이 1GB 파일의 해시 계산을 요구하는 경우 변경되지 않은 상태에서 동일한 유효성 검사 기능을 두 번 연속 호출해야합니다.

함수의 전제 조건이 명확하면 GUI가 자체 입력 유효성 검사를 수행 할 수 있지만 입력 유효성 검사 논리를 복제하기 만하면 입력 변경 유효성 검사 논리에 변경 사항이 반영되지 않을 수 있습니다. 물론, 우리는 미사일 목표가 동맹국 내에 있지 않은지 확인하기 위해 GUI에 점검을 추가 할 수 있습니다. 그러나 FireTheMissles() 루틴으로 복사하는 것을 잊어 버리면 우연히 우리 팀을 콘솔 인터페이스.

그래서, 짧은에, 당신은 어떻게 다음 달성 않는다 : 당신은 그냥 뭔가 잘못하지,하지만 특별히 잘못되었는지 알 수

  1. 입력 유효성 검사를.
  2. 의존하는 함수를 호출하지 않고이 입력 유효성 검사를 실행할 수있는 기능.
  3. 이중 검증이 없습니다.
  4. 중복 코드가 없습니다.

또한 생각해 보았지만 오류 메시지는 FireTheMissles() 메소드에 쓰면 안됩니다. GUI는 GUI가 호출하는 코드가 아니라 적절한 오류 메시지를 선택합니다.

답변

3

의 인수 목록으로 순전히 입력의

생각해 "서브 시스템은가 올바른지 확인하기 위해받는 모든 입력을 확인하기 위해 필요"하지만 메시지로, 그 후 쉽게 얻을 수 있습니다.

메시지 클래스에는 IsValid 멤버 함수가 있으며 IsValid가 호출되고 결과가 무엇인지 기억합니다. 또한 상태가 변경되면 다시 유효성을 검사해야합니다. 이 메시지 클래스는 유효성 검사 오류 목록도 유지합니다.

이제 UI가 TargetMissiles 메시지를 작성하고 UI가 유효성을 검사하거나 직접 MissileFiring 하위 시스템으로 전달할 수 있으며 메시지의 유효성을 검사할지 검사하지 않고 유효성을 검사하고 . UI가 이미 유효성 검사 목록이 채워진 메시지를 가져옵니다.

유효성 검사가 포함 된 메시지는 별도의 라이브러리에 있습니다. 중복 된 코드가 없습니다.

이 소리는 괜찮습니까?

2

여기가 Model-View-Controller입니다.

모델 (좌표, 미사일 유형 및 미사일 수로 구성된 발사) 모델을 작성하면 모델에 오류/경고 목록을 반환하는 유효성 검사 메소드가 있습니다. 모델을 업데이트 할 때 (<ENTER>, 버튼 누름) 모델을 업데이트 할 때 validate 메소드를 호출하고 경고, 오류 등을 사용자에게 표시합니다 (이클립스는 대화 상자의 도구 모음 바로 아래에 작은 영역이 있습니다. 그렇다면 그걸 보길 원할 것입니다.)

모델이 유효하면 발사 미사일 버튼을 활성화하여 사용자가 미사일을 발사 할 수 있음을 알 수 있습니다. 특히 자주 호출되는 업데이트 이벤트 또는 특히 비용이 많이 드는 유효성 검사의 일부일 경우 쉽게 수행 할 수있는 부분의 유효성을 검사하는 데 사용하는 모델에 validate_light 메서드를 사용할 수 있습니다.

콘솔 기반 UI로 전환 할 때 명령 줄 인수에서 모델을 빌드하고 동일한 유효성 검사 방법을 호출하고 오류를 stderr에보고 한 다음 미사일을 시작합니다.

+0

MVC는 입력 유효성 검사에 관한 것 이상입니다.입력 유효성 검사 자체에 도달하면 Binary Worrier가 제안하는 것과 다른 것을 제안하고 있습니까? 그렇다면 어떻게? 그렇지 않다면이 오류 처리 방법을 적용하기 위해 MVC를 수행해야 할 필요가 있습니까? (최종 애플리케이션이 반드시 MVC가 아니 겠지만, 미사일 발사 시스템에서 필요한 것을 알고있는 경우를 제외하고는 GUI에 대해서는 아직 생각조차하지 않습니다.) –

+0

+1 간단히 말해서 : 모델 그것의 어떤 부분에 대해 무엇이 타당한지를 정의하고 누구나 이러한 제약에 유의하도록해야합니다. –

0

나는 '생성자'에서 입력 형식 (열거 형)을 사용하고 공개 IsValid 메서드를 제공하는 입력 유효성 검사 클래스를 제안합니다.

IsValid 메서드는 유효하면 부울 TRUE를 반환하고 유효하지 않으면 FALSE를 반환해야합니다. 또한 문자열을 가져 와서 해당 문자열에 상태 메시지를 할당하는 OUT 매개 변수가 있어야합니다. 호출자는 원하는 경우 해당 메시지를 무시할 수 있으며 문맥에 적합한 경우 GUI에보고 할 수 있습니다.

그래서, 의사에 (델파이와 같은 구문을 용서하지만 누구에게도 읽을 수 있어야) : 그것을 사용하는 다음

//different types of data we might want to validate 
TValidationType = (vtMissileLaunchCodes, vtFirstName, 
    vtLastName, vtSSN); 

TInputValidator = class 
public 
    //call the constructor with the validation type 
    constructor Create(ValidationType: TValidationType); 

    //this should probably be ABSTRACT, implemented by descendants 
    //if you took that approach, then you'd have 1 descendant class 
    //for each validation type, instead of an enumeration 
    function IsValid(InputData: string; var msg: string): boolean; 

을, 당신은 같은 것을 할 것 :

procedure ValidateForm; 
var 
    validator: TInputValidator; 
begin 
    validator := TInputValidator.Create(vtSSN); 
    if validator.IsValid(edtSSN.Text,labelErrorMsg.Text) then 
    SaveData; //it's valid, so save it! 
    //if it wasn't valid, then the error msg is in the GUI in "labelErrorMsg". 
end; 
0

각 데이터에는 자체 메타 데이터 (유형, 형식, 단위, 마스크, 범위 등)가 있습니다. 불행히도 이것이 항상 지정되지는 않습니다.

GUI 컨트롤은 데이터가 유효하지 않은 경우 메타 데이터로 입력을 검사하고 경고/오류를 제공해야합니다.

예 : 숫자에 범위가 있습니다. 범위는 메타 데이터에 의해 제공되지만 범위 검사는 컨트롤에 의해 제공됩니다.

1

유효성을 두 번 확인하십시오. 대부분의 경우 유효성 검사는 3 배가됩니다 (예 : DB의 null 필드가 아닌 FK). 플랫폼에 따라 유효성 검사 규칙을 한 번 코딩 할 수도 있습니다. 예를 들어, 프런트 엔드 및 백엔드 코드는 C# 비즈니스 클래스를 공유 할 수 있습니다. 또는 유효성 검사 규칙을 백 엔드와 프런트 엔드에서 모두 적용 할 수있는 메타 데이터로 저장할 수 있습니다.

현실에서는 유효성 검사 문제에 대해 다른 응답이 필요합니다. 예를 들어, 화재 미사일 단추는 다른 입력이 유효해야 사용할 수 있습니다. 동일한 규칙과 관련된 다른 코드가 있습니다.

+0

유효성 검사 규칙을 한 곳에서 추가하지만 다른 곳에서는 추가하지 않는 문제는 어떻게됩니까? –

+1

만약 당신이 그 문제를 심각하게 생각한다면 시스템을 사용해야합니다. 규칙을 한 번만 정의 할 수는 있지만 그러한 시스템에는 상당한 중요성이 있습니다. 백엔드가 유효성을 검사해야하고 GUI가 유효성을 검사해야하며, 사용자 친화적 인 방법으로 GUI에서 무언가를 놓친다면 못생긴 메시지를 받지만 여전히 유효성을 확인해야합니다. – AnthonyWJones

+0

단순한 경우이 값을 확실히 볼 수는 있지만 유효성 검사중인 필드의 수와 유효성 검사 논리의 복잡성이 증가함에 따라 결국에는 무너질 것이라고 생각합니다. 50 줄의 검증 코드를 반복하는 것이 한 가지입니다. 500을 반복하는 것은 또 다른 것입니다. –

관련 문제