面试官:你写的if、else太多啦

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试官:你写的if、else太多啦相关的知识,希望对你有一定的参考价值。

参考技术A 在代码编写初期,我们写出来的代码,脉络清晰,结构简单。可随着bug或者新需求的出现,状态变得越来越多,只能不停地加else来区分,久而久之,判断的次数越来越多,嵌套的层数也越来越深,变得难以维护。

当我们狠下心来决定改造时,有哪些方法能够优化if else结构呢?

优化前:

优化后:

这个做法,将可以return的状态提到if中,直接干掉了else!

优化前:

优化后:

这种方式局限性比较大,但对于那些依据状态直接返回某个值的情况非常适用,优化后代码非常简洁。如果三目运算符中还嵌套一层三目运算符,建议就不要使用这种方式了。

我们在代码中,经常需要判断某个对象是否为null,不为null后才会进行接下来的操作,好在java8为我们提供了Optional类。

优化前:

优化后:

Optional让非空校验更加有优雅,代码层面减少了if判断,其实Optional在底层为我们封装好了if null判断而已。

优化前:

同样,我们可以借鉴方式一提前return,来代替else

如果这里面的情况很多,我们可能依然要判断多次,那我们用switch改写。

优化后:

如果单从效率来看,之前的时间复杂度为O(n),switch的复杂度为O(1),本质上swicth是通过比对String的哈希码来实现的。

如果上一例中的student、teacher是常量的话,最好是定义在枚举里。

最后这样调用即可:

表驱动法是指我们可以将信息存在于表中,从表中取,而不必用if else逻辑去寻找,大可以将这里的“表”理解为一种容器。

例如我们可以将每月的天数存在数组中,需要时,直接从数组中获取,而不是用if else输出。

或者依据不同的字符串,执行不同的处理逻辑。if else版本如下:

在这种情况下,使用表驱动法后,可以让Student、Teacher等类实现某一个共同的接口,在实现方法里,书写各自的逻辑。然后利用Spring强大的自动注入,会注入到Map组件名称,组件实例>的map里,之后直接根据组件名称来获取到对应的实例,最后调用各自的逻辑。

这个例子可以先异步到我的另外一篇文章【SpringBoot】使用不同的策略动态地调用某个接口的实现类

首先给定以下的一个场景,传入一个职业,输出职业的主要工作

一般我们会这么写:

那么,每增加一种职业,就会增加一个if else判断,代码可读性差,日后难以维护。

现在使用策略模式+工厂模式来改造它。

职业接口:

实现类:

工厂类:

优化后:

之后每增加一种职业,只要实现Profession接口就好,并在ProfessionFactory中注册自己。使用策略模式+工厂模式,再也不需要为日益增长的if else头疼了。

当然,这里的key值,可以设置为常量。

过多的if else严重降低可读性与可维护性,所以在一开始,就要依据实际情况,灵活地选择处理方式。

以上是关于面试官:你写的if、else太多啦的主要内容,如果未能解决你的问题,请参考以下文章

阿里面试官花近十年整理出来的 Java 面试宝典 PDF

面试官 | 写if 时不带 else,你的代码会更好!

面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?

面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?

面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?

面试官:聊聊索引失效?失效的原因是什么?