精华内容
下载资源
问答
  • 多个if else如何优化

    万次阅读 2018-10-19 09:38:48
    这段时间一直在整改代码圈复杂度,我们的要求是每函数方法圈复杂度不得大于5,以下是整改的部分截图 希望对整改代码的你有所提示或帮助,如果有更好的整改方法,还望您不吝赐教哦!  ...

    这段时间一直在整改代码圈复杂度,我们的要求是每个函数方法圈复杂度不得大于5,以下是整改的部分截图

    希望对整改代码的你有所提示或帮助,如果有更好的整改方法,还望您不吝赐教哦!

     

    展开全文
  • 多个if与多个else if详解

    万次阅读 多人点赞 2015-10-31 15:12:49
    通过观看下面的代码与结果截图可以明白多个if与多个else if 及else执行的情况,简单说就是如果是多个else if的话,只要第一个if条件成立,即使满足else if的条件也不会执行else if及else的内容,如果是多个if的话

    下面两句代码,执行结果

    形式如下

    if ……if……if……else

     if ……else if …… else if……else……

    通过观看下面的代码与结果截图可以明白多个if与多个else if 及else执行的情况,简单说就是如果是多个else if的话,只要第一个if条件成立,即使满足else if的条件也不会执行else if及else的内容,如果是多个if的话,最后的else会执行的;else与最近的if匹配,包括else if 的if


    if与多个else if是分枝情况。只执行其中一条代码,if与多个if是并列情况,会顺序执行

    \

    多个if会顺序执行,最后的else与最近的if匹配

    具体代码如下:

    \


    if与多个else if,只会执行其中一个条件,所以只打印一个结果

    \

    \

    展开全文
  • 如何对多个if-else判断进行优化

    千次阅读 2020-11-16 16:07:04
    当我们遇到需要多个条件判断的业务操作时,最简单直接的办法就是用多个if-else判断,虽然能够实现,但当判断条件过多,甚至是多元判断时,我们的代码就会变得非常不好阅读和维护。 举个例子 这里也可以用switch if...

    如何对多个if-else判断进行优化

    当我们遇到需要多个条件判断的业务操作时,最简单直接的办法就是用多个if-else判断,虽然能够实现,但当判断条件过多,甚至是多元判断时,我们的代码就会变得非常不好阅读和维护。

    • 举个例子

    这里也可以用switch

    if(status === '1'){
          return '未审批'
        }else if(status === '2'){
          return '审批中'
        }else if(status === '3'){
          return '审批通过'
        }else if(status === '4'){
          return '审批退回'
        }else if(status === '5'){
          return '审批异常'
        }
    

    当判断越来越多的时候,优化的空间就来了,接下来和大家分享几种不同场景下关于if-else判断的优化技巧。

    1、使用Object对象

    适用于单层多个判断

    这是一种比较常见的方式,用Object对象把判断收集到一起

    const statusArr = {
          '1': '未审批',
          '2': '审批中',
          '3': '审批通过',
          '4': '审批退回',
          '5': '审批异常'
        }
        
    function getStatus(Num) {
          return statusArr[Num]
    }
        
    getStatus('1') //未审批
    

    这样是不是变得优雅一些了呢?可能看下来可能优化的效果没有非常显著,但别忘了,开发时也许不同的状态对应的是一个不同的方法,如果直接写在if-else中,代码就会变得又臭又长,举个例子对比一下

    代码仅作举例,没有实际意义

    if(status === '1'){
    	  //一些操作
          status = '2'
          return '未审批'
        }else if(status === '2'){
           //一些操作
          status = '3'
          return '审批中'
        }else if(status === '3'){
         //一些操作
          status = '4'
          return '审批通过'
        }else if(status === '4'){
         //一些操作
          status = '5'
          return '审批退回'
        }else if(status === '5'){
         //一些操作
          status = '0'
          return '审批异常'
        }
    

    怎么样,是不是已经眼花撩乱。同样优雅一下

    const statusArr = {
          '1': ()=>{
            //一些操作
            status = '2'
            return '未审批'
          },
          '2': ()=>{
            //一些操作
            status = '3'
            return '审批中'
          },
          '3': ()=>{
            //一些操作
            status = '4'
            return '审批通过'
          },
          '4': ()=>{
            //一些操作
            status = '5'
            return '审批退回'
          },
          '5': ()=>{
            //一些操作
            status = '0'
            return '审批异常'
          },
        }
        
    function getStatus(Num) {
          return statusArr[Num]
    }
        
    getStatus('1')()
    

    这样的话,将逻辑通过数据的形式维护起来,可读性更好。

    以上的方式也可以使用Map对象,相比于Object,Map对象的键就不仅仅只能是一个字符串,可以是任意值,包括函数、对象、基本类型,更加灵活。
    实际情况不多,不做举例。
    对于Map对象不了解的可以通过这篇博文简单了解。链接: Map对象的使用.

    2、通过字符串拼接的方式

    和上一种方式道理是一样,拼接后适合多元判断,例如不同的角色,通过字符串拼接的方式,在对象,或Map对象中进行查找相应的逻辑。

    举个例子:(比如当我们加上一个角色判断时)

    if(role === '打工人') {
    	if(status === '1'){
    	  //一些操作
        }else if(status === '2'){
           //一些操作
        }else if(status === '3'){
         //一些操作
        }else if(status === '4'){
         //一些操作
        }else if(status === '5'){
         //一些操作
        }
    } else if(role === '老板娘') {
    	if(status === '1'){
    	  //一些操作
        }else if(status === '2'){
           //一些操作
        }else if(status === '3'){
         //一些操作
        }else if(status === '4'){
         //一些操作
        }else if(status === '5'){
         //一些操作
        }
    }
    
    

    可以看到,当同一个方法,不同角色不同状态执行的操作不同时,代码将会变得冗长。
    优化的方法:同样使用一个对象收集这种不同的状态,但是由于多元的关系,将角色和状态进行字符串的拼接。

    let statusArr = {
          '打工人_1': ()=>{ \\一些操作 },
          '打工人_2': ()=>{ \\一些操作 },
          '打工人_3': ()=>{ \\一些操作 },
          '打工人_4': ()=>{ \\一些操作 },
          '打工人_5': ()=>{ \\一些操作 },
          '老板娘_1': ()=>{ \\一些操作 },
          '老板娘_2': ()=>{ \\一些操作 },
          '老板娘_3': ()=>{ \\一些操作 },
          '老板娘_4': ()=>{ \\一些操作 },
          '老板娘_5': ()=>{ \\一些操作 },
          
        }
    function getStatus(role,status) {
          return statusArr[`${role}_${status}`]
    }
    

    可以看到,改造之后,更加简明易读,

    不过个人认为这种拼接的方式始终不够规范,易读很可能只针对自己,对于接手的可能语义化还不够,下面介绍一种更好的方式。

    3、使用对象的方式存放在Map对象上

    上面这种方式之所以要拼接在一起,是因为对象的键需要是字符串的限制,如果使用Map对象,键就可以是一个对象、数组或者更多类型,方便了很多。

    let statusMap = new Map([
    	[{role: '打工人', status : '1'}, ()=>{ /*一些操作*/ }],
    	[{role: '打工人', status : '2'}, ()=>{ /*一些操作*/ }],
    	[{role: '打工人', status : '3'}, ()=>{ /*一些操作*/ }],
    	[{role: '打工人', status : '4'}, ()=>{ /*一些操作*/ }],
    	[{role: '打工人', status : '5'}, ()=>{ /*一些操作*/ }],
    	[{role: '老板娘', status : '1'}, ()=>{ /*一些操作*/ }],
    	[{role: '老板娘', status : '2'}, ()=>{ /*一些操作*/ }],
    	[{role: '老板娘', status : '3'}, ()=>{ /*一些操作*/ }],
    	[{role: '老板娘', status : '4'}, ()=>{ /*一些操作*/ }],
    	[{role: '老板娘', status : '5'}, ()=>{ /*一些操作*/ }],
    ])
    let getStatus = function(role,status) {
        statusMap.forEach((value,key)=>{
    	if(JSON.stringify(key) == JSON.stringify({role: role,status: status})){
    	value()
    	}
    })
    }
    getStatus('打工人','1') // 一些操作
    

    解释一下这段代码:
    将状态和角色组成对象放入Map对象中作为键名,将不同的方法作为对应的值。
    getStatus方法找到对应的操作并执行
    这里有一个小坑,由于键名是对象,所以查找Map对象时不能用Map.get()的方法,原因是由于对象的引用类型的问题,所以我用了这种方式转成字符串来比较。实测没有问题。

    以上几种都是基于处理逻辑和配置数据分离的优化方法,这种方法适用于一些不是逻辑不是太复杂的处理。

    对于一些复杂的处理逻辑,可以考虑使用责任链模式,这里简单介绍一下这种设计模式。

    4、责任链模式
    以上的几种方式,都是用穷举的方式在配置数据中查找到相对应的处理方法,而责任链模式就是将整个处理的逻辑改写成一条责任传递链,请求在这条链上传递,直到有一个对象处理这个请求。

    举个例子:

    在一个购物商城,在五一做了一个活动,所以图书类商品根据购买的金额依次做出以下折扣方案

    1、购买满199元,打9折

    2、购买满399元,打8折

    3、购买满599元以上,打7折;

    同样,用最简单的if-else判断写一下

    	if(price < 199){
          return '原价'
        }else if(199 <= price && price < 399){
          return '9折'
        }else if(399 <= price && price < 599){
          return '8折'
        }else if(599 <= price ){
          return '7折'
        }
    

    这里看起来并没有很复杂,但是如果在实际业务中,并不仅仅只需要返回一个折扣力度,可能还需要对活动商品、活动库存、是否使用优惠券等等进行计算,这样的话我们所有的逻辑就全部都写在这一个方法内的if判断语句内,可以想象,可读性是很差的。

    用责任链模式示范一下:

    第一个节点,原价的处理
    function BookHandler() {
    this.calcPrice = function( price ) {
    if ( 199 > price ) {
    console.log("原价是:"+ price);
    } else {
    this.successor.calcPrice( price );
    }
    }
    this.setSuccessor = function( _successor ) {
    this.successor = _successor;
    }
    }
    第二个节点,9折的处理
    function BookCalc9Handler( _successor ) {
    this.calcPrice = function( price ) {
    if ( 199 <= price && price < 399 ) {
    console.log("原价是:"+ price +";打9折后:" + (price * 0.9));
    } else {
    this.successor.calcPrice( price );
    }
    }
    this.setSuccessor = function( _successor ) {
    this.successor = _successor;
    }
    }
    第三个节点,8折的处理
    function BookCalc8Handler() {
    this.calcPrice = function( price ) {
    if ( 399 <= price && price < 599 ) {
    console.log("原价是:"+ price +";打8折后:" + (price * 0.8));
    } else {
    this.successor.calcPrice( price )
    }
    }
    this.setSuccessor = function( _successor ) {
    this.successor = _successor;
    }
    }
    最后,7折的处理
    function BookCalc7Handler() {
    this.calcPrice = function( price ) {
    if ( price >= 599 ) {
    console.log("原价是:"+ price +";打7折后:" + (price * 0.7));
    } else {
    this.successor.calcPrice( price )
    }
    }
    this.setSuccessor = function( _successor ) {
    this.successor = _successor;
    }
    }
     
    

    调用时:

    var price = 400;
    var bookHandler = new BookHandler();
    var bookCalc9Handler = new BookCalc9Handler();
    var bookCalc8Handler = new BookCalc8Handler();
    var bookCalc7Handler = new BookCalc7Handler();
    bookHandler.setSuccessor(bookCalc9Handler);
    bookCalc9Handler.setSuccessor(bookCalc8Handler);
    bookCalc8Handler.setSuccessor(bookCalc7Handler);
         将所有处理方法连成一条责任链,保证总有一个对象能够处理请求
    bookHandler.calcPrice(price);
    

    console.log的结果
    在这里插入图片描述

    如果不使用责任链链模式、根据当前价格要知道每一级打折信息,最后知道具体是那一层上打折才是符合当前价格的折扣。而使用这种模式,只需要知道当前的处理对象是否能够处理,如果不能处理,就传递给下一个对象,直到有一个对象最终处理,逻辑性更强。

    小结

    事实上,大部分业务需求都能使用最基本的if-else完成,只不过是简单和繁琐的问题,当我们遇到这类问题,不妨改变一下思路,将自己的代码优雅化,使用上数据配置或责任链模式,你会发现不仅仅是思路的扩展,代码的逻辑都清晰了不少,希望对各位有所帮助。

    展开全文
  • 优化多个else if的情形

    千次阅读 2016-04-02 01:08:01
    今天面试清晰记得一道题目 `public static void demo(int a, YouHuaDemo yh) { if(a==1){ yh.show1(); }else if(a==2){ // … yh.show2(); }else if(a==3){ // …

    今天面试清晰记得一道题目
    由于题目为伪代码,描述的不清不楚,让人很难理解,在此我把问题详细化。
    举个例子,如包子铺,他会有不同馅的包子卖。

    public  Baozi chushou(String type) {
            Baozi baozi;
    
            if(type.equals("猪肉")){
                persion = new zhurou();
            }else if(type.equals("牛肉")){
                persion = new niurou();
            }else if(type.equals("韭菜")){
    //          ...
            }
        }
    Baozi好比是一个的抽象类或者接口。
    

    interface Baozi {
    void xian();
    }
    `
    如果我要卖不同的包子,每增加一种不同馅的包子,我就要去添加一次esle if 如果我这个猪肉包子卖的不好不想出售了,我就要去掉esle if 中的猪肉包子。如此频繁的修改代码不是我们想要的。那么我们该如何优化呢?

    ———————分—————割————–线—————–

    首先我们要想到哪里的代码变动频繁,就封装哪里的代码。
    既然我们不想自己去创建不同馅的包子,那我们何不交给工厂去创建呢?没错,这就是我们经常提到的工厂设计模式。

    public class BaoziFactory {
        public static Baozi createBaozi(String type){
            Baozi baozi;
    
            if(type.equals("猪肉")){
                baozi= new zhurou();
            }else if(type.equals("牛肉")){
                baozi= new niurou();
            }else if(type.equals("韭菜")){
    //          ...
            }
            return baozi;
        }
    }
    
    这里的代码没什么变动,只是封装了了起来。
    
    这时,我们就需要修改一下我们客户代码的类了
    

    public class ChuShou {

    BaoziFactory baoziFactory; // 引入我们的工厂
    
    public static Baozi chushou(String type) {
        Baozi baozi = BaoziFactory.createBaozi(type);
        baozi.xian();
    
        return baozi;
    }
    

    }

    这样,第一步的优化完成了。我们在卖包子的时候,不需要自己去不断的创建包子了,只需要交给工厂去统一创建就可以了。
    也许有人会问这么做似乎只是把问题搬到了另一个对象中罢了。问题依然没有解决。每添加一个不同馅的包子,依然要修改很多代码。
    我想说的是,BaoziFactory 可以有很多客户,目前只有一个chushou这个方法是他的客户,假如又出现个wanggou()方法呢?这样是不是省略了很多代码呢?可能取的名字都不恰当,但是能说明问题,这样做至少可以让原有的逻辑不会发生改变。

    ```
    
    展开全文
  • 多个if和else if的区别

    万次阅读 2017-04-06 10:49:00
    public class testIf { public static void ... //多个 if 每个if都执行 //else if 如果前面的有一个成立 那么后面的都不执行 int a=1,b=2; if(a == 1){System.out.println("a 等于 " + "1");}//执行
  • if语句中使用多个条件的优化

    千次阅读 2016-04-16 11:31:02
    if语句中使用多个条件的优化 一、使用and(&&)和or(||)运算符优化多条件if语句 例1:如何使用条件“degCent是否大于0,但又小于100?”。 方法一:使用嵌套的if语句 if(degCent0){ document.write("...
  • 使用多个if和使用if else if的区别

    千次阅读 2018-10-16 16:24:32
    //Version1 while(cin.get(ch)) { if(ch==' ') spaces++; if(ch=='\n') newlines++; } //Version2 while(cin.get(ch)) { if(ch==' ') spaces++; else if(ch=='\n') ...
  • 多个if语句和多个if else语句的区别

    千次阅读 2016-10-13 14:39:54
    多个if是所有的if都会进行判断 if else if是只要有满足条件的,就不再对之后的else if进行判断 比如 a = 2; if(a==1) c=1; if(a==2) c=2; if(a%2==0) c=3; 最终结果c=3 a=2; if(a==1) c=1; else if(a==2) c=2; else...
  • Java 多个if 和多个else if 的区别

    千次阅读 2017-07-13 11:36:41
    if(a==1){System.out.println("1");}  if(a==2){System.out.println("2");}  if(a==3){System.out.println("3");}  if(a==1){System.out.println("1");}  else if(a==2){System.out.println("2
  • if条件中有多个判断条件,代码优化

    万次阅读 2018-05-11 16:26:19
    代码:优化后的代码:
  • Java8 IF ELSE IF 优化

    千次阅读 2020-07-04 13:41:06
    Java8 IF ELSE IF 优化现象解决方式if else ifswitch case弊端Java8的实现 现象 在程序中总会看到或者碰到很根据key判断要执行的方法代码等等, ![流程示意图]...
  • &nbsp;&nbsp;&nbsp;如果是多个else if的话,只要第一个if条件成立,即使满足else...如果是多个if的话,最后的else会执行的;else与最近的if匹配,包括else if 的if。 int i = 0; if(i==0){ System.out...
  • 多个if····if····语句和else if的区别

    万次阅读 多人点赞 2018-10-23 12:48:21
    多个if语句和else if的区别 来自https://zhidao.baidu.com/question/541324936.html
  • 怎样优化代码中那么if else

    千次阅读 2020-04-25 09:22:56
    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼。...那么我们本文就来详细聊聊,有没有什么方法可以让我们避免来写这么if else 呢? 我们本文提供了 9 种...
  • 多个if语句和else if有什么区别?

    千次阅读 多人点赞 2018-11-27 01:16:56
    1,从字面上理解if为如果,就是如果这种情况,如果那种情况。...4,区别2:由于if都会执行一遍,则可能会同一个需要判断的事件,会进入2个if语句中,出现错误,而else if就不会发生这样的事情。 ...
  • v-if多个条件判断语句

    万次阅读 2019-06-19 01:17:05
    v-if多个条件判断语句 还有条件则继续增加v-else-if // 我这里是三个条件,如果还有条件则继续增加 v-else-if <div v-if="item.enable === '已签到'"> <span class="badge badge-success">{{ item....
  • Java for循环中有3个if判断依次执行。for循环16次, 我想让第一个if判断先执行16次(优先执行16次), 如果在16次中有符合第一个if判断的就执行停止循环。 如果16次之后,第一个if判断没有符合的结果,在依次执行第2...
  • Java:程序开发中if else多层嵌套的优化

    万次阅读 多人点赞 2019-01-09 11:53:52
    Java:程序开发中if else多层嵌套的优化 if else作为每种编程语言都不可或缺的条件语句,我们在编程时会大量的用到。但if else一般不建议嵌套超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速...
  • Python中if多个条件怎么办?

    万次阅读 2020-02-26 17:12:38
    Python中if多个条件怎么办 python中if多个条件,可以使用and、or、elif关键字来连接。 Python 编程中 if 语句用于控制程序的执行,基本形式为:(推荐:python视频教程) if 判断条件: 执行语句……else: 执行...
  • 看到一篇用工厂+策略模式优化 多If else的文章,感觉非常不错,文章地址如下: 代码重构:用工厂+策略模式优化过多的if else代码块 文章中利用工厂和策略模式对多个if else 语句进行了优化,其思路:1、定义一个...
  • 一、If语句If() { } If() {} else {} If() {} if() {} if() {} If() {} else if() {} else if() {} else {} 说明: 1) 可以进行... 2) 按先后顺序依次判断是否成立,当一个if 语句检测为真,后面的else if 及 e...
  • 关于c程序中多层嵌套结构的优化方法,在百度中找来找去,发现写这方面的文章不。下面就我个人总结出来的几方法,写出来,与大家分享。也希望看到这篇文章的人,要是有更好的方法,也在底下评论留言。您的一点...
  • 多个if else判断的优雅替换

    千次阅读 热门讨论 2018-04-08 22:15:39
    最近在敲代码的时候,经常会遇到同事写的一大串if else 判断代码,明知道这样写不好,但是又不知道从何下手优化,例如下面这: 之后学习“重构”这本书的时候,恰巧遇到了解决这类问题的一思路,自己写了一...
  • 一、 只判断一种情况的列表推导式,如判断是否是偶数: a=[i for i in range(20) if i %2==0] print(a) ...a=['零' if i==0 else '三' if i==3 else '五' if i==5 else i for i in range(20) ] print(...
  • 最近看雷达的恒虚警检测GO-FAR算法,在两个if-elseif-else 语句中迷失了。 大致结构如下: if A process1 elseif B process2 else process3 end if C process4 elseif D process5 else process6 end 在...
  • v-if判断多个列表优雅写法

    万次阅读 2021-05-02 04:31:52
    业务中经常碰见点击那个列表显示哪块内容,如果给每v-if绑定不同的变量是很不优雅的 <Perone v-if="active1"/> <Pertwo v-if="active2"/> <Perthree v-if="active3"/> <Perfour v-if=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,135,598
精华内容 2,054,239
关键字:

多个if怎么优化