使用Composite Pattern验证

时间:2013-07-22 14:56:28

标签: java android

有人可以解释我如何使用复合设计模式来验证android中的注册表单。在这个表单中,我有8个EditText字段(Ussername,密码,密码重新输入,城市,性别,年龄,电话号码,电子邮件)。我已经使用此代码验证了它

    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 个答案:

答案 0 :(得分:0)

您目前正在从外部检查对象的状态(例如if (mUserValues.getCity() == null))。如果您向mUserValues添加字段,则还必须添加代码以将该字段处理为validateInput

根据OO原则,这是不好的封装/强耦合。该对象应该处理/验证它的内部状态本身(或者知道可以执行它的另一个对象 - &gt;复合模式)。

我会在第一步中移动对象内部的验证(例如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是一件好事。