2013-07-22 51 views
0

有人可以請解釋我怎樣才能使用複合設計模式來驗證android中的註冊表單。在這種形式下,我有8個EditText字段(用戶名,密碼,密碼重新輸入,城市,性別,年齡,電話號碼,電子郵件)。使用此代碼使用複合圖案驗證

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

模式非常棒,但是如果它已經在爲您工作,並且您不需要使用該模式,那麼請不要使用它。 「我的朋友說」不是改變你的節目的理由。現在,如果您希望此表單能夠在運行時更改或動態創建,那麼您可能有充分的理由使用Composite模式來處理它。 – Karakuri

回答

0

您目前正在從外部檢查物體的狀態(例如if (mUserValues.getCity() == null))。如果您將字段添加到mUserValues,則還需要添加代碼以將該字段處理爲validateInput

根據面向對象原理,這是不好的封裝/強耦合。該對象應該處理/驗證它的內部狀態本身(或知道另一個可以做到這一點的對象 - >複合模式)。

我會在第一步中移動對象內部的驗證(例如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