封装与职责分离的开发思维

简介: 封装与职责分离的开发思维

1:封装:参数过多应该封装成一个对象

2:职责分离:谁拥有该数据,谁就应该包含操作该数据的方法

 

■ 举例:没有封装【多个查询条件作为参数 (String name, Integer minAge, Integer maxAge, Integer dormBuildId)


@Override
    public List<Teacher> query(String name, Integer minAge, Integer maxAge, Integer dormBuildId) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM t_teacher WHERE 1=1");
        //封装占位符参数
        List<Object> parameters = new ArrayList<>();
        //拼接sql和设置占位符参数值      //姓名
        if (StringUtils.isNotBlank(name)) {
            sql.append(" AND name LIKE ?");
            parameters.add("%" + name + "%");
        }
        //最小年龄
        if(minAge != null) {
            sql.append(" AND age >= ?");
            parameters.add(minAge);
        }        
        //最大年龄
        if(maxAge != null) {
            sql.append(" AND age <= ?");
            parameters.add(maxAge);
        }
        System.out.println("sql=" + sql);
        System.out.println("parameters=" + parameters);
        return JdbcTemplate.query(sql.toString(), new BeanListHandler<>(Teacher.class), parameters.toArray());
    }



■ 没有实现职责分离的情况:

   @Override

   public List<Teacher> query(TeacherQueryObject tqo) {

       StringBuilder sql = new StringBuilder();

       sql.append("SELECT * FROM t_teacher WHERE 1=1");

       //封装占位符参数

       List<Object> parameters = new ArrayList<>();

      // 拼接sql语句和设置占位符参数值

       //姓名

       if (StringUtils.isNotBlank(tqo.getName())) {

           sql.append(" AND name LIKE ?");

           parameters.add("%" + tqo.getName() + "%");

       }

  。。。。。

}

 

■ 职责分离(谁拥有该数据,谁就应该包含操作该数据的方法):

❀ 要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法


package com.shan.query;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import lombok.Data;
@Data
public class TeacherQueryObject {
    private String name;
    private Integer minAge;
    private Integer maxAge;
    private Integer dormBuildId;
//    // 封装占位符参数
    private List<Object> parameters = new ArrayList<>();
    public TeacherQueryObject() {};
    public TeacherQueryObject(String name, Integer minAge, Integer maxAge, Integer dormBuildId) {
        this.name = name;
        this.minAge = minAge;
        this.maxAge = maxAge;
        this.dormBuildId = dormBuildId;
        this.parameters = parameters;
    }
    public String getQuery() {
        StringBuilder sql = new StringBuilder();
        sql.append(" WHERE 1=1");
        // 拼接姓名
        if (StringUtils.isNotBlank(name)) {
            sql.append(" AND name LIKE ?");        
            parameters.add("%" + name + "%");
        }
        // 拼接最小年龄
        if (minAge != null) {
            sql.append(" AND age >= ?");    
            parameters.add(minAge);
        }
        // 拼接最大年龄
        if (maxAge != null) {
            sql.append(" AND age <= ?");
            parameters.add(maxAge);
        }
        return sql.toString();
    }
    public List<Object> getParameters() {
        return parameters;
    }
}
// 高级查询
    @Override
    public List<Teacher> query(TeacherQueryObject tqo) {
        //职责分离【要拼接的sql语句的数据时在tqo对象里的,且占位符的参数设置数据也是在tqo对象,则tqo对象应该提供对应的方法】
        String querySql = tqo.getQuery();
        String sql = "select * from t_teacher" + querySql;
        List<Object> parameters = tqo.getParameters();
        System.out.println(querySql);
        System.out.println(parameters);
        return JdbcTemplate.query(sql, new BeanListHandler<>(Teacher.class), parameters.toArray());
    }
目录
相关文章
|
7月前
|
设计模式 前端开发 网络协议
软件体系结构 - 软件架构复用
软件体系结构 - 软件架构复用
301 0
|
7月前
|
架构师 测试技术 Linux
嵌入式软件架构中抽象层设计方法
嵌入式软件架构中抽象层设计方法
244 0
|
存储 Cloud Native Linux
软件开发方法:复用与扩展
软件开发方法:复用与扩展
|
7月前
|
C++
C++中类的接口与实现分离的技术性探讨
C++中类的接口与实现分离的技术性探讨
128 1
|
7月前
|
设计模式 API 数据库
【C/C++ 设计思路】C++中解耦策略的艺术:有效管理复杂依赖关系
【C/C++ 设计思路】C++中解耦策略的艺术:有效管理复杂依赖关系
396 3
|
7月前
针对抽象编程与对应的好处
针对抽象编程与对应的好处
54 1
|
设计模式 Oracle 关系型数据库
软件架构设计原则之合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a)而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。
120 0
|
网络协议 数据可视化 测试技术
面向对象分析与设计的底层逻辑
真正掌握了面向对象分析和设计的方法,也体会到其中的益处,对理解业务、方案设计、编码开发都有好处。
852 7
面向对象分析与设计的底层逻辑
|
测试技术
【系统架构】面向对象设计——控制类
【系统架构】面向对象设计——控制类
211 0
|
设计模式 算法 Java
六大原则之外的设计原则|设计原则
在前面的几篇设计原则文章中,我们分别讲述了经典的六大设计原则。但是事实上,我们在开发中还有几个重要的设计原则,在这篇文章中,一并给大家讲述。