`
gtssgtss
  • 浏览: 16721 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

重构题(3) -- 第一个问题所在

SQL 
阅读更多
接上回:
:我们可以Extract Method(提炼函数)啊,只要把重复部分提炼出来就ok了.
:别把问题想的太简单,你看这两个函数,主要是在返回的地方不同,没办法直接提炼,我们应该使用模板方法模式.
:我们已经使用了模板方法模式了,现在要再次引入模板方法模式,不觉得太复杂了吗? :的确这样,看来我们给这个类赋予了过多职责.
:嗯,我们把查询的功能分离出去吧,只剩下构造SQL的职责就没问题了

public abstract class SimplePagingQueryJdbcTemplate{
	
	public static final Pattern fromPattern = Pattern.compile("from",Pattern.CASE_INSENSITIVE);
	
	public static final String countSQLHead = "select count(*) from ";
	
	public static final Pattern orderByPattern = Pattern.compile("order(\\s)+by",Pattern.CASE_INSENSITIVE);
	
	public static final Pattern selectPattern = Pattern.compile("select",Pattern.CASE_INSENSITIVE);
		
	public void prepareQuery(SimpleQuery query,Pager pager) {
		query.setQuerySQL(createPagingQuerySQL(query.getQuerySQL(), pager.getFirstResult(), pager.getPageSize()));
	}

	public void prepareCount(SimpleQuery query) {
		query.setCountSQL(createCountSQL(query.getQuerySQL()));
	}
	private String createCountSQL(String querySQL){
		String[] SQLParts = fromPattern.split(querySQL, 2);
		if(SQLParts.length!=2){
			throw new IllegalArgumentException("The SQL query maybe miss the word \"from\".");
		}
		String countSQLbody = cutLastOrderBy(SQLParts[1])[0];		
		return countSQLHead+countSQLbody;
	}
	
	protected String[] cutLastOrderBy(String sql){
		Matcher matcher = orderByPattern.matcher(sql);
		if(!matcher.find()){
			return new String[]{sql,null};
		}
		int	orderByIndex = matcher.start();		
		while(matcher.find()){
			orderByIndex = matcher.start();
		}
		return new String[] {sql.substring(0,orderByIndex),sql.substring(orderByIndex)};
	}
	
	
	protected abstract String createPagingQuerySQL(String querySQL, long firstResult, int maxResult);
}


:现在清爽多了,连原来的重复代码都消除了
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics