抽取思維(重構設計)

一樂樂發表於2021-12-29
抽取思維(重構設計) 抽取思維(重構設計)

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

相關文章