首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-08-24 
重构题(3) -- 第一个问题所在接上回::我们可以Extract Method(提炼函数)啊,只要把重复部分提炼出来就ok了.

重构题(3) -- 第一个问题所在
接上回:
:我们可以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};}intorderByIndex = 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);}


:现在清爽多了,连原来的重复代码都消除了

热点排行