有很多if-else,该如何优化?

本文探讨了如何优化代码中大量的if-else结构,提出了使用策略模式、构建查找表及多态等多种方法,并讨论了不同场景下的适用性。
0

这是我重构之后的代码:各位大神看看呢,我一直在纠结设计模式..要疯==

你没见过我们的if else,拿出来吓死你!!!

 

— 蒲柳隐逸 · 2016年01月20日

switch 也是一种解决方案的,不错

 

— 程序猿小何 · 2016年01月27日

评论支持部分 Markdown 语法: **bold** _italic_ [link](http://example.com) > 引用 `code` - 列表
同时,被你 @ 的用户也会收到通知

10个回答

3

已采纳

在if 不满足条件时直接return掉,就不用写else了,这样可以减少if的深度
对于你的例子了,如下:

if (!tokenCheck.equals(token)) {
    obj.setStatus();
    obj.setMsg();
    return obj;
}

if (!isContinue) {
    obj.setStatus();
    obj.setMsg();
    return obj;
}

if (action == 20) {
    // TODO
} else if (action == 30) {
    // TODO
}

这样会让代码好看一点.

如果你纠结设计模式的话,可以把“调用系统通知”和"调用短信接口"抽象成策略,实现共同的接口;
每个策略提供一个accept方法用于判断是否接受传入的actionId,如果accept通过,就可调用该策略的execute方法。

List<Strategy> strategys = new ArrayList<>();
strategys.add(new SystemNoticeStrategy());
strategys.add(new MessageStrategy());

for (Strategy stragety : stragetys) {
    if (strategy.accept(actionId)) {
        strategy.execute();
        break;
    }
}

这个的缺点是要遍历list,其实性能开销并不会太大。

也可以把这些strategys放到map里,然后直接根据actionId从map中取出并执行。

这是一种实现思路,可能还会有更好的方式。

2

这点if else优化个毛线 企业应用那种炒鸡复杂的逻辑都是要跑工作流的 轮不到你业务开发操心
你优化完业务错了就好玩了
唯一一点看着很不爽的 就是你用了一堆println 老老实实找个log4j来用好嘛

复杂一点的应用可以往外甩异常,然后通用的功能,比如鉴权之类,放到拦截器里做,不要放业务里,这样能简洁一点,然而你如果业务就这么复杂优化什么呢

设计模式不是为了模式而模式的,等你哪天上了spring,mybatis这些,想不模式都难
如果再装一点B呢,提示文字要弄到配置里去,或者用i18n来做,每个引用的地方只放对应的id,要不以后改一句话找死你

1

推荐看 《重构:改善既有代码的设计》这本神书,可以解决代码设计上的很多问题,不仅仅是深层的if-else。

虽然有点答非所问的嫌疑,但冒死也要提交回答!

1

如果是我的话 我会写一个Map池,存进map里,直接从Map里取

0

嵌套的 if 可以通过细化成方法来优化

比如你这里

if (tokenCheck.equals(token)) {
    doWork(...);
} else {
    ...
}

void doWork(...) {
    if (isContinue) {
        ...
    } else {
        ....
    }
}

以此类推

0

你这里应该是说的判断actionId的if太多了吧。

如果每个if后面跟的业务逻辑很复杂你可以用多态来代替if

但是你这里似乎不是很复杂,也没什么大问题

0

if-eles 和 switch 在本质上没啥区别,如果条件特别多的话有两种方法细分

一种是先分大段,再分小段,比如

int n = id / 50;
switch (n) {
    case 0:
        do0_49(id);
        break;
    case 1:
        do50_100(id);
        break;
    // ....
}

另一种方法就是建表,把所有 id 对应的东西都放在表中,比如 HashTable。
如果是完全连续(或者少数不连接)的情况,就用数组或者 List 解决了。
你的这个问题中,键是 int,值是 String(保存消息文本) 就好,在其它更复杂的情况下,可以保存对象(比如 Listener 对象,或者 Command 对象之类的)

0

像这种情况,最常见的,也是效率较高的就是做查找表,或者Hash表
即:

建一个表:

Map ActionMap = new HashMap<Integer, String>(){
    {
        put(20, "ddd");
        put(40, "line1\nline2");
    }
};

然后再直接索引输出:

System.out.println(ActoinMap.get(id));
`if-elif-else` 是 Python 中用于**条件控制**的核心语句,它允许程序根据不同的条件执行不同的代码块。通过这种结构,程序可以“做决定”,实现逻辑分支。 --- ### ✅ 什么是 `if-elif-else` 语句? 它是 Python 中的**多分支条件语句**,由三个关键字组成: - `if`:判断一个条件是否为真(True),如果为真就执行对应的代码块。 - `elif`:即 "else if",表示在上一个条件不成立时,再判断另一个条件。 - `else`:当所有前面的条件都不满足时,执行这个最后的备选代码块。 > 所有条件判断的结果必须是布尔值(True 或 False)。 --- ### ✅ 基本语法结构 ```python if 条件1: # 条件1为真时执行 代码块1 elif 条件2: # 条件2为真时执行(前提是条件1为假) 代码块2 else: # 所有条件都为假时执行 默认代码块 ``` > 💡 注意:Python 使用**缩进**(通常4个空格)来定义代码块,而不是大括号 `{}`。 --- ### ✅ 示例:成绩等级判断 ```python score = float(input("请输入你的分数(0-100):")) if score >= 90: grade = "A" elif score >= 80: grade = "B" elif score >= 70: grade = "C" elif score >= 60: grade = "D" else: grade = "F" print(f"你的成绩等级是:{grade}") ``` #### 运行示例: ``` 请输入你的分数(0-100):85 你的成绩等级是:B ``` --- ### ✅ 各部分说明 | 关键字 | 作用 | 是否必需 | |--------|------|----------| | `if` | 主条件判断 | ✅ 必须有 | | `elif` | 多个可选条件 | ❌ 可多个或无 | | `else` | 默认情况处理 | ❌ 可选 | > - `if` 只能有一个 > - `elif` 可以有零个或多个 > - `else` 最多只能有一个,且必须放在最后 --- ### ✅ 常见比较运算符(用于条件判断) | 运算符 | 含义 | 示例 | |--------|--------------|------------------| | `==` | 等于 | `x == 5` | | `!=` | 不等于 | `x != 3` | | `>` | 大于 | `age > 18` | | `<` | 小于 | `price < 100` | | `>=` | 大于等于 | `score >= 60` | | `<=` | 小于等于 | `count <= 10` | --- ### ✅ 实际应用场景 #### 示例:登录权限判断 ```python username = input("用户名:").strip() password = input("密码:").strip() if username == "admin": if password == "123456": print("登录成功!欢迎管理员。") else: print("密码错误!") else: if username == "": print("用户名不能为空!") else: print("用户不存在!") ``` --- ### ✅ 注意事项 1. **缩进必须一致**:Python 依赖缩进来判断代码块归属。 2. **条件表达式要返回布尔值**:如 `x > 5`、`name == "张三"`。 3. 条件判断顺序很重要:Python 会从上往下逐个检查,一旦某个条件为真,就不再检查后面的 `elif`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值