面试官:你写的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太多啦的主要内容,如果未能解决你的问题,请参考以下文章
面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?
面试官灵魂拷问:if语句执行完else语句真的不会再执行吗?