当前位置: 首页 > news >正文

大量if else的优化方案

大量if else的优化方案

问题

开发中遇到的问题:
在开发中经常会遇到,一个逻辑需要处理多种数据,每一种数据的处理逻辑都是不一样的。
这个时候就会出现很多判断的语句。例如

if 条件1 then
	...
elseif 条件2 then
	...
elseif 条件3 then
	...

或者使用Switch语法,但是其实都是一样的。这样的处理方式简单明了,但是难以维护。并且代码不易于阅读,想象有十几种情况,那么在一个逻辑处就需要写十几个if else 语句。
久而久之,这一堆代码就会变成一个优化项。

解决方案

问题分析

对于处理的数据,在不同的地方,可能会有不同的处理逻辑。例如有一份数据,这一份数据的里面有多个字段,其中有一个处理该份数据的地方,针对其中一个字段的不同值需要做不同的处理。那么就可能会出现上面的那种情况。

使用面向对象抽象构造对象

这个时候可以对这份数据进行抽象处理。
首先对这份数据进行分析,看这份数据在哪些地方的处理逻辑是不一样,哪些地方的处理逻辑是一样的。然后抽象出一致的内容。作为父类。
然后再根据不一样的内容。拆分成一个个的子类。
因为子类继承于父类。那么这个时候就可以将这些数据相同的处理逻辑写在父类上,由父类实现,然后对于处理逻辑不一样的地方可以让子类重写父类的方法。
这样就可以将这些不同的逻辑拆分到每一个子类中。而父类提供统一的接口。最后使用多态,那么就实现了对父类,设定的统一接口进行操作,但是不同的子类对象走不同的逻辑。
举个例子:


Enum value  // 当value为不同的枚举值时操作逻辑不一样

class ParentClass{
	fun operate() // 当value为不同的枚举值,执行该方法执行对应的操作
}

class ChildClassA{
	fun operate(){
		当value == A 时执行的操作
	}
}


class ChildClassB{
	fun operate(){
		当value == B 时执行的操作
	}
}


使用的地方:

原本:
	if vlaue == A then
		...
	elseif value == B then
		...
	end

现在:
	构造对象:
	ParentClass c1 = new ChildClassA()
	ParentClass c2 = new ChildClassB()

	//执行逻辑方法
	c1.operate()

从上面可以发现,使用面向对象的方法,可以将一些操作逻辑封装到对应的类中。并且当这些逻辑在不同情况下需要有不同的变化的时候,还可以使用面向对象的继承和多态,通过子类重写方法的方式,实现不同的子类走不同的逻辑。
而在使用的时候,只需要调用父类中对应的逻辑接口即可。不同的子类对象会走对应的不同的子类逻辑。

工厂模式解决子类对象创建问题

这个时候会发现,在上面的伪代码中还需要根据value的值创建不同的对象。对于这种情况,我们就可以使用设计模式中的工厂模式进行帮忙。将对象的实例化抽象到工厂类中。


Class Factory{
	static create(value){
		if value == 1 then
			return new ChildClassA()
		elseif value == 2 then
			return new ChildClass2()
		end
	}

}


	
那么在使用的时候

ParentClass c = Factory.create(value)
c.operate()

就实现了上面需要一大堆 if else 的问题

想想上面我们做了哪一些操作。

  1. 对数据,逻辑进行分析。将相同的数据,逻辑抽象封装成一个父类
  2. 针对不同的逻辑继承父类,封装到各个子类中。
  3. 使用工厂模式,针对不同的情况创建不同的子类。

这样做有什么好处?

  1. 解耦,操作数据的地方,跟数据本身进行解耦。这些操作都被封装到每一个子类中。只要确保传入一个父类类型的数据,那么操作数据的地方就可以执行。而不用管你具体value是什么值,要执行什么操作。
  2. 易于扩展,以前如果要扩展的话,那么就需要修改每一个操作数据的地方。这里有两个缺点。一个是修改,一个是每一个地方。对于代码都是尽量不去修改原本的代码。所以修改是一个缺点。而修改每一个操作数据的地方,不仅麻烦而且很容易漏掉。因此很麻烦,而如今,并不需要修改原本代码,只需要新增一个子类,然后重写对应的接口,就可以了。
  3. 易于维护。将这些内容都抽象到每一个类中,代码清晰,并且一处修改所有地方都会跟着修改。

相关文章:

  • 牛客 NC24755 [USACO 2010 Dec S]Apple Delivery
  • Git做版本管理及CHANGELOG
  • python经典编程100例(1)
  • GO语言 | go work 神一般的管理 多个module没烦恼
  • 【C语言】指针数组
  • 基于51单片机数字电压表仿真设计_数码管显示
  • 种草模式崛起!小红书KOL达人种草成推广热门方向!
  • Git Commit规范指北
  • 易观之星 | “2022年度用户推荐数字应用”投票通道开启
  • Flutter实战之go_router路由组件入门指南
  • Java--MybatisPlus Wrapper构造器;分页;MP代码生成器(四)
  • JS高级(数据类型,数据_变量_内存)
  • 分类模型评估的实际编码
  • 攻防世界WEB练习-mfw
  • 设计模式:设计模式概述
  • canvas绘制圆角头像
  • Docker下部署自己的LNMP工作环境
  • IDEA常用插件整理
  • js ES6 求数组的交集,并集,还有差集
  • js中forEach回调同异步问题
  • MySQL用户中的%到底包不包括localhost?
  • node入门
  • npx命令介绍
  • Promise初体验
  • Spark学习笔记之相关记录
  • STAR法则
  • XForms - 更强大的Form
  • XML已死 ?
  • Yii源码解读-服务定位器(Service Locator)
  • 两列自适应布局方案整理
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 思考 CSS 架构
  • 想写好前端,先练好内功
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 转载:[译] 内容加速黑科技趣谈
  • puppet连载22:define用法
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • (26)4.7 字符函数和字符串函数
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (九十四)函数和二维数组
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (万字长文)Spring的核心知识尽揽其中
  • (转)树状数组
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net下简单快捷的数值高低位切换
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [1181]linux两台服务器之间传输文件和文件夹