添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

IF多重条件逻辑优化

  • c1:条件1,值为true
  • c2:条件2,值为true
  • c3:条件3,值为true

事例一:比较简单的if逻辑嵌套

代码抽象:递进式的条件

// 方法开始
...
if (c1) {
	if (c2) {
		if (c3) {
			// 业务逻辑
// 方法结束

优化后的代码逻辑:

// 方法开始
...
if (!c1) {
	return;
if (!c2) {
	return;
// 业务逻辑处理
// 方法结束

事例二:复杂场景的if逻辑嵌套

代码抽象:递进式的条件及对应的业务处理

// 方法开始
...
...
if (c1) {
	// 业务逻辑一
	if (c2) {
		// 业务逻辑二
		if (c3) {
			// 业务逻辑三
		// 业务逻辑四
	// 业务逻辑五
// 业务逻辑六
// 方法结束

优化后的代码逻辑:

// 业务逻辑抽取独立的方法
m1() {
	// 业务逻辑一
m2() {
	// 业务逻辑二
m3() {
	// 业务逻辑三
m4() {
	// 业务逻辑四
m5() {
	// 业务逻辑五
m6() {
	// 业务逻辑六
// 重构的方法内部开始
...
...
if (!c1) {
	m6();
	return;
m1();
if (!c2) {
	m5();
	m6();
	return;
m2();
if (c3) {
	m3();
	m4();
	m5();
	m6();
	return;
m4();
m5();
m6();
// 方法结束

事例三:并列下IF条件逻辑表达式固定的优化

if (param.equals(val1)) {
	doAction1(someParams);
} else if (param.equals(val2)) {
    doAction2(someParams);
} else if (param.equals(val3)) {
    doAction3(someParams);

用表驱动来优化,这个基于表驱动的方式来优化if-else逻辑在Spring中的应用场景很常见,比如NamespaceHandler中注册各种BeanDefinitionParser。Spring的表驱动方式是采用了集中注册的方式,在NamespaceHandlerSupport中。

// 创建值跟动作的映射表
Map<?, Function<?> action> actionMappings = new HashMap<>();
// 存放映射关系
actionMappings.put(val1, (someParams) -> doAction1(someParams));
actionMappings.put(val2, (someParams) -> doAction2(someParams));
actionMappings.put(val3, (someParams) -> doAction3(someParams));
// 获取对应的Funtion,并将someParams入参传到对应的Function中去,省略为null的判断
actionMappings.get(param).apply(someParams);

事例四:if-else中的条件表达式灵活多变

如果if-else中的条件表达式灵活多变,无法进行数据抽象为表格的方式,经常会用责任链设计模式。Spring Web常见的应用是Interceptor机制。

事例五:进行null值判断的if-else条件简化,注解驱动

我们在进行方法传参的时候,经常需要对方法参数作非空判断,可以在方法参数签名中添加@NotNull注解等

事例六:Assert模式【Bean Validation】

事例七:Optional,表示可为空的对象

我们经常不可避免的在代码中写很多的if条件语句,甚至,会形成多重嵌套的if条件结构。掌握IF条件能力,有两点:

  1. 首先,有递进式的逻辑关系,改成并列式的逻辑关系【取反逻辑】
  2. 其次,if条件中的业务逻辑处理适当的抽取为独立的方法。
  3. 在递进式跟并列式的if条件取舍中,还要掌握一个维度,代码简洁。
  4. if条件个数尽量不要多
  5. 在事例二中的if(c3)逻辑没有再次取反逻辑,是考虑了这一点,if条件内的是执行几率较少的情况。
IF多重条件逻辑优化事例一:比较简单的if逻辑嵌套事例二:复杂场景的if逻辑嵌套代码抽象:递进式的条件及对应的业务处理总结含义:c1:条件1,值为truec2:条件2,值为truec3:条件3,值为true事例一:比较简单的if逻辑嵌套代码抽象:递进式的条件// 方法开始...if (c1) { if (c2) { if (c3) { // 业务逻辑 } }... 如果某个值为4 或者为6的时候显示出来,否则就隐藏掉 用 “||” , 两个条件只要满足一个为true就显示, 如果你想两个条件同时满足true就显示的话, 那么就用"&&" <c:if test="${busiTranRel.queryType eq '4' || busiTranRel.queryType eq '6' }"> <button class="btn btn-white btn-sm busiBtn" dat
当我们遇到需要多个条件判断的业务操作时,最简单直接的办法就是用多个if-else判断,虽然能够实现,但当判断条件过多,甚至是多元判断时,我们的代码就会变得非常不好阅读和维护。 这也可以用switch if(status === '1'){ return '未审批' }else if(status === '2'){ return '审批中' }else if(status === '3'){ return '审批通过' }else
那么问题来了,在js开发中,如何减少if else语句的使用 代码中嵌套的if/else结构往往导致代码不美观,也不易于理解。面向过程的开发中代码有大量的IF ELSE,在java中可以用一些设计模式替换掉这些逻辑,那么在js中是否也有类似的方法用来尽可能减少代码中的if/else嵌套呢? 有人认为:if else多就多呗,只要可读性强,...
在进行前端工作时,会经常用到条件判断语句,其中一般使用得比较多的是 if 条件语句。而如果判断条件比较少的时候,可以这样: if( age > 18 ){ console.log('You are already grown up'); 然后当判断条件会有两三个的时候,你是不是会这样: if( age < 18 || age > 18 ){ console.log(...
FROM table_name; 其中,expression是要进行判断的表达式,value1、value2等是可能的取值,result1、result2等是对应取值的结果,alias是结果的别名。 第二种方式是可搜索CASE语句,语法如下: SELECT column_name, CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE result END AS alias FROM table_name; 其中,condition1、condition2等是条件表达式,result1、result2等是对应条件为真时的结果,alias是结果的别名。 这两种方式都可以根据条件的不同返回不同的结果。根据需要选择合适的方式进行多重条件判断