接上篇:https://developer.aliyun.com/article/1228114?spm=a2c6h.13148508.setting.14.21084f0eNCKPti
七、 定义多条件表达式
1. 利用运算符&&(或||)直接拼接
1) 定义代码
有时候,我们会判断很多条件,需求用&&(或||)连接多个条件表达式。
2) 存在问题
通过SonarLint插件扫描,会存在2个问题:
其中,圈复杂度(Cyclomatic complexity,CC)也称为条件复杂度,是一种衡量代码复杂度的标准,其符号为V(G)。
麦凯布最早提出一种称为“基础路径测试”(Basis Path Testing)的软件测试方式,测试程序中的每一线性独立路径,所需的测试用例个数即为程序的圈复杂度。
圈复杂度可以用来衡量一个模块判定结构的复杂程度,其数量上表现为独立路径的条数,也可理解为覆盖所有的可能情况最少使用的测试用例个数。
2. 利用运算符=和&&(或||)级联拼接
1) 定义代码
那么,就把&&(或||)连接符拆开,利用运算符=和&&(或||)级联进行拼接。
2) 存在问题
通过SonarLint插件扫描,还存在1个问题:
也就是,利用运算符=和&&(或||)级联进行拼接,并不能减少方法的圈复杂度。
3. 利用动态无参数Lambda表达式列表
1) 定义代码
下面,利用动态无参数Lambda表达式列表优化,即把每个条件表达式作为BooleanSupplier对象存在列表中,然后依次执行条件表达式得出最后结果。
2) 存在问题
通过SonarLint插件扫描,没有提示任何问题。但是,每次都动态添加Lambda表达式,就会导致程序效率低下。那么,有没有把Lambda表达式静态化的方法呢?
4. 利用静态有参数Lambda表达式列表
1) 定义代码
要想固化Lambda表达式,就必须动态传入AuditDataVO对象。这里,采用“Predicate”来接收Lambda表达式,在Lambda表达式中指定AuditDataVO对象data。然后,在for循环中,依次指定AuditDataVO对象data,并计算表达式的值。
2) 适用条件
• 适合于&&(或||)连接大量条件表达式的情况;
• 适合于每个条件表达式都需要传入相同参数的情况,如果每个条件表达式传入参数不同,只能使用动态无参数Lambda表达式列表方法;
• 如果需要传入两个参数,可以使用BiPredicate类型来接收Lambda表达式;如果需要传入多个参数,则需要自定义方法接口。
后记
高德从上一个财年开始,就狠抓代码质量(包括代码审查、代码规范、单元测试等),已经取得了显著成效。为了助力高德代码质量的提高,我系统性地梳理了服务端单元测试编写流程,总结出文章《Java编程技巧之单元测试用例编写流程》。我写作该文章的宗旨就是——“读有所得、得有所思、思有所获”。所以,在阅读该文章后,只需依样画葫芦,就能轻而易举地编写出专家级的单元测试用例。