原创文章,转载请注明作者:Nomad,出处:www.jialing.net
我想很多人都听说过“2/ 8 ” 原则,有人研究过,这世界上财富的80%集中在20%的人手里,而另外80%的人只拥用20%的财富。实际的商业中,我们应该更关注大客户,因为客户里20%的大客户,对我们贡献的利润可能会占到80%,这些都是有统计学基础的数据。
在应用软件的研发中同样遵守这个原则,我们写的20%底层代码将会起到80%的作用。做过Web项目的人应该都知道,大多数程序都是围绕增、删、改、条件查询等主题实现的,只是需求不同,具体的实现不同罢了。当项目重复性太高的时候,我们开始学习、使用框架技术,比如Hibernate就帮我们提取了很多对数据库操作的程序,目的也是减少程序员编写代码的数量与时间。而框架技术并不能包含我们工作的方方面面,我们依然需要在工作中不断总结、不断归纳,犹如Template设计模式,我们需要将重复的工作总结提炼出来,做成一个个模版,以此来不断简化我们的工作。所以我们需要以2/8原则指导开发设计,让更多的活交给框架去工作,让各种业务流做成模版类,做足底层的工作,将20%的底层代码发挥出80%贡献。
下面以我熟悉的平台框架举个模版的例子。在Hibernate框架下编写DAO层代码,我们需要从数据库中取出数据,以列表形式显示在页面上。这个例子将向你展示,只要做好底层工作,上层的业务逻辑就会变得非常简单(只有短短两行)。
//CommonalityObject.java
//用以装载数据并输出的Java Bean
public class CommonalityObject {
private String str1;
private String str2;
private String str3;
private String str4;
private String str5;
private String str6;
private String str7;
private String str8;
... setters & getters
}
//SQLTemplate.java
/**
* 报表中执行SQL查询的模版
* 以CommonalityObject来装载数据,运用反射机制加载返回List
*
* @author 李嘉陵
* @since 2006-7-14
*/
public class SQLTemplate {
private static Log logger = LogFactory.getLog(SQLTemplate.class);
public List getQueryList(String sql, Session session) throws DAOException{
logger.info(sql);
try {
ResultSet reset = getReset(session,sql);
logger.info("r="+reset);
return reflectList(reset);
}
catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
throw new DAOException(e1);
}
}
// 插入SQL获得相对应的数据集
public ResultSet getReset(Session s, String sql) throws Exception {
Connection conn = null;
Statement stat = null;
ResultSet reset = null;
//获得连接
conn = s.connection();
//装载数据块
stat = conn.createStatement();
//System.out.println("------运行的SQL语句--------"+sql);
//获得对应的数据集
reset = stat.executeQuery(sql);
return reset;
}
/**
* 通过反射机制讲ResultSet中的数据以CommonalityObject形式载入List中,最后返回List
* @author 李嘉陵
* @since 2006-7-14
* @param reset SQL搜索出来的集合
* @return List<CommonalityObject>
* @throws Exception
*/
public List reflectList(ResultSet reset) throws Exception{
List list = new ArrayList();
ResultSetMetaData meta = reset.getMetaData();
while(reset.next())
{
CommonalityObject co = new CommonalityObject();
String tmp="0";
for(int i=1;i<=meta.getColumnCount();i++) {
if (reset.getString(i) == null|| reset.getString(1).equals("") ){
tmp="0";
}
else{
tmp=reset.getString(i);
}
String method_name = "setStr"+i; //需要动态调用的函数名
Class cls=co.getClass(); //得到要在其中查找方法的类
Class partypes[] = new Class[]{String.class}; //函数调用的参数类型,这里为String。
Method mth=cls.getMethod(method_name, partypes); //得到方法
Object[] objs=new Object[]{tmp}; //生成函数要调用的数据,这里为tmp。
mth.invoke(co, objs); //调用得到的函数。
}
list.add(co);
}
return list;
}
}
//最终只要简单的两句就能完成报表的输出工作
public class OrderQryDAOImpl extends BaseDAOImpl implements OrderQryDAO {
public List getList(String cond) throws DAOException {
//SQL语句
String sqlStr = "..." + cond;
return new SQLTemplate().getQueryList(sqlStr,getSession());
}
}
看懂了吗?如果项目中我们需要完成几十个这样的报表输出,有了这样的底层代码结构,编写起来是不是很简单呢。