2013-07-22 3 views
0

복합 디자인 패턴을 사용하여 Android의 등록 양식을 검증하는 방법을 설명해주십시오. 이 양식에는 8 개의 EditText 필드 (Ussername, Password, Password re-enter, 도시, 성별, 나이, 전화 번호, 이메일)가 있습니다. 난 이미 내 친구가이 복합 디자인 패턴을 사용하여 수행 할 수 있다는 얘기이 코드복합 패턴을 사용한 유효성 확인

public boolean validateInput() { 

    boolean validated = true; 

    if (mUserValues.getCity() == null || mUserValues.getCity().isEmpty()) { 
     mCityEditText.setError(getString(R.string.error)); 
     validated = false; 
    } 

    if (mUserValues.getEmail() == null || mUserValues.getEmail().isEmpty()) { 
     Log.d("mEmail", "in mEmail"); 

     mEmail.setError(getString(R.string.error)); 
     validated = false; 
    } 

    if (mUserValues.getPassword() == null 
      || mUserValues.getPassword().isEmpty()) { 
     mPasswordEditText.setError(getString(R.string.error)); 
     validated = false; 
    } 

    if (mUserValues.getPasswordCheck() == null 
      || mUserValues.getPasswordCheck().isEmpty()) { 
     mPasswordConfirm.setError(getString(R.string.error)); 
     validated = false; 

    } 

    if (mUserValues.getPassword() != null 
      && mUserValues.getPasswordCheck() != null 
      && !mPasswordEditText.getText().toString() 
        .equals(mPasswordEditText.getText().toString())) { 
     mPasswordEditText.setError(getString(R.string.pass_check)); 
     mPasswordConfirm.setError(getString(R.string.pass_check)); 
     validated = false; 
    } 

    if (mUserValues.getSex() == null || mUserValues.getSex().isEmpty()) { 
     mSex.setError(getString(R.string.error)); 
     validated = false; 
    } 

    if (mUserValues.getPhoneNumber() == 0) { 
     mPhone.setError(getString(R.string.error)); 
     validated = false; 
    } 

    Pattern pattern = Pattern.compile(Constants.EMAIL_PATTERN); 
    Matcher matcher = pattern.matcher(mEmail.getText().toString()); 
    mEmailCheck = matcher.matches(); 

    if (mEmailCheck == false) { 
     mEmail.setError(getString(R.string.email_valid)); 
     validated = false; 
    } 

    if (mUserValues.getUsername().length() <= 2) { 
     mUsername.setError(getString(R.string.username_check)); 
     validated = false; 
    } 

    if ((mUserValues.getAge() < 18 || mUserValues.getAge() > 150) 
      && mUserValues.getAge() > 0) { 
     mAge.setError(getString(R.string.age_check)); 
     validated = false; 
    } 

    return validated; 

} 

를 사용하여 검증했다,하지만 난 정말이 할 수있는 방법을 이해하지 않습니다. 누군가 설명 할 수 있다면 정말 고마워 할 것입니다. 미리 감사드립니다.

+1

패턴은 훌륭하지만 패턴이 이미 작동하고 있으며 패턴을 사용할 필요가없는 경우 사용하지 마십시오. "내 친구는"당신의 프로그램을 바꿀 이유가 아니라고 말합니다. 이제 런타임에이 양식을 변경하거나 동적으로 만들 수 있도록하려는 경우 복합 패턴을 사용하여 처리해야하는 정당한 이유가 있습니다. – Karakuri

답변

0

현재 외부에서 개체 상태 (예 : if (mUserValues.getCity() == null))를 검사하고 있습니다. 그리고 mUserValues에 필드를 추가하는 경우 해당 필드를 처리 할 코드를 validateInput에 추가해야합니다.

이것은 OO 원칙에 따라 나쁜 캡슐화/강력한 결합입니다. 해당 객체는 내부 상태 자체를 처리하거나 유효성을 검사해야합니다 (또는 복합 패턴을 수행 할 수있는 다른 객체를 알고 있어야합니다).

첫 번째 단계 (예 : if (!mUserValues.validateCity()))에서 개체 내부에서 유효성 검사를 이동합니다.

그 후에도 mUserValues 개체의 내부 정보를 알아야합니다. 예 : 유효성을 검사 할 도시 필드가 있다는 것을 알아 두십시오.

그럼 다음 단계에서 그걸 없앨 수 있습니다. 결과는

public boolean validateInput() { 
    boolean validated = true; 
    for (ValidatableField field : mUserValues.getValidatableFields()) { 
     if (!field.isValid()) { 
      field.showError(R.string.error); 
      validated = false; 
     } 
    } 
    return validated; 
} 

는 이제 validateInput 코드가 완전히 필드의 양의 독립적 인 그들이 어떻게 검증 할 필요가있다 약처럼 보일 수 있습니다. 제출 된 파일을 추가해도 거기에서 내용을 변경할 필요가 없습니다.

당신은 구성이나 상속을 사용합니다. 당신에게 달려 있습니다. 하지만 Composition over inheritance을 사용하는 것이 좋습니다.

+0

빠른 답변 감사합니다 :) – GoGo

관련 문제