v-if 表单验证

在某些情况下,我们需要先验证输入数据,然后再将其发送到业务逻辑层进行处理,计算等。这种验证在大多数情况下是孤立进行的,或者可能包括与外部数据或其他输入的一些交叉检查。 看下面的示例,该示例验证用户输入的注册数据。

public void register(String email, String name, int age) {String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";Pattern pattern = Pattern.compile(EMAIL_PATTERN);List<String> forbiddenDomains = Arrays.asList("domain1", "domain2");if ( email == null || email.trim().equals("")){throw new IllegalArgumentException("Email should not be empty!");}if ( !pattern.matcher(email).matches()) {throw new IllegalArgumentException("Email is not a valid email!");}if ( forbiddenDomains.contains(email)){throw new IllegalArgumentException("Email belongs to a forbidden email");}if ( name == null || name.trim().equals("")){throw new IllegalArgumentException("Name should not be empty!");}
if ( !name.matches("[a-zA-Z]+")){throw new IllegalArgumentException("Name should contain only characters");}
if ( age <= 18){throw new IllegalArgumentException("Age should be greater than 18");}
// More code to do the actual registration
}

这种方法的循环复杂性确实很高,如果要验证的字段更多或添加实际的业务逻辑,则可能会变得更糟。 当然,我们可以将代码分成两个私有方法(validate,doRegister),但是几个if块将被移到私有方法的问题。 除此以外,该方法还要做很多事情,而且很难测试。 当我要求初级开发人员重构该代码并使之更具可读性,可测试性和可维护性时,他们像个外星人一样看着我:“我应该如何简化它。 我该如何替换这些if块?” 好了,这里的解决方案效果很好,遵循了“单一责任模式”,并使代码更易于阅读。

为了更好地理解解决方案,请将每个if块都视为验证规则。 现在是时候为这些规则建模了。

首先用一种方法创建一个接口。 用Java 8术语,它称为功能接口 ,如下所示。

public interface RegistrationRule{void validate();
}

现在是时候将每个验证检查转换为注册规则了。 但是在我们这样做之前,我们需要解决一个小问题。 我们的界面实现应该能够处理注册数据,但是如您所见,我们拥有不同类型的数据。 因此,我们在这里需要将注册数据封装在单个对象中,如下所示:

public class RegistrationData{private String name;private String email;private int age;
// Setters - Getters to follow
}

现在我们可以改善功能界面:

public interface RegistrationRule{
void validate(RegistrationData regData);
}

并开始编写我们的规则集。 例如,让我们尝试实现电子邮件验证。

public class EmailValidatationRule implements RegistrationRule{private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";private final Pattern pattern = Pattern.compile(EMAIL_PATTERN);
@Overridepublic void validate(RegistrationData regData) {if ( !pattern.matcher(regData.email).matches()) {throw new IllegalArgumentException("Email is not a valid email!");}
}

很明显,我们在上述类中隔离了电子邮件验证。 我们可以对初始实施的所有规则执行相同的操作。 现在,我们可以重写我们的注册方法以使用验证规则。

List<RegistrationRule> rules = new ArrayList<>();rules.add(new EmailValidatationRule());rules.add(new EmailEmptinessRule());rules.add(new ForbiddenEmailDomainsRule());rules.add(new NameEmptinessRule());rules.add(new AlphabeticNameRule());for ( RegistrationRule rule : rules){rule.validate(regData);}

为了变得更好,我们可以使用Factory模式和一个静态方法get()创建一个Rules类,该方法将返回规则列表。 我们的最终实现将如下所示

for ( RegistrationRule rule : Rules.get()){rule.validate(regData);
}

将我们的注册方法的初始版本与最终版本的注册方法进行比较会产生疑问。 我们的新版本更紧凑,更易读,当然也更具可测试性。 实际的检查已移至单独的类(也易于测试),并且所有方法仅做一件事(请始终牢记这一点)。

翻译自: https://www.javacodegeeks.com/2014/07/avoiding-many-if-blocks-for-validation-checking.html

v-if 表单验证

v-if 表单验证_避免许多if块进行验证检查相关推荐

  1. JEPaas代码_((表单)_输入字段值而改变值)

    JEPaas代码_笔记((表单)_输入字段值而改变值) 我也是新手入门,不是很熟练JEPaas后台,正在学习中- var v=parseInt(value);console.warn('出库数量改变' ...

  2. python提交表单无效_使用Django Form解决表单数据无法动态刷新的两种方法

    一.无法动态更新数据的实例 1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为"多对多" from django.db import models class Class ...

  3. ajax form表单提交_开发日志:金数据表单自动提交脚本

    最近学校要求我们每天通过一个在线表单打卡自己在家做的体育课项目,在提交的时候我突然想了下如果能有一个自动的系统每天帮我自动打卡岂不是能省很多时间?而且我一直很想学Python的网络爬虫以及服务器后端的 ...

  4. form表单的多种提交方式及提交前验证

    以下是本人总结处来的一些form的提交方式,网上还有别的提交方式,这里我总结了大小分为7类,其实就是三类的提交方式,若有哪里不对的,还请评论指出来,大家一起学习学习 1.无任何验证提交(最普通的提交) ...

  5. basefont.createfont设置表单字体_《Flask 入门教程》第 7 章:表单

    在 HTML 页面里,我们需要编写表单来获取用户输入.一个典型的表单如下所示: <form method="post"> <!-- 指定提交方法为 POST -- ...

  6. python表单数据系统_使用MultipartPostHandler用Python发布表单数据

    问题:使用Python的urllib2发布数据时,所有数据都是URL编码的,并作为内容类型发送:application/x-www-form-URL encoded.上载文件时,应将内容类型设置为mu ...

  7. html表单居中_如何在IE低版本中兼容HTML5表单属性placeholder属性

    WEB开发数据提交是必不可少的,为了更友好的用户体验,通常需要给输入框一个默认的提示信息.HTML5技术提供了一个表单属性placeholder专门用于输入框默认提示,但是在IE低版本中根本不兼容. ...

  8. java自定义表单系统_表单识别:自定义表单模板无需额外定制

    在各行各业中,Excel和WPS是办公标配工具,办公的时候,我们经常遇到这样一个需求:将纸质表格/表格图片导入Excel. 面对这种需求,多数人会选择在Excel中新建表单,对照着图片将内容一点一点敲 ...

  9. uibinder表单提交_使用UIBinder的GWT自定义按钮

    uibinder表单提交 这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例. public class GwtUIBinderButton implements EntryPoint ...

最新文章

  1. Nat. Methods | 学习微生物与代谢产物之间相互作用的神经网络
  2. .NET Core IdentityServer4实战-开篇介绍与规划
  3. Documentum中关于日期时间类型字段的特殊处理
  4. 作为初学者应该如何来学习FPGA
  5. 基于 Slax 构建译者专用 Linux
  6. JavaFX技巧18:路径剪切
  7. Symbian和C++ SDK开发入门之应用程序
  8. Kotlin 学习笔记(七)—— Kotlin类与对象之属性与字段
  9. python语言为何不受待见_程序员为什么讨厌这些语言
  10. git回退历史版本无法上传_Git实用教程(四) | Git本地库操作(查看提交历史、版本前进回退)...
  11. 网站防盗链就是那么简单
  12. 2010年5月18日 小细节大隐患
  13. 14_按类别分页展示商品
  14. Oracle效率提升
  15. LCD1602液晶屏
  16. 记录一个android性能优化宝藏级总结
  17. 滴滴Uber又打起来了!外卖领域C位花落谁家?
  18. 运动员(射击)的成绩可以用脑电技术预测吗?
  19. day11-单点登录系统
  20. 计算机视觉技术英语论文,计算机视觉技术论文(2)

热门文章

  1. P2048-[NOI2010]超级钢琴【RMQ,堆】
  2. 动态规划训练9 [Brackets POJ - 2955 ]
  3. 14、ORACLE下的基本SQL操作
  4. 13、字符集和字符编码
  5. 你还在Java8中使用循环语句吗?
  6. 图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)
  7. article之api文档
  8. 使用C#操作XML文件
  9. C#实现人脸识别【Users】
  10. Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)