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

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 表单验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css less 不要作用到子对象_CSS-预处理语言Sass、Less简述

CSS作为前端开发的三驾马车之一&#xff0c;无时无刻不在影响着前端的发展。为了让 CSS 变得更加的好用&#xff0c;出现了一些预处理语言。 它们让 CSS 彻底变成一门可以使用变量 、循环 、继承 、自定义方法等多种特性的标记语言&#xff0c;逻辑性得以大大增强SassSass是成熟…

html图片平铺div,前端小知识——图片平铺问题

图片平铺有两种方式&#xff0c;直接写img标签或者通过background-image方式1&#xff0c;img标签HTML&#xff1a;CSS:.row{margin:0,auto;width:100%;}img{width:100%;height:100%;margin: 0 auto;display: block;font-size: 0;}这样写的话&#xff0c;三张图片能够垂直平铺&…

JMetro版本11.6.8和8.6.8发布

另一个版本&#xff0c;这次是较短的更新。 撰写文档和博客文章有点不知所措&#xff0c;但是我认为我不得不更新文档&#xff0c;因为它已经被更新了大约一年或更长时间。 因此&#xff0c;对于此发行版&#xff0c;我也专注于此。 这是链接&#xff1a; Javafx主题JMetro页面…

python用pip安装numpy mac_小白入门Python,mac下如何安装pip、ipython

作为一枚小白&#xff0c;最近在学习用Python写科学计算器&#xff0c;因为Mac不自带pip&#xff0c;安装的时候找了好几个帖子&#xff0c;才成功安装。做一下简单分享&#xff0c;希望对大家有帮助&#xff1a; 安装环境&#xff1a; Mac系统版本&#xff1a;OS X 10.11.1 Py…

js 点击侧边栏展示内容_上海SEO优化网站侧边栏一般添加什么内容

相关推荐&#xff1a;https://www.huisheng.com/上海SEO优化网站侧边栏一般添加什么内容&#xff1f;企业做网站每个板块都是非常重要的&#xff0c;之前跟大家解析了关于导航栏的布局&#xff0c;哪些内容该添加&#xff0c;哪些内容不该添加&#xff0c;而今天小编要跟大家解…

html网页设如何置访问密码,利用JS给单页html加上简单访问密码,需要密码才能访问!...

本文最后更新于【 2019-12-21 22:28:00 】&#xff0c;某些文章具有时效性&#xff0c;若有错误或已失效&#xff0c;请在下方 留言 或联系 小P君 。今天在搞一个简单的短域名生成网页的时候&#xff0c;以防被滥用&#xff0c;所以想给html加一个简单的密码&#xff0c;需要…

python装饰器作用噜咕_python 装饰器的实际作用有哪些

终于知道python的装饰器是怎么回事&#xff0c;那在工作中&#xff0c;到底能干吗用呢&#xff1f; 尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸。 先说结论&#xff0c;肯定是有用处滴。 一、自动化测试中使用 就拿写的自动化测试来说吧&#xff0c;如果我想…

机器人辅助的符文天赋_10.5版本T1辅助盘点 进攻型辅助主宰下路

摘要&#xff1a;今天为大家推荐10.5版本的三大T1辅助&#xff0c;在当前版本每层塔钱增加到160后&#xff0c;这些前期进攻性较强的辅助更容易上分&#xff0c;他们都有直接或间接击毁镀层的能力&#xff0c;赛娜推线压制后的远程点塔&#xff0c;机器人靠着钩子的威胁上前、日…

html5新变化,HTML5的新变化,分享

1、新的2、图形元素 figure &#xff0c;将与相结合&#xff0c;使图片标题与图片相搭配%3、不需要为链接和脚本标签添加类型的属性4、h5中不需要用引号将属性包裹起来5、使得内容可编辑。”contenteditable”&#xff0c;它将允许用户编辑元素(包括他的子元素)内包含的任何文本…

javafx属性_JavaFX技巧11:更新只读属性

javafx属性自定义控件通常具有“只读”属性。 这意味着不能从控件外部进行设置&#xff0c;甚至不能从自己的皮肤类别进行设置。 通常&#xff0c;控件的行为会导致更改只读属性。 在JavaFX中&#xff0c;此行为可以在控件本身和皮肤中实现。 因此&#xff0c;有时我们最终希望…

dataframe 选择输出_使用 Python 实现机器学习特征选择的 4 种方法

(给数据分析与开发加星标&#xff0c;提升数据技能)英文&#xff1a;Sugandha Lahoti&#xff0c;转自&#xff1a;数据派(ID&#xff1a;datapi)&#xff0c;翻译&#xff1a;李洁注&#xff1a;本文节选自Ankit Dixit所著的《集成机器学习》(Ensemble Machine Learning)一书。…

ps一点等于多少厘米_企业展厅设计关于展台你了解多少?

发 现 生 活 中 最 美 好 的 设 计打开音乐聆听设计伽的声音水北展陈今日份文章&#xff1a;企业展厅设计关于展台你了解多少&#xff1f;企业展厅设计展台是各种展品、实物、模型以及沙盘的展示介质之一。企业展厅设计展台的设计和选用要从企业展厅设计展品的特征出…

计算机应用能力文字录入,2017全国专业技术人员计算机应用能力考试题库-Excel,Word,XP.pdf...

《博大考神》2006版之excel2003题库版3一、Excel的应用基础3二、excel界面4三、数据的输入6四、插入对象8五、编辑工作表9六、创建公式11七、使用函数和主要函数12八、普通函数13九、工作表的格式设置(一)14十、工作表的格式设置(二)15十一、打印16十二、管理工作表和保护数据1…

用python turtle库画正方形_用Python Turtle画一个正方形

你的主要错误是这两行顺序错误&#xff1a;window.exitonclick() #click the screen to close it draw_square() exitonclick()&#xff0c;或mainloop()&#xff0c;或done()应该是最灵活的&#xff0c;针对上述和样式问题&#xff0c;你的代码需要重新编写&#xff1a;import…

HATEOAS的RESTful服务。 超媒体:REST的秘密要素

在这篇文章中&#xff0c;我们将介绍有关HATEOAS的RESTful服务的综合文章。 超媒体是REST的秘密成分。 1.简介 在本教程的前一部分中&#xff0c;我们花了一些时间来刷新有关REST体系结构样式的基本原理的知识。 业界对REST状态的批判性眼光揭示了一个令人失望的事实&#xf…

springboot 单测加入参数_Spring Boot集成Elasticsearch实战分享

作者|java梦想口服液|简书最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用&#xff0c;今天就讲解下如何使用 Spring Boot 结合 ES。可以在 ES 官方文档中发现&#xff0c;ES 为 Java REST Client 提供了两种方式的 Client&#xff1a…

计算机主机安装系统安装系统安装软件,电脑安装软件时提示安装过程出错系统设置未被修改怎么办...

‍电脑安装软件&#xff0c;尤其是安全管理这一类软件&#xff0c;可能会出现安装失败的情况&#xff0c;提示安装过程出现错误&#xff0c;未修改系统设置等。这是怎么回事?这些软件在安装的时候可能会修改系统相关的核心设置&#xff0c;所以电脑系统会阻止其安装。下面让我…

python一个函数调用另一个函数_在Python中将函数作为另一个函数的参数传入并调用的方法...

在Python中&#xff0c;函数本身也是对象&#xff0c;所以可以将函数作为参数传入另一函数并进行调用 在旧版本中&#xff0c;可以使用apply(function, *args, **kwargs)进行调用&#xff0c;但是在新版本中已经移除&#xff0c;以function(*args, **kwargs)进行替代&#xff0…

ps图片拖不进去_PS教学:你的logo还不够高大上?7步教做出黄色金属质感logo

今天美迪君向大家分享一下&#xff0c;如何用ps简单制作带有黄色金属质感的logo方法&#xff0c;难度不仅不大&#xff0c;且制造出来的logo也是非常漂亮&#xff0c;值得大家学习。接下来就为大家演示一下制造的方法。1、打开PS&#xff0c;CtrlN新建一个1920*1080的画布(根据…

简单比对照片是否相同_小新说法 | 如何认定商标是否侵权?

如何认定商标是否侵权&#xff1f;原创 | 高姗 江苏东能律师事务所商标是商品的生产者、经营者在其生产、制造、加工、拣选或者经销的商品上或者服务的提供者在其提供的服务上采用的&#xff0c;用于区别商品或服务来源的&#xff0c;包括文字、图形、字母、数字、三维标志、颜…