最新公告
  • 欢迎您光临极客文库,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6、7层,一个函数几百行,简!直!看!死!人!
    这个无限循环嵌套,只是总循环的一部分。。。我已经绕晕在黄桷湾立交
    仔细数了数,一共有 11 层的嵌套!!!接手这种项目的同学,内心应该是绝望的。
    出现这种情况的原因很多
    • 设计不够完善
    • 需求考虑不完全
    • 开发人员变动
    但最为致命的是“懒”
    你懒,我也懒,前期迭代懒得优化,来一个需求,加一个if,久而久之,就串成了一座金字塔。
    当代码已经复杂到难以维护的程度之后,只能狠下心重构优化。那,有什么方案可以优雅的优化掉这些多余的if/else?

    1. 提前return

    这是判断条件取反的做法,代码在逻辑表达上会更清晰,看下面代码:
    1. if(condition){
    2. // do something
    3. }else{
    4. return xxx;
    5. }
    其实,每次看到上面这种代码,我都心里抓痒,完全可以先判断 !condition,干掉else。
    1. if(!condition){
    2. return xxx;
    3. }
    4. // do something

    2. 策略模式

    有这么一种场景,根据不同的参数走不同的逻辑,其实这种场景很常见。 最一般的实现:
    1. if(strategy.equals("fast")){
    2. // 快速执行
    3. }elseif(strategy.equals("normal")){
    4. // 正常执行
    5. }elseif(strategy.equals("smooth")){
    6. // 平滑执行
    7. }elseif(strategy.equals("slow")){
    8. // 慢慢执行
    9. }
    看上面代码,有4种策略,有两种优化方案。

    2.1 多态

    1. interfaceStrategy{
    2. void run()throwsException;
    3. }
    4. classFastStrategyimplementsStrategy{
    5. @Override
    6. void run()throwsException{
    7. // 快速执行逻辑
    8. }
    9. }
    10. classNormalStrategyimplementsStrategy{
    11. @Override
    12. void run()throwsException{
    13. // 正常执行逻辑
    14. }
    15. }
    16. classSmoothStrategyimplementsStrategy{
    17. @Override
    18. void run()throwsException{
    19. // 平滑执行逻辑
    20. }
    21. }
    22. classSlowStrategyimplementsStrategy{
    23. @Override
    24. void run()throwsException{
    25. // 慢速执行逻辑
    26. }
    27. }
    具体策略对象存放在一个Map中,优化后的实现
    1. Strategy strategy = map.get(param);
    2. strategy.run();
    上面这种优化方案有一个弊端,为了能够快速拿到对应的策略实现,需要map对象来保存策略,当添加一个新策略的时候,还需要手动添加到map中,容易被忽略。

    2.2 枚举

    发现很多同学不知道在枚举中可以定义方法,这里定义一个表示状态的枚举,另外可以实现一个run方法。
    1. publicenumStatus{
    2. NEW(0){
    3. @Override
    4. void run(){
    5. //do something
    6. }
    7. },
    8. RUNNABLE(1){
    9. @Override
    10. void run(){
    11. //do something
    12. }
    13. };
    14. publicint statusCode;
    15. abstractvoid run();
    16. Status(int statusCode){
    17. this.statusCode = statusCode;
    18. }
    19. }
    重新定义策略枚举
    1. publicenumStrategy{
    2. FAST {
    3. @Override
    4. void run(){
    5. //do something
    6. }
    7. },
    8. NORMAL {
    9. @Override
    10. void run(){
    11. //do something
    12. }
    13. },
    14. SMOOTH {
    15. @Override
    16. void run(){
    17. //do something
    18. }
    19. },
    20. SLOW {
    21. @Override
    22. void run(){
    23. //do something
    24. }
    25. };
    26. abstractvoid run();
    27. }
    通过枚举优化之后的代码如下
    1. Strategy strategy =Strategy.valueOf(param);
    2. strategy.run();

    3. 学会使用 Optional

    Optional主要用于非空判断,由于是jdk8新特性,所以使用的不是特别多,但是用起来真的爽。
    使用之前:
    1. if(user ==null){
    2. //do action 1
    3. }else{
    4. //do action2
    5. }
    如果登录用户为空,执行action1,否则执行action 2,使用Optional优化之后,让非空校验更加优雅,间接的减少if操作
    1. Optional<User> userOptional =Optional.ofNullable(user);
    2. userOptional.map(action1).orElse(action2);

    4. 数组小技巧

    来自google解释,这是一种编程模式,叫做表驱动法,本质是从表里查询信息来代替逻辑语句,比如有这么一个场景,通过月份来获取当月的天数,仅作为案例演示,数据并不严谨。
    一般的实现:
    1. int getDays(int month){
    2. if(month ==1)return31;
    3. if(month ==2)return29;
    4. if(month ==3)return31;
    5. if(month ==4)return30;
    6. if(month ==5)return31;
    7. if(month ==6)return30;
    8. if(month ==7)return31;
    9. if(month ==8)return31;
    10. if(month ==9)return30;
    11. if(month ==10)return31;
    12. if(month ==11)return30;
    13. if(month ==12)return31;
    14. }
    优化后的代码
    1. int monthDays[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    2. int getDays(int month){
    3. return monthDays[--month];
    4. }

    结束

    if else作为每种编程语言都不可或缺的条件语句,在编程时会大量的用到。一般建议嵌套不要超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » 面试官:优化代码中大量的if/else,你有什么方案?

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    Leave a Reply

    Hi, 如果你对这款资源有疑问,可以跟我联系哦!

    联系发布者

    Leave a Reply

    Hi, 如果你对这款资源有疑问,可以跟我联系哦!

    联系发布者
    • 101会员总数(位)
    • 3672资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 128稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级