抽取思维(重构设计)

简介: 抽取思维(重构设计)

抽取思维(重构设计)


73.png


1、✿ class TeacherQueryObject中的代码:

@Data
public class TeacherQueryObject {
  private String name;
  private Integer minAge;
  private Integer maxAge;
  private Integer dormBuildId = -1;
  // 封装占位符参数
  private List<Object> parameters = new ArrayList<>();
  //解决where 1=1 索引问题【定义一个容器,当容器放进了条件,取出容器的条件(第一个条件前拼接上where,其他拼接and)】
  //封装查询条件
  private List<String> conditions = new ArrayList<>();
  public String getQuery() {
    StringBuilder sql = new StringBuilder();
    // 拼接姓名
    if (StringUtils.isNotBlank(name)) {
      conditions.add("name LIKE ?");    
      parameters.add("%" + name + "%");
    }
    // 拼接最小年龄
    if (minAge != null) {
      conditions.add("age >= ?"); 
      parameters.add(minAge);
    }
    // 拼接最大年龄
    if (maxAge != null) {
      conditions.add("age <= ?");
      parameters.add(maxAge);
    }
    // 拼接宿舍编号
    if (dormBuildId != -1) {
      conditions.add("dormBuildId = ?");
      parameters.add(dormBuildId);
    }
    if(conditions.size() == 0) {
      return "";
    }
    sql.append(" WHERE ");
    //利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来
    sql.append(StringUtils.join(conditions, " AND "));
    return sql.toString();
  }
  public List<Object> getParameters() {
    return parameters;
  }

2、✿ class DormBuildQueryObject的代码:

@Data
public class DormBuildQueryObject {
  private Integer dormBuildId = -1;
  private String dormBuildName;
  private String dormBuildDetail;
  //封装占位符参数
  private List<Object> parameters = new ArrayList<>();
  //解决where 1=1 索引问题【定义一个容器,当容器放进了条件,取出容器的条件(第一个条件前拼接上where,其他拼接and)】
  //封装查询条件
  private List<String> conditions = new ArrayList<>();
  public String getQuery() {
    StringBuilder sql = new StringBuilder();
    // 拼接宿舍id
    if (dormBuildId != -1) {
      conditions.add("name LIKE ?");    
      parameters.add(dormBuildId);
    }
    // 拼接宿舍楼名
    if (StringUtils.isNotBlank(dormBuildName)) {
      conditions.add("dormBuildName = ?");  
      parameters.add(dormBuildName);
    }
    // 拼接宿舍详情
    if (StringUtils.isNotBlank(dormBuildDetail)) {
      conditions.add("dormBuildDetail = ?");
      parameters.add(dormBuildDetail);
    }
    if(conditions.size() == 0) {
      return "";
    }
    sql.append(" WHERE ");
    //利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来
    sql.append(StringUtils.join(conditions, " AND "));
    return sql.toString();
  }
  public List<Object> getParameters() {
    return parameters;
  }

抽取:

共同属性、方法(结构内容都相同)、方法(结构相同、内容不同)【处理为结构相同、内容也相同:抽取不同的内容封装成一个方法】

3、共性----①抽取到单独一个类中去 ②抽取到父类中(因为两个类的作用都是查询----抽到父类中)

● 细节:抽取到父类中的属性(尽量不改写成protected---破坏封装)、方法可以改写成protected给子类重写

● 子类中的方法customizedQuery 中 conditions、parameters报错

● 原因:conditions、parameters集合在父类是封装成私有(不改成protected),报错可以封装分法提供接口给外界访问(重点是要知道子类需要conditions 和 parameters的目的是什么?)

目的:将传递到子类中的条件、参数值添加到父类的conditions集合、parameters集合中去


✿ class QueryObject 父类中的代码:

package com.shan.query;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
//高级查询对象的基类,包含所有查询对象的共性
public class QueryObject {
  // 封装占位符参数
  private List<Object> parameters = new ArrayList<>();
  // 封装查询条件
  private List<String> conditions = new ArrayList<>();
  public String getQuery() {
    StringBuilder sql = new StringBuilder();
    customizedQuery();
    if (conditions.size() == 0) {
      return "";
    }
    sql.append(" WHERE ");
    // 利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来
    sql.append(StringUtils.join(conditions, " AND "));
    return sql.toString();
  }
  public List<Object> getParameters() {
    return parameters;
  }
  //暴露给子类:让子类覆盖并编写自个的查询条件和参数 
  protected void customizedQuery() {
  }
  //暴露给子类:让子类在customizedQuery中调用,添加字节的查询条件和参数
  protected void addQuery(String condition, Object param) {
    this.conditions.add(condition);
    this.parameters.add(param);
  }
}

✿ class DormBuildQueryObject 继承父类中的代码:

@Data
public class DormBuildQueryObject extends QueryObject{
  private Integer dormBuildId = -1;
  private String dormBuildName;
  private String dormBuildDetail;
  // 自身的定制查询
  public void customizedQuery() {
    // 拼接宿舍id
    if (dormBuildId != -1) {
//      conditions.add("name LIKE ?");
//      parameters.add(dormBuildId);
      super.addQuery("name LIKE ?", dormBuildId);
    }
    // 拼接宿舍楼名
    if (StringUtils.isNotBlank(dormBuildName)) {
      super.addQuery("dormBuildName = ?", dormBuildName);
    }
    // 拼接宿舍详情
    if (StringUtils.isNotBlank(dormBuildDetail)) {  
      super.addQuery("dormBuildDetail = ?", dormBuildDetail);
    }
  }


目录
相关文章
|
1月前
|
测试技术 双11 开发者
一文分析架构思维之建模思维
软件里的要素不是凭空出现的,都是源于实际的业务。本文从软件设计本源到建模案例系统的介绍了作者对于建模的思维和思考。
|
9月前
|
敏捷开发 监控 架构师
【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(构建领域知识)
【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(构建领域知识)
221 0
|
6月前
|
设计模式 架构师 数据建模
架构师必备底层逻辑:设计与建模的技术深度探索
【8月更文挑战第13天】在软件开发的浩瀚星海中,架构师如同星辰指引,他们不仅规划着系统的蓝图,更在底层逻辑上精雕细琢,确保系统的稳健与高效。其中,“设计与建模”作为架构师的核心能力之一,是连接业务需求与技术实现的桥梁。本文将深入探讨架构师在设计与建模过程中的关键思维与实践方法,为工作学习中的技术同仁提供一份宝贵的干货分享。
85 3
|
9月前
|
Java 测试技术 程序员
2024提升计划|优秀程序员的10大共性特征
在设计代码时,很多开发者并没有考虑到"容易测试"这个因素,可测试性不强。如果工程师在开发逻辑的过程中同时考虑如何轻松地进行测试,那么编写出的代码将具备良好的可读性和简单性,并经过精心设计,而不仅仅是"能工作"而已。测试所得到的主要好处发生在考虑测试和编写测试的时候,而不是在运行测试的时候!
|
项目管理 开发者
实际工作中结构化思维在表达中的应用
技术PM如何在实际工作中正确精准表达出自己想要输出的信息,掌握底层逻辑---结构化思维就显得尤为重要。而培养结构化思维的有效工具即是---金字塔原理。
42516 31
编写s=1+2+3+...+n思路打破认知
最近在和领导讨论架构设计,其中涉及到如何通过代码来体现面向对象?通过一个例子来打破了原有的认知,以此总结记录自己的提升和成长
|
架构师 UED
【设计思维框架】为现代企业重新设想的设计思维(上)
【设计思维框架】为现代企业重新设想的设计思维
|
安全 数据可视化 测试技术
【设计思维框架】为现代企业重新设想的设计思维(下)
【设计思维框架】为现代企业重新设想的设计思维
|
安全 数据可视化 测试技术
【设计思维框架】框架 :为现代企业重新设想的设计思维(下)
【设计思维框架】框架 :为现代企业重新设想的设计思维
|
架构师 UED
【设计思维框架】框架 :为现代企业重新设想的设计思维(上)
【设计思维框架】框架 :为现代企业重新设想的设计思维