ToB企服应用市场:ToB评测及商务社交产业平台

标题: 美团一面:项目中有 10000 个 if else 如何优化?想了半天,被问懵了! [打印本页]

作者: 天津储鑫盛钢材现货供应商    时间: 2024-5-21 09:01
标题: 美团一面:项目中有 10000 个 if else 如何优化?想了半天,被问懵了!
各人好,我是R哥。
迩来做 Java 口试辅导,有个兄弟口试美团,碰到一个特别故意思的问题:
一万个 if else 如何优化,有好的解决方案吗?

我看到这问题都有点懵逼,实际项目中怎么大概会有 10000 个 if else 的代码,至少我工作 10 余年没见过样的代码。
关键要写完这 10000 行的 if else 代码,如果天天写 100 个,是不是意味着也要 100 天才能写完,并且每次哀求都要执行几千上万次的判断,代码难以维护不说,还会严重影响体系性能
很显然,口试官观察的不是一样平常的八股文,这个问题可以看作是一道场景题,它观察一个程序员在面对复杂逻辑判断时的优化能力,也是在观察一个程序员临场发挥技术能力
这兄弟固然说上了策略模式,但显然不是完善和唯一的解决方案,别的像责任链模式等其他计划模式都会存在如许的问题,所以详细的问题还得详细分析。
所以这题可以如许答复:
下面我说说几种方案,欢迎各人拍砖。
if else 优化方案

方案1:策略模式

这个兄弟也说到了策略模式,策略模式先容及实战看这篇:
别在再满屏的 if/ else 了,试试策略模式,真香!!
使用策略模式确实可以提升代码的优雅性,但也会存在以下问题:
策略模式的优点是可以很方便的解耦,适用于有多种差别逻辑和算法的 if 场景,但不适用于大量的 if else 场景。
方案2:策略模式变体

这是策略模式的一种变体:
  1. Map<Integer, Runnable> actionMap = new HashMap<>();
  2. actionMap.put("condition1", () -> { /* 分支1的执行逻辑 */ });
  3. actionMap.put("condition2", () -> { /* 分支2的执行逻辑 */ });
  4. actionMap.put("conditionN", () -> { /* 分支N的执行逻辑 */ });
  5. // 根据条件获取执行逻辑
  6. Runnable action = actionMap.get("condition1");
  7. if (action != null) {
  8.     action.run();
  9. }
复制代码
这种把业务逻辑代码分离出去了,简化了单个类的代码,也省去了策略实现类,让策略类不会得到膨胀,但如果有大量的条件映射,依然会造成单个类的膨胀和难以维护。
这里使用的是线程异步执行的案例,还可以把要执行的逻辑代码存储在其他类、数据库中,然后再用反射或者动态编译的方式加载进去并执行。
方案3:多级嵌套优化

上面说的两种方案嵌套大概无法解决,如果是这种带层级的判断是可以优化的:
  1. /*
  2. * 来源公众号:Java技术栈
  3. */
  4. if(xxxOrder != null){
  5. if(xxxOrder.getXxxShippingInfo() != null){
  6.   if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){
  7.    if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails().getXxxTrackingInfo() != null){
  8.     ...
  9.    }
  10.   }
  11. }
  12. }
复制代码
这种 if 嵌套层级太多,极不优雅,怎么优化见我之前写的这篇:
if else 太多?看我用 Java 8 轻松干掉!
方案4:使用三目运算符

如果判断条件不多,只有 2、3 个的情况下可以使用三目运算符简化 if else 分支。
比如以下代码:
  1. String desc;
  2. if (condition1) {
  3.     desc = "XX1";
  4. } else if (condition2) {
  5.     desc = "XX2";
  6. } else {
  7.     desc = "XX3";
  8. }
复制代码
使用三目运算符一行搞定:
  1. String desc = condition1 ? "XX1" : (condition2 ? "XX2" : "XX3");
复制代码
凌驾 3 个条件就不建议使用了,不然代码可读性会大大降低。
方案5:使用枚举

枚举类型可以用来表现一组固定的值,例如星期几、月份、颜色等,它提供了一种更简洁、可读性更高的方式来表现一组相关的常量。
如以下示例代码:
  1. /**
  2. * 公众号:Java技术栈
  3. */
  4. public class Test {
  5.    
  6.     public static void main(String[] args) {
  7.         Day today = Day.MONDAY;
  8.         System.out.println("Today is " + today);
  9.         System.out.println("Today is " + today.getChineseName());
  10.     }
  11.     enum Day {
  12.         MONDAY("星期一"),
  13.         TUESDAY("星期二"),
  14.         WEDNESDAY("星期三"),
  15.         THURSDAY("星期四"),
  16.         FRIDAY("星期五"),
  17.         SATURDAY("星期六"),
  18.         SUNDAY("星期日");
  19.         private String chineseName;
  20.         Day(String chineseName) {
  21.             this.chineseName = chineseName;
  22.         }
  23.         public String getChineseName() {
  24.             return chineseName;
  25.         }
  26.     }
  27.    
  28. }
复制代码
这里我只写了一个字段,我们可以在枚举属性内里界说多个字段,如许就无需大量的 if else 判断,直接通过枚举来获取某个某一组固定的值了。
方案6:使用 Optional

Java 8 提供了一个 Optional 新特性,它是一个可以包含 null 值的容器对象,可以用来取代 xx != null 的判断。
参考我之前写的这篇:
JDK 8 新特性之 Optional
如果项目中存在大量 xx != null 的判断,可以使用 Optional 来优化。
方案7:尽快返回

分析业务,根据 if else 的执行次数按降序排,把执行次数较多的 if 放在最前面,如果符合条件,就使用 return 返回,如下面代码:
  1. if (条件1) {
  2.     return
  3. }
  4. if (条件2) {
  5.     return
  6. }
  7. ...
复制代码
如许改大概是比较简单的方式,在很大程度上可以提升体系的性能,但是还存在以下问题:
方案8:去除没必要的 if else

比如这种:
  1. if (condition) {
  2.     ...
  3. } else {
  4.     return;
  5. }
复制代码
优化后:
  1. if(!condition){
  2.     return;
  3. }
复制代码
或者是如许:
  1. return !condition
复制代码
方案9:归并条件

考虑这 1 万 if else 是不是真的每个都有必要,是不是可以归并归类,比如是不是可以把几百、几千个相似逻辑的归为一类,如许也能大大简化 if else 数目。
比如以下代码:
  1. double calculateShipping() {
  2.     if (orderAmount > 1000) {
  3.         return 0.5;
  4.     }
  5.     if (customerLoyaltyLevel > 5) {
  6.         return 0.5;
  7.     }
  8.     if (promotionIsActive) {
  9.         return 0.5;
  10.     }
  11. }
复制代码
优化后:
  1. double calculateShipping() {
  2.     if (orderAmount > 1000 || customerLoyaltyLevel > 5 || promotionIsActive) {
  3.         return 0.5;
  4.     }
  5. }
复制代码
如许就把返回相同值的 if 归为一类了,如果 if 较大就能大大简化代码量。
方案10:规则引擎

对于复杂的业务逻辑,业务规则经常变化,规则制定不依赖于技术团队,必要实现可配置的逻辑处置惩罚,此时可以考虑使用规则引擎来处置惩罚,比如 Drools。
规则引擎体系可用于执行一组规则,在很多业务应用程序中,业务决议可以通过一系列的逻辑规则来界说,规则引擎答应这些规则在运行时执行,而无需硬编码在应用程序之中。
规则引擎的好处是:
总结

掌握优化 if else 的方法很重要,偶然候口试官大概会换着法子问你,比如我们口试辅导这位兄弟碰到的这个口试官,你可以问清楚这一万个 if else 是在一个代码块中,还是在一个项目中,然后再去解答,如果不了解清楚业务场景,盲目答复又会被口试官绕进去。
本文我也总结了 10 种优化 if else 的方法,实在还不止,根据差别的场景还可以使用多态、责任链模式、模板方法模式等更多方法来消除 if else。
总之,消除 if else 并没有万能的方法,也不大概全部优化掉,在实际开发中必要根据实际场景使用差别的方法,以及多种方法组合使用,如许才是正确的方式。
像如许的口试题,我的小程序「Java口试库」另有很多,比如:
共 2800+,都是寻常我口试别人,或者学员口试复盘积累下来的真题,不要在网上找乱七八糟的口试题了,浪费时间还容易被误导。
最后,推荐一波我们的「口试辅导」,有在看机会的,离职的、迷茫的,都可以加入,大厂导师 1 v 1 辅导,帮你全面提升口试综合实力,少走很多弯路,最大化提升职场收益。
版权声明: 本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自尊,并生存追究其法律责任的权利。
更多文章推荐:
1.Spring Boot 3.x 教程,太全了!
2.2,000+ 道 Java口试题及答案整理(2024最新版)
3.免费获取 IDEA 激活码的 7 种方式(2024最新版)
觉得不错,别忘了随手点赞+转发哦!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4