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


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

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

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

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

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

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

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

        

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

    结构如下:

        

    1 命令原型

    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();
        }
    }
    ……不一一列出

    2 命令注册

    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)); } }

    3 命令执行

    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 总结

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

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

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

  • 相关阅读:
    测试一面(宇宙条)
    java实现快速排序
    java实现冒泡排序
    Perl 获取当前系统时间
    日常问题解决:记一次因watchdog未启动导致的resin启动失败解决
    日常问题解决:记一次因信号量不足引起的APACHE启动错误解决以及kernel.sem值优化
    oracle11g使用expdp、impdp导出导入用户表结构
    日常问题解决:rhel6解决curl版本过旧问题
    日常问题解决:解决fork: retry: 资源暂时不可用
    日常问题解决:rhel7修改TCP最大连接数
  • 原文地址:https://www.cnblogs.com/bastard/p/2627939.html
Copyright © 2020-2023  润新知