以2/8原则指导我们的底层框架设计

原创文章,转载请注明作者: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());
     
 }
}

 

看懂了吗?如果项目中我们需要完成几十个这样的报表输出,有了这样的底层代码结构,编写起来是不是很简单呢。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值