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;

}

我的一个朋友告诉我,它可以使用复合设计模式来完成,但我真的不明白如何做到这一点。如果有人可以解释,我将不胜感激。提前致谢。

4

1 回答 1

0

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

根据 OO 原则,这是糟糕的封装/强耦合。该对象应该处理/验证它本身的内部状态(或知道另一个可以做到这一点的对象 -> 复合模式)。

我会在第一步中将验证移到对象内部(例如if (!mUserValues.validateCity()))。

之后,您仍然需要了解外部mUserValues对象的内部结构 - 例如,知道有一个 city 字段需要验证。

因此,在下一步中,您也可以摆脱它。结果可能看起来大致像

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

现在validateInput代码完全独立于字段的数量以及如何验证它们。添加文件不需要更改其中的任何内容。

使用组合还是继承取决于您。但是使用组合而不是继承是一件好事。

于 2013-07-22T15:22:59.473 回答