美文网首页设计模式
表驱动模式 + Lambda 方式替换大量IF 语句操作

表驱动模式 + Lambda 方式替换大量IF 语句操作

作者: 蓉漂里的小白 | 来源:发表于2021-04-30 17:22 被阅读0次

1 表驱动概念:

表驱动方法是一种方案:通过索引在表中查找对应的处理action来替换替复杂的逻辑语句(if和 case);在简单情况下,逻辑语句更容易,更直接。随着逻辑链变得越来越多,越来越长,表驱动模式就变得越来越有吸引力。
其实我们平时用的平时用的的HashMap,二维数组就是一种表驱动的思想,只是我们大多时候的在HashMap或2维数组中存储的value是具体的数据。
其实hashmap里也可以存指令。

2: 表驱动示例:

场景:由于历史原因,我们的部门人员接口返回值字段发生了变化,但是对应的数据库中的表都是一样的
所以我们需要做适配。
既:如果返回值key 是 dept 就查询 dept_id, 如果是dept_info 我们就查询id
如果返回值key 是 user 就查询 user_id, 如果是user_info 我们就查询id
第一版本:if else

       JSONObject json = getInfo();
        if (json.containsKey("dept")) {
            String id = json.getString("dept_id");
            Department d = DepartmentDAO.getDeptInfo(id);
        }

        if (json.containsKey("dept_info")) {
            String id = json.getString("id");
            Department d = DepartmentDAO.getDeptInfo(id);
        }

        if (json.containsKey("user")) {
             String id = json.getString("user_id");
             User u = UserDAO.getUserInfo(id);
        }

        if (json.containsKey("user_info")) {
            String id = json.getString("id");
            User u = UserDAO.getUserInfo(id);
        }

如果后面继续添加接口,新增历史版本,这样的代码结构变的很难维护并且可读性会越来越差。

修改为表驱动 + lambda方式

    /**
     * 自定义ID,处理映射表
     */
    private HashMap<String, Function<JSONObject, String>> getCustomId = new HashMap<String, Function<JSONObject, String>>(){
        {
            put("dept", (T) -> DepartmentDAO.getDeptInfo(T.getString("dept_id")));
            put("dept_info", (T) -> DepartmentDAO.getDeptInfo(T.getString("id")));
            put("user", (T) -> UserDAO.getUserInfo(T.getString("user_id")));
            put("user_info", (T) -> UserDAO.getUserInfo(T.getString("id")));
        }
    };

    public void fillID2Result(JSONObject result) {
            getCustomId.keySet().stream().forEach(key -> {
                if (result.getJSONObject("data").containsKey(key)) {
                    String cid = getCustomId.get(key).apply(result.getJSONObject("data").getJSONObject(key));
                    result.getJSONObject("data").getJSONObject(key).put(customId, cid);
                }
            });
        }
    }

这样修改完成后,以后需要新增if 分支就只需要在hashmap中添加一条新的数据就ok 了。对于调用只需要传入参数即可,可以达到代码的解耦合

相关文章

  • 表驱动模式 + Lambda 方式替换大量IF 语句操作

    1 表驱动概念: 表驱动方法是一种方案:通过索引在表中查找对应的处理action来替换替复杂的逻辑语句(if和 c...

  • Oracle常用操作指南

    目录 用户操作语句 表空间操作语句 数据文件操作语句 数据表操作语句 数据库属性操作语句 1. 用户操作语句 查看...

  • 卫语句

    阿里巴巴Java开发手册——“多层条件语句建议使用卫语句、策略模式、状态模式等方式重构”。 卫语句 把复杂的条件表...

  • Python MySQLdb的基本使用方法

    以新建数据库、新建表、插入数据为例,更新、删除、查询等操作只要替换对应sql语句即可 执行结果:

  • 索引案例三:多表优化总结

    【结论】 Join语句的优化 尽可能减少Join语句的次数,永远用小结果集驱动大结果集 保证Join语句中被驱动表...

  • 查询CPU占用高的SQL语句的解决方案

    触发器造成死锁、作业多且频繁、中间表的大量使用、游标的大量使用、索引的设计不合理、事务操作频繁、SQL语句设计不合...

  • 表驱动法(面向对象不是银弹)

    表驱动法是一种编程模式——从表里面查找信息而不适用逻辑语句。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表...

  • 1.Web 基础知识大纲

    SQL命令行操作数据库操作数据表操作Where条件语句Order排序语句Union合并语句注释语句__注意 '--...

  • 第9章 用正则表达式处理文本

    1. 用s///进行替换操作 s///替换操作符:substitution,查找并替换功能。把存在变量中的匹配模式...

  • 表驱动 与 函数字典

    介绍 表驱动法是一种编程模式(Scheme),从表里面查找信息而不使用逻辑语句(if 和case)它的好处是消除代...

网友评论

    本文标题:表驱动模式 + Lambda 方式替换大量IF 语句操作

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