美文网首页Java
基操勿6皆坐——1(减少过多的if-else判断)

基操勿6皆坐——1(减少过多的if-else判断)

作者: 大黑跟小白的日常 | 来源:发表于2020-03-13 17:47 被阅读0次

    情景描述

    有些时候,我们需要根据不同的参数,做不同的操作。情况较少的时候,我们用if-else无可厚非,然而当有多种情况时,用if-else写出的代码总感觉观赏性、拓展性、13格有些不够自信。这个时候我们就需要对我们的代码进行一下优化。我始终坚信着:代码是可鉴赏的艺术品,机器运行只是它的附属功能!

    以RocketMQ消费者接收消息为例

    盗取阿里云提供的资料描述

    Topic 和 Tag 的定义如下:
    Topic
    消息主题,通过 Topic 对不同的业务消息进行分类。
    Tag
    消息标签,用来进一步区分某个 Topic 下的消息分类,消息从生产者发出即带上的属性。
    Topic 和 Tag 的关系如下图所示。

    image.png

    举例

    我们是一个电商平台,现在有一个下单之后,订单中台需要发出一个topic为"placeOrder"的消息,具体消息tag则代表:女装、日用品、电器、奢侈品、数码、图书、水果、五金、汽车配件.....一共用了18种不同的tag做了具体业务区分。现在有一个数据统计分析系统,需要对这个topic下所有的tag对应的消息进行接收,并实时地完成针对不同的子业务做不同操作的计算。
    那么问题来了,如果我们用if-else来进行处理,你的代码是这样的

            if("a".equals(tag)) {
                // do(msg);
            }else if("b".equals(tag)) {
                // do(msg);
            } // ...
            ...
    

    有的同学或者说,改成switch-case呀,其实也是一样的,代码都太难看了。并且以后如果增加了其它的业务还需要继续添加if-else,并且每次消费消息时,都需要从第一个if开始逐个往下进行字符串比较。

    改造一下

    第一种方式

    提供一个静态map,维护tag->具体操作枚举实例的对应关系

    直接上代码,其中编程思想自行领悟,哈哈

    // MQ消费者监听类
    @Component
    @RocketMQMessageListener(topic = "placeOrder", consumerGroup = "data-system-consumer")
    public class PlaceOrderDataSystemListener implements RocketMQListener<MessageDTO> {
        @Autowired
        private MessageHandler messageHandler;
        @Override
        public void onMessage(MessageDTO rechargeRequest) {
            messageHandler.hand(rechargeRequest);
        }
    }
    
    public class MessageDTO {
        private String tag;
        // 具体业务需要处理的参数对象jsonString
        private String dataJson;
        // ...
    
    // 协调处理类
    @Component
    public class MessageHandler {
        @Autowired
        private IBusinessService businessService;
        private static Map<String,EHandler> handlerMap = new HashMap<>(32);
        static {
            handlerMap.put("tag1",EHandler.A_BUSINESS_HANDLER);
            handlerMap.put("tag2",EHandler.B_BUSINESS_HANDLER);
            handlerMap.put("tag3",EHandler.C_BUSINESS_HANDLER);
            // ...
        }
        // 控制跟逻辑分离的编程思想
        public boolean hand(MessageDTO rechargeRequest) {
            String tag = rechargeRequest.getTag();
            EHandler handler = handlerMap.get(tag);
            // 这句代码写在这可以达到复用的目的,写到枚举hand方法中,则需要写多次
            MessageData messageData = handler.getMessageDataFrom(rechargeRequest.getDataJson());
            boolean handResult = handler.hand(messageData, businessService);
            return handResult;
        }
    }
    
    interface IBusinessService {
        boolean businessAHand(MessageData messageData);
        boolean businessBHand(MessageData messageData);
        boolean businessCHand(MessageData messageData);
        // ...
    }
    
    enum EHandler {
        A_BUSINESS_HANDLER() {
            @Override
            boolean hand(MessageData messageData, IBusinessService businessService) {
                boolean result = businessService.businessAHand(messageData);
                return result;
            }
            @Override
            MessageData getMessageDataFrom(String dataJson) {
                AMessageData aMessageData = JSONObject.parseObject(dataJson, AMessageData.class);
                return aMessageData;
            }
        },
        B_BUSINESS_HANDLER() {
            @Override
            boolean hand(MessageData messageData, IBusinessService businessService) {
                return businessService.businessBHand(messageData);
            }
            @Override
            MessageData getMessageDataFrom(String dataJson) {
                BMessageData bMessageData = JSONObject.parseObject(dataJson, BMessageData.class);
                return bMessageData;
            }
        },
        C_BUSINESS_HANDLER() {
            @Override
            boolean hand(MessageData messageData, IBusinessService businessService) {
                return businessService.businessCHand(messageData);
            }
            @Override
            MessageData getMessageDataFrom(String dataJson) {
                CMessageData cMessageData = JSONObject.parseObject(dataJson, CMessageData.class);
                return cMessageData;
            }
        };
        abstract boolean hand(MessageData messageData, IBusinessService businessService);
        abstract MessageData getMessageDataFrom(String dataJson);
    }
    
    interface MessageData {}
    public class AMessageData implements MessageData{}
    public class BMessageData implements MessageData{}
    public class CMessageData implements MessageData{}
    
    @Service
    public class BusinessService implements IBusinessService {
        @Override
        public boolean businessAHand(MessageData messageData) {
            // do
            return true;
        }
        @Override
        public boolean businessBHand(MessageData messageData) {
            // do
            return true;
        }
        @Override
        public boolean businessCHand(MessageData messageData) {
            // do
            return true;
        }
    }
    

    第二种方式

    Java8 Function

    提供一个不相关的代码如下(加减法判断具体操作)

    public class SimpleTest {
        private static Map<String, Function<? super Hand, ? extends Integer>> optMap = new HashMap<>();
        static {
            optMap.put("+",Hand::add);
            optMap.put("-", Hand::subtraction);
        }
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int a = sc.nextInt();
            String c = sc.next();
            int b = sc.nextInt();
            //...
            int result = new Hand(a,b).execute(optMap.get(c));
            System.out.println(result);
        }
    }
    class Hand {
        public Hand(int a, int b) {
            this.a = a;
            this.b = b;
        }
        private Integer a;
        private Integer b;
        public Integer add() {
            return a+b;
        }
        public Integer subtraction() {
            return a - b;
        }
        public Integer execute(Function<? super Hand, ? extends Integer> function) {
            return  function.apply(this);
        }
    }
    

    相关文章

      网友评论

        本文标题:基操勿6皆坐——1(减少过多的if-else判断)

        本文链接:https://www.haomeiwen.com/subject/pefkshtx.html