有人可以解释我如何使用复合设计模式来验证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;
}
我的一位朋友告诉我,可以使用复合设计模式完成,但我真的不明白如何做到这一点。 如果有人能解释,我将非常感激。 提前谢谢。
答案 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是一件好事。