精华内容
参与话题
问答
  • 项目中的if else太多了,该怎么重构?

    万次阅读 多人点赞 2019-11-09 16:23:09
    介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。...} else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...

    在这里插入图片描述

    介绍

    最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的

    if (msgType = "文本") {
    	// dosomething
    } else if(msgType = "图片") {
    	// doshomething
    } else if(msgType = "视频") {
    	// doshomething
    } else {
    	// doshomething
    }
    

    就是根据消息的不同类型有不同的处理策略,每种消息的处理策略代码都很长,如果都放在这种if else代码快中,代码很难维护也很丑,所以我们一开始就用了策略模式来处理这种情况。

    策略模式还挺简单的,就是定义一个接口,然后有多个实现类,每种实现类封装了一种行为。然后根据条件的不同选择不同的实现类。

    实现过程

    消息对象,当然真实的对象没有这么简单,省略了很多属性

    @Data
    @AllArgsConstructor
    public class MessageInfo {
    
        // 消息类型
        private Integer type;
        // 消息内容
        private String content;
    
    }
    

    定义一个消息处理接口

    public interface MessageService {
    
        void handleMessage(MessageInfo messageInfo);
    }
    

    有2个消息处理接口,分别处理不同的消息

    处理文本消息

    @Service
    @MsgTypeHandler(value = MSG_TYPE.TEXT)
    public class TextMessageService implements MessageService {
    
        @Override
        public void handleMessage(MessageInfo messageInfo) {
            System.out.println("处理文本消息 " + messageInfo.getContent());
        }
    }
    

    处理图片消息

    @Service
    @MsgTypeHandler(value = MSG_TYPE.IMAGE)
    public class ImageMessageService implements MessageService {
    
        @Override
        public void handleMessage(MessageInfo messageInfo) {
            System.out.println("处理图片消息 " + messageInfo.getContent());
        }
    }
    

    文章写到这,可能大多数人可能会想到要需要如下一个Map, Map<消息类型,消息处理对象>,这样直接根据消息类型就能拿到消息处理对象,调用消息处理对象的方法即可。我们就是这样做的,但是我们不想手动维护这个Map对象,因为每次增加新的消息处理类,Map的初始化过程就得修改

    我们使用了注解+ApplicationListener来保存这种映射关系,来看看怎么做的把

    定义一个消息类型的枚举类

    public enum MSG_TYPE {
    
        TEXT(1, "文本"),
        IMAGE(2, "图片"),
        VIDEO(3, "视频");
    
        public final int code;
        public final String name;
    
        MSG_TYPE(int code, String name) {
            this.code = code;
            this.name = name;
        }
    }
    

    定义一个注解

    @Documented
    @Inherited
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MsgTypeHandler {
    
        MSG_TYPE value();
    }
    

    不知道你注意到了没,前面的代码中,每种消息处理类上面都有一个@MsgTypeHandler注解,表明了这个处理类
    处理哪种类型的消息

    @Service
    @MsgTypeHandler(value = MSG_TYPE.TEXT)
    public class TextMessageService implements MessageService {
    
        @Override
        public void handleMessage(MessageInfo messageInfo) {
            System.out.println("处理文本消息 " + messageInfo.getContent());
        }
    }
    

    用一个context对象保存了消息类型->消息处理对象的映射关系

    @Component
    public class MessageServiceContext {
    
        private final Map<Integer, MessageService> handlerMap = new HashMap<>();
    
        public MessageService getMessageService(Integer type) {
            return handlerMap.get(type);
        }
    
        public void putMessageService(Integer code, MessageService messageService) {
            handlerMap.put(code, messageService);
        }
    
    }
    

    最精彩的部分到了

    @Component
    public class MessageServiceListener implements ApplicationListener<ContextRefreshedEvent> {
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            Map<String, Object> beans = event.getApplicationContext().getBeansWithAnnotation(MsgTypeHandler.class);
            MessageServiceContext messageServiceContext = event.getApplicationContext().getBean(MessageServiceContext.class);
            beans.forEach((name, bean) -> {
                MsgTypeHandler typeHandler = bean.getClass().getAnnotation(MsgTypeHandler.class);
                messageServiceContext.putMessageService(typeHandler.value().code, (MessageService) bean);
            });
        }
    }
    

    在spring的启动过程中,通过解析注解,将消息类型->消息处理对象的映射关系保存到MessageServiceContext对象中

    @Autowired
    MessageServiceContext messageServiceContext;
    
    @Test
    public void contextLoads() {
    	// 构建一个文本消息
    	MessageInfo messageInfo = new MessageInfo(MSG_TYPE.TEXT.code, "消息内容");
    	MessageService messageService = messageServiceContext.getMessageService(messageInfo.getType());
    	// 处理文本消息 消息内容
    	// 可以看到文本消息被文本处理类所处理
    	messageService.handleMessage(messageInfo);
    }
    

    测试类正常工作,通过策略模式避免了写大量的if else代码,也更容易维护

    欢迎关注

    在这里插入图片描述

    参考博客

    [1]https://juejin.im/post/5c5172d15188256a2334a15d

    展开全文
  • C语言条件判断语句:if、else if、else

    万次阅读 多人点赞 2018-07-05 13:34:04
    1)简单介绍三种形式的条件判断语句:if、else if、elseif:if(表达式) 执行语句if:判断表达式内容,如果为true(真),就执行语句else if:if(表达式) 执行语句 else if(表达式1) 执行语句1 ......(很多的else if)...

    1)简单介绍三种形式的条件判断语句:if、else if、else

     

    if:

    if(表达式)
        执行语句

    if:判断表达式内容,如果为true(真),就执行语句

     

    else if:

    <span style="color:#333333">if(表达式)
        执行语句
    else if(表达式1)
        执行语句1
    ......(很多的else if)
    else if(表达式m)
        执行语句m</span>

    else if:如果if的判断没有通过,则进行下面的else if,如果当前的else if判断通过,则执行当前else if的语句。如果没通过,则一直执行下面的else if判断

     

    else:

    if(表达式)
        执行语句
    else if(表达式)
        执行语句
    else 
        执行语句

    else:else为最后的分支,如果在else之前的if、else if判断都没有通过就会执行else

     

    PS:在一条if条件判断中,可以有无数条else if,但是只能有一个else

     

     

    2)三种形式的判断语句使用:if、else if、else

     

    if:

    为了可以看到结果使用printf进行显示结果

    #include <stdio.h>
    #include <stdbool.h>
    
    int main(void)
    {
    	bool bTrue = true;
    
    	if (bTrue)
    	    printf("if true!\n");
    	return 0;
    }

    结果:

    if true!

    简单讲解上面的程序:

    包含了stdio.h是为了使用printf函数进行格式化输出结果

    包含了stdbool.h,stdbool.h是C99添加_Bool(布尔值类型)关键字新增的头文件,在stdbool.h中为我们定义了三个我们所使用到的宏:

    bool            _Bool(布尔值类型)

    true            1

    false           0

    所以此处定义了一个_Bool(布尔值类型)变量bTrue,并且赋值true(1)

    所以此处判断为真,最终printf格式化输出了true

     

    PS:_Bool(布尔值类型)占1字节内存大小

    PS:判断真假,真只要不等于0,假为0

     

    else if:

     

    为了可以看到结果使用printf进行显示结果

    #include <stdio.h>
    #include <stdbool.h>
    
    int main(void)
    {
    	bool bTrue = true;
    	bool bFalse = false;
    
    	if (bFalse)
    		printf("if true!\n");
    	else if(bFalse)
    		printf("else if true!\n");
    	else if (bTrue)
    		printf("else if true!\n");
    	return 0;
    }

    结果:

    else if true!

    简单讲解上面的程序:

    定义了一个_Bool(布尔值类型)变量bTrue,并且赋值true(1)

    定义了一个_Bool(布尔值类型)变量bFalse,并且赋值false(0)

    下面的if、else if,此处故意定义多定义一个else if表示在一个if条件判断中可以有多个else if判断

    首先第一个if,因为bFalse为0,所以判断为false(假),为通过,所以往下执行

    下一个else if,因为bFalse为0,所以当前的else if判断为false(假),未通过,然后往下执行

    下一个else if,因为bTrue为1,不等于0,所以当前的else if判断为true(真),通过,然后进行printf格式化输出else if true!,最后跳出当前这个if判断

    PS:如果没有通过当前else if,则一直执行下面的else if判断,如果最后所有else if判断都没有通过,则执行else语句(else为无条件通过),如果也没有else,则最终跳出当前if判断语句

     

    else:

    为了可以看到结果使用printf进行显示结果

    #include <stdio.h>
    #include <stdbool.h>
    
    int main(void)
    {
    	bool bTrue = true;
    	bool bFalse = false;
    
    	if (bFalse)
    		printf("if true!\n");
    	else if(bFalse)
    		printf("else if true!\n");
    	else 
    		printf("else!\n");
    	return 0;
    }

    结果:

    else!

    简单讲解上面的程序:

    定义了一个_Bool(布尔值类型)变量bTrue,并且赋值true(1)

    定义了一个_Bool(布尔值类型)变量bFalse,并且赋值false(0)

    首先执行第一个if,if判断为bFalse为false(假),未通过,继续执行下面的else if或else

    下一个else if,else if判断为bFalse为false(假),未通过,继续执行下面的else if或else

    下一个else,else为无条件通过,最终printf格式输出else!

    PS:在一个if条件判断中,如果之前的if和else if都未通过,那么执行到else为无条件通过

     

    补充 (2020.2.13): 

    #include <stdio.h>
    #include <stdbool.h>
    
    int main(void)
    {
    	// 设定一个循环次数
    	int i = 0, count = 10;
    	while (i++ < count)
    	{
    		// 用if做一个判断, 当 i 为 4 的时候则执行 if 中的内容
    		if (i == 4)
    		{
    			// 简单打印一条内容
    			printf("i == 4.\n");
    		}
    
    		// 一个循环中有多个 if 进行判断
    		// 用if做一个判断, 当 i 为 3 的时候则执行 if 中的内容
    		if (i == 3)
    		{
    			// 简单打印一条内容
    			printf("i == 3.\n");
    		}
    
    		// 一个循环中有多个 if 进行判断
    		// 用if做一个判断, 当 i 为 2 的时候则执行 if 中的内容
    		if (i == 2)
    		{
    			// 简单打印一条内容
    			printf("i == 2.\n");
    			// 注意使用了 continue 后不会再执行下面的内容了
    			printf("continue.\n");
    			continue;
    		}
    
    		// 打印进行突出 continue
    		printf("i is %d, end.....\n", i);
    	}
    	return 0;
    }

    结果:

    i is 1, end.....
    i == 2.
    continue.
    i == 3.
    i is 3, end.....
    i == 4.
    i is 4, end.....
    i is 5, end.....
    i is 6, end.....
    i is 7, end.....
    i is 8, end.....
    i is 9, end.....
    i is 10, end.....

    简单讲解上面的程序:

    1. 首先定义一个 int(整数类型)的变量 i 用于循环计数 和 定义一个 int(整数类型)的变量 count 用于表示总循环数

    2. 然后执行 while 循环,进行一个循环内容的执行,每执行一次进行一次计数递增

    3. 在 while 循环中进行 if 的判断,应要求在循环中增加多个 if 的判断,在每个的判断中进行简单的打印内容

    4. 在循环中 if 的执行 取决于它的判断条件是否匹配,并且如果匹配也仅只会执行一次

    5. 通过结果可以看出,在 while 中 执行到 continue 则不会再往下执行了,通过 i 为 2 的 if 判断则可知道

     

     

     

     

     

    展开全文
  • while else 和for else

    千次阅读 2018-11-11 11:15:12
    #while else 和for else # 因为else语句不是独立语句而是语句块,语句块只有当回退到和与闭合的块 # 一样的缩进量时语句结束,所以else语句不会单独结束 ''' while else 和for else 意思就是while是和else一块的。 ...
    1.
    #while else  和for  else
    #  因为else语句不是独立语句而是语句块,语句块只有当回退到和与闭合的块
    # 一样的缩进量时语句结束,所以else语句不会单独结束
    
    '''
    while else  和for  else
    意思就是while是和else一块的。
    当有break或者return的时候,会跳出while块,
    又因为while和else是一个整体,所以就跳出else,就不执行else
    1.所以只要没有break或者return,不管while是否执行,都会执行else语句(continue也是可以执行else)
    
    while--else   可以代替  do while循环
    '''
    
    
    
    #1.验证不执行while,仍然执行
    count = 55
    while count < 3:
       print (count, " 小于 5")
       count = count + 1
    else:
       print (count, " 大于或等于 5")
    '''
    55  大于或等于 5
    '''
    
    
    
    #2.验证break存在是否,不执行else
    count = 1
    while count < 3:
       print (count, " 小于 5")
       count = count + 1
       if count==2:
           break
    else:
       print (count, " 大于或等于 5")
    
    '''
    1  小于 5
    '''
    
    
    #3.验证  while 正常循环时候,会执行else
    count = 1
    while count < 3:
       print (count, " 小于 5")
       count = count + 1
    
    else:
       print (count, " 大于或等于 5")
    
    
    '''
    1  小于 5
    2  小于 5
    3  大于或等于 5
    
    '''

     

    展开全文
  • awk if else if else

    万次阅读 多人点赞 2017-02-14 09:36:12
    awk 功能强大,可以处理...在网上查了好久,在shell使用awk 的 if else if else 时,网上给的列子是这样的:awk '{if ($1==1) print "A" else if ($1==2) print "B" else print "C"}'尝试了好久也不对,找不到哪儿的错

    awk 功能强大,可以处理文本,筛选需要的信息,这里不再多说,有兴趣的可以上网搜,我在这里只讲awk 怎样使用if else。
    在网上查了好久,在shell使用awk 的 if else if else 时,网上给的列子是这样的:

    awk '{if ($1==1) print "A" else if ($1==2) print "B" else print "C"}'

    尝试了好久也不对,找不到哪儿的错误,后来听大神讲到,每个语句后面都有分号,正确的应该是这样的

    awk '{if ($1==1) print "A"; else if ($1==2) print "B"; else print "C"}'
    展开全文
  • if语句与if else if else语句与if else语句与if if if语句

    万次阅读 多人点赞 2019-10-12 13:27:10
    首先我们来看前三者的使用...2. if else型 if(某个条件) 语句1; else 语句2; 使用场景: 当满足这个条件时,执行某个操作,当不满足这个条件时,执行另一个操作(和if型区别是如果不满足条件一个执行另一个操作,而一...
  • 在肯定句中,everything else的意思是其余的一切;anything else 是其余的任何东西。而在疑问句中,“anything else?”的意思是“还有别的什么东西吗?”Do you like an apple?Anything else?有(/要)别的吗?(no, I ...
  • else语句

    2019-11-10 00:10:36
    else语句 1. if--else 2. else--while循环搭配 如果循环正常结束会执行else 如果是break强制终止,不会执行else 3. else---for 如果循环正常结束会执行else 如果是break强制终止,不会执行else 4. else和try--...
  • 9个小技巧让你的 if else看起来更优雅

    万次阅读 多人点赞 2020-07-03 14:02:14
    9个小技巧让你的 if else看起来更优雅 if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,例如下面这个伪代码: 是不是很奔溃?虽然他是伪代码,并且看起来也很夸张...
  • matlab中if,elseif,else语句

    万次阅读 2019-11-06 20:57:06
    if,elseif,else 表示当条件(表达式)为真时,执行语句 1.语句格式 if 表达式 语句 elseif 表达式 语句 else 语句 end 2.语句描述 if ,表达式,语句, end形式的语句,判断表达式是否为真,当表达式为真的时候,...
  • SQL中的条件语句WHEN-THEN-ELSE

    万次阅读 2018-06-05 15:37:40
    本篇文章讲述SQL条件语句IF-THEN-ELSE语句,以供参考,如有错误或不当之处还望大神们告知。 数据说明 用户表T_USER结构如下: 字段 类型 长度 主键 为空 id number 6 是 否 姓名 char ...
  • 优雅的替换if-else语句

    万次阅读 多人点赞 2020-03-18 23:09:30
    当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if...
  • MATLAB中 elseif 和 else 的区别

    万次阅读 2018-10-12 17:02:55
    elseif A=73 B=33; elseif A=74 B=34; else B=35; end 在一个if循环中: elseif相当于if,需要判断,是在一个if循环中的低一级的判断语句。 else也包含于该if循环,但无须再进行判断,例如上述代码中,只要A...
  • 重点注意:   If(flag)= if(flag==true)   If(!flag) = if(flag==false) ...-----------------------...If … else if … else if … else 是一个整体,一步步执行,从第一个if开始查找满足的boolean表达式,直到找到满
  • if,if else,else if的区别,以js为例

    万次阅读 多人点赞 2019-02-25 14:03:05
    if,if else,else if的区别,以js为例
  • freemarker中的if elseif else语句

    千次阅读 2019-01-16 19:27:16
    freemarker中的if elseif else语句
  • 在Java中多个 if-else 之间的执行顺序有什么区别呢? 对于 if-else 语句,它是 单条件双分支语句,即程序的执行流程是根据 一个条件来控制的; 如下代码演示了存在多个 if - else 时的执行顺序: int test11 = ...
  • java 中 if elseelse if区别

    万次阅读 2018-05-22 15:03:47
    1> if 用于条件判断 例如: int a; int b ; if(a>b){ 如果 a > b 成立时 ,就执行 if 里面的语句 }else{ 如果 a>b 不成立就执行 else 中的语句 } if(a>8){ a>...
  • elseif和else if区别

    千次阅读 2016-03-21 11:10:26
    elseif和else if在使用大括号的时候是一样的, 但是elseif可以用于冒号,而else if则不能。123456789if ($a > $b) { echo "a is bigger than b";} elseif ($a == $b) { echo "a is equal to b";} else...
  • php中 elseif和else if 的区别

    千次阅读 2018-09-21 20:38:04
    写代码的时候发现else if和elseif都可以使用,两种语法都不会报错,他们的区别其实很小 elseif与else if只有在类似下例中使用花括号的情况下才认为是完全相同。如果用冒号来定义if/elseif条件,那就不能用两个单词的...
  • 注意if else的结构写法,有以下三种,除此之外,会不识别else。 结构1 :  if()xxelse yy # 一行;结构2:  if(){xx} else{yy} 或者  if(){ xx }e...
  • if else 语句的空else语句书写

    千次阅读 2019-02-23 23:30:43
    else语句的两种写法 写法1: if // 略 else { // do nothing } 写法2: if // 略 else { ;// do nothing } 两种执行方式没有区别,效果一样的!都不会执行什么! 都可以。;表示空语句 因为{}中可以插入0~...
  • python语言for else和 if else误区

    千次阅读 2018-03-17 10:24:55
    for else和if else误区 在shell脚本或c语言中不会经常提到for else语句,使用最多的为if else语句,因此在遇到python语言中for else语句时不小心就会调入此深垦 需求分析 在分析for else时,需特别举例典型初学...
  • ifelse语句是否必须以else结尾?

    千次阅读 2019-05-19 09:43:40
    答:必须。 使用idea开发时,使用elseif作为结束,结果代码爆红,添加上else之后,红警解除。
  • if else if else的执行顺序

    千次阅读 2020-02-26 17:50:58
    摘要 今天后端大哥问我一个问题,他写的代码没有输出2而是输出的4,接下来就对此问题进行一个简单的记录与解答。 错误代码(错误示例是我进行的简化方便说明问题) ...} else if (a === 1 || b === 2) {...
  • while else 循环

    千次阅读 2018-03-28 22:29:22
    count = 0 while count &lt;= 5: count += 1 print(count) else: print("loop is done") 作用:可以检查while语句是否跳出过,跳出就不执行else
  • shell 脚本 if elseif else

    万次阅读 2015-03-23 11:07:27
    规范有点严格 if空格[空格"xx"空格=空格"xx"空格];空格then echo "if" ...echo "elseif" else echo "else" fi if [ "xx" = "xx" ]; then echo "if" elif [ "xx" = "xx" ]; then
  • Python之Lambda表达式和if not...else用法

    万次阅读 2017-12-06 11:18:45
    # -*- coding: utf-8 -*-print("*******if...else语句*********") #if 条件为真的时候返回if前面内容,否则返回0 exp1= lambda x:x+1 if 2==1 else 0 print(exp1(2))exp2 = lambda x:x+1 if 1==1 else 0 print(exp2...

空空如也

1 2 3 4 5 ... 20
收藏数 395,312
精华内容 158,124
关键字:

else