zoukankan      html  css  js  c++  java
  • 如何减少代码中的分支语句

     如何减少代码中的分支语句

      代码中往往存在很多的分支语句:判断+执行;大量的分支语句让代码看上去很丑陋,而且容易增加代码复杂度。

    所以我觉得减少代码的分支语句或者隐藏分支语句是一件很有必要的事情,能够让代码变得更加清晰易读。

    减少分支语句,在实际的编程中遇到了一种比较好的方式——Command模式减少分支语句。

    Command模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。

      所以可以将一系列请求都封装成对象,形成一个请求集合。

    当需要执行一个请求的时候直接去这个集合中查找到对应的请求对象,然后执行对象的Command。

        

    下面以一个具体的例子看一下这个过程:

    结构如下:

        

    命令原型

    复制代码
    interface ScenceCommand {
        void doExecute();
    }
    //CallHang命令
    class CallHangScenceCommand implements ScenceCommand {
        private TelEventTreater mTreater;
    
        public CallHangScenceCommand(TelEventTreater treater) {
            mTreater = treater;
        }
    
        @Override
        public void doExecute() {
            mTreater.doHangCall();
        }
    }
    //CallAnswer命令
    class CallAnswerScenceCommand implements ScenceCommand {
        private TelEventTreater mTreater;
    
        public CallAnswerScenceCommand(TelEventTreater treater) {
            mTreater = treater;
        }
    
        @Override
        public void doExecute() {
            mTreater.doAnswerCall();
        }
    }
    ……不一一列出
    复制代码

    命令注册

    复制代码
    abstract class ScenceCommandRegister {
      //存储所有的命令请求集合
        private HashMap<String, ScenceCommand> mScenceCmdSet;
    
        public ScenceCommandRegister() {
            mScenceCmdSet = new HashMap<String, ScenceCommand>();
        }
        //命令请求注册
        public void registerCommand(String name, ScenceCommand command) {
            mScenceCmdSet.put(name, command);
        }
        //命令请求查询
        public ScenceCommand getCommand(String name) {
                    return mScenceCmdSet.get(name);
        }
    }
    
    class CallScenceCommandRegiser extends ScenceCommandRegister {
        public CallScenceCommandRegiser(TelEventTreater treater) {
            super();
         //注册所有命令      registerCommand(CallInputCommandMatch.CALL_DEFAULT,
    new CallDefaultScenceCommand(treater)); registerCommand(CallInputCommandMatch.CALL_HANG, new CallHangScenceCommand(treater)); registerCommand(CallInputCommandMatch.CALL_ANSWER, new CallAnswerScenceCommand(treater)); registerCommand(CallInputCommandMatch.CALL_REPLY, new CallReplyScenceCommand(treater)); registerCommand(CallInputCommandMatch.CALL_MUTE, new CallMuteScenceCommand(treater));    registerCommand(CallInputCommandMatch.CALL_COMPLETE, new CallCompleteScenceCommand(treater)); registerCommand(CallInputCommandMatch.CALL_NORSP, new CallNoRspScenceCommand(treater)); } }
    复制代码

    命令执行

    复制代码
    private static ScenceCommandRegister mScenceRegister;
    @Override
    public void onResult(Result res) {
      String resultStr = res.Get_RawText();
      do {
         //操作请求
         String cmdStr = mCommandMatch.matchInputCommand(resultStr);
         if (cmdStr == null) {
           break;
         }
        //命令请求
        ScenceCommand scenceCmd = mScenceRegister.getCommand(cmdStr);
        if (scenceCmd == null) {
          break;
        }
        //命令执行
        scenceCmd.doExecute();
      } while (false);
    }
    复制代码

    4 总结

      这是存在比较多的条件判断情况下,以此方式进行存在一个问题是:增加类的数量以及其他额外的开销。

    但其实判断仍然是存在的,只是我们将其隐藏起来而已,很多时候复杂的逻辑流程必然存在无法避免,

    但是却可以将复杂的事情简单化。软件中的复杂度是必然存在的,如何化复杂为简单,真是学问很大啊!

     
  • 相关阅读:
    c c++ 混合编译
    vlc sdl 播放视频可随窗口改变大小
    exec函数族的使用
    gcc编译器命令使用详解
    linux gcc 编译时头文件和库文件搜索路径
    VLC1.2 播放视频迟滞卡
    Ubuntu 中软件的安装、卸载以及查看的方法总结
    SDL2.0 VLC ubuntu安装和黑屏问题
    linux动态库与静态库混合连接
    FFMEPG -- A ffmpeg and SDL Tutorial : tutorial05
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2628776.html
Copyright © 2011-2022 走看看