如何避免一连串的if else

Python050

如何避免一连串的if else,第1张

0x01 为什么要去if else

在开发的过程中我们可能会经常遇到if else的逻辑,写很多if else对于一位有情怀的程序员看来是不可以接收的,也影响阅读人的阅读感受,同时程序也违背了对修改关闭扩展开放的原则。在写程序的过程中我们应该尽量保证修改关闭,也就是说自己的写的代码逻辑应不该让别人在扩展逻辑的过程中进行修改,同时保证高的可扩展性。

在使用if else写程序的过程中你可能会写出如下的代码:

String strategy = ""

if(strategy.equals("策略一")){

}else if(strategy.equals("策略二")){

}else if(...){

}else {

}

当需要加一个分支逻辑就必须得去if else结构中改代码,这样不利于程序扩展,同时也非常难维护,如果业务复杂到一定的程度这块代码可能没法去重构了。

0x02 策略模式 + 工厂模式 + 单例模式

在想到要去掉if else这种结构来写代码,首先容易想到的是通过一个map来保存key对应的逻辑,作为一个从c++转到java开发的程序的思维是通过函数指针来解决问题,但是java并没有这么个东西,所以就有了下面这段代码逻辑了。

public class StrategyTest {

public static void main(String[] args) {

String result = ObtainStrategyInfo.getInstance().getStrategyInfo("策略一")

System.out.println(result)

}

}

/* (单例模式) */

class ObtainStrategyInfo {

private static final ObtainStrategyInfo obtainStrategyInfo = new ObtainStrategyInfo()

public static ObtainStrategyInfo getInstance(){

return obtainStrategyInfo

}

public String getStrategyInfo(String strategy){

StrategyInfo strategyInfo = new StrategyFactory().getStrategyInfoClass(strategy)

return strategyInfo.getStrategyInfo(strategy)

}

}

这种单例模式在类一加载的时候就将单例对象创建完毕,总是这个对象存在内存中,避免了通过线程同步来生成对象,线程安全的创建方式。

/* 其实最终的if else判断逻辑都在这里了 (工厂模式)*/

class StrategyFactory {

private static Map<String, StrategyInfo>strategyInfoMap = new HashMap<String, StrategyInfo>()

static {

strategyInfoMap.put("策略一", new Strategy1())

strategyInfoMap.put("策略二", new Strategy2())

}

public StrategyInfo getStrategyInfoClass(String strategy){

StrategyInfo strategyInfo = null

for(String key : strategyInfoMap.keySet()){

if(strategy.equals(key)) {

strategyInfo = strategyInfoMap.get(key)

}

}

return strategyInfo

}

}

/* (策略模式) */

interface StrategyInfo {

String getStrategyInfo(String strategy)

}

class Strategy1 implements StrategyInfo {

public String getStrategyInfo(String strategy) {

return strategy

}

}

class Strategy2 implements StrategyInfo {

public String getStrategyInfo(String strategy) {

return strategy

}

}

如果需要扩展策略三,是不是只要添加自己的逻辑代码就行了呢?保证对修改关闭?答案是肯定的。可以如下方式来扩展策略三:

/* 在StrategyFactory中注入策略三的对应关系 */

strategyInfoMap.put("策略三", new Strategy3())

/* 然后定义策略三 */

class Strategy3 implements StrategyInfo {

public String getStrategyInfo(String strategy) {

return strategy

}

}

这样可非常方便的扩展策略四、策略五。

go语言中的if语句和其他语言中的类似,都是根据给定的条件表达式运算结果来,判断执行流程。

注意:在go语言中 布尔表达式不用使用括号。

根据布尔值flag判断

程序运行结果

初始变量可以声明在布尔表达式里面,注意它的作用域

程序运行结果

注意:不能使用0或非0表示真假

go语言if语句使用提示:

go语言中的if else语句可以根据给定条件二选一。

比较两个数的大小

运行结果

判断一个数是奇数还是偶数

运行结果

判断一个人是否成年

运行结果

特殊写法,在if前面添加执行语句

运行结果

go语言if语句使用提示:

go语言if语句可以进行多重嵌套使用,进行多重判断。

根据分数判断等级

运行结果

同样也可以写成这样

运行结果

输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母

运行结果

go语言if语句可以嵌套多级进行判断。

判断三个数的大小

运行结果

判断男生还是女生,还有是否成年

运行结果

本文介绍一些Go语言的基础语法。

先来看一个简单的go语言代码:

go语言的注释方法:

代码执行结果:

下面来进一步介绍go的基础语法。

go语言中格式化输出可以使用 fmt 和 log 这两个标准库,

常用方法:

示例代码:

执行结果:

更多格式化方法可以访问https://studygolang.com/pkgdoc中的fmt包。

log包实现了简单的日志服务,也提供了一些格式化输出的方法。

执行结果:

下面来介绍一下go的数据类型

下表列出了go语言的数据类型:

int、float、bool、string、数组和struct属于值类型,这些类型的变量直接指向存在内存中的值;slice、map、chan、pointer等是引用类型,存储的是一个地址,这个地址存储最终的值。

常量是在程序编译时就确定下来的值,程序运行时无法改变。

执行结果:

执行结果:

Go 语言的运算符主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符以及指针相关运算符。

算术运算符:

关系运算符:

逻辑运算符:

位运算符:

赋值运算符:

指针相关运算符:

下面介绍一下go语言中的if语句和switch语句。另外还有一种控制语句叫select语句,通常与通道联用,这里不做介绍。

if语法格式如下:

if ... else :

else if:

示例代码:

语法格式:

另外,添加 fallthrough 会强制执行后面的 case 语句,不管下一条case语句是否为true。

示例代码:

执行结果:

下面介绍几种循环语句:

执行结果:

执行结果:

也可以通过标记退出循环:

--THE END--