大量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
的问题
想想上面我们做了哪一些操作。
- 对数据,逻辑进行分析。将相同的数据,逻辑抽象封装成一个父类
- 针对不同的逻辑继承父类,封装到各个子类中。
- 使用工厂模式,针对不同的情况创建不同的子类。
这样做有什么好处?
- 解耦,操作数据的地方,跟数据本身进行解耦。这些操作都被封装到每一个子类中。只要确保传入一个父类类型的数据,那么操作数据的地方就可以执行。而不用管你具体value是什么值,要执行什么操作。
- 易于扩展,以前如果要扩展的话,那么就需要修改每一个操作数据的地方。这里有两个缺点。一个是修改,一个是每一个地方。对于代码都是尽量不去修改原本的代码。所以修改是一个缺点。而修改每一个操作数据的地方,不仅麻烦而且很容易漏掉。因此很麻烦,而如今,并不需要修改原本代码,只需要新增一个子类,然后重写对应的接口,就可以了。
- 易于维护。将这些内容都抽象到每一个类中,代码清晰,并且一处修改所有地方都会跟着修改。