楼主: klyuan

[精华] 通用分页实现及其OO设计探讨

[复制链接]
论坛徽章:
0
21#
发表于 2006-12-20 17:02 | 只看该作者
有用的帖子当然顶。

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-03-01 11:07:22ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
22#
发表于 2006-12-24 11:09 | 只看该作者
写得不错,学习了

使用道具 举报

回复
论坛徽章:
39
ITPUB元老
日期:2005-10-13 10:38:002012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB官方微博粉丝徽章
日期:2011-07-04 09:42:062011新春纪念徽章
日期:2011-02-18 11:43:352011新春纪念徽章
日期:2011-01-04 10:36:17ITPUB9周年纪念徽章
日期:2010-10-08 09:34:022010新春纪念徽章
日期:2010-03-01 11:07:27祖国60周年纪念徽章
日期:2009-10-09 08:28:002009新春纪念徽章
日期:2009-01-04 14:52:282008新春纪念徽章
日期:2008-02-13 12:43:03
23#
发表于 2006-12-26 14:00 | 只看该作者
研究一下

使用道具 举报

回复
论坛徽章:
35
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:09
24#
 楼主| 发表于 2006-12-26 16:07 | 只看该作者
最初由 wangcunjiang 发布
[B]研究一下 [/B]


使用道具 举报

回复
论坛徽章:
0
25#
发表于 2007-1-8 01:21 | 只看该作者
谢谢小帅哥,学习中

使用道具 举报

回复
论坛徽章:
387
马上加薪
日期:2014-07-30 15:56:19itpub13周年纪念徽章
日期:2014-09-30 11:08:572015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
26#
发表于 2007-1-8 19:25 | 只看该作者
不错。支持

使用道具 举报

回复
论坛徽章:
0
27#
发表于 2007-1-31 12:24 | 只看该作者
找这样的帖子好久了,谢谢楼主!

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
28#
发表于 2007-1-31 18:14 | 只看该作者
帅哥果然有货啊

最初由 klyuan 发布
[B]六、设计探讨
        1.通过提供queryTotalRows() 和queryPageList(int startRow, int rowCount)方法,交由用户具体的去实现,所以能够支持任何数据库。
        对于Ibatis用户可以使用queryForList()方法,对于用jdbc实现也可以有多种方法来支持各种数据库。
        Ms sql 可以使用top 关键字,来获得指定范围的数据
        ORACEL可以使用rowid 伪列来获得指定范围的数据
        具体怎么去读取数据,完全交由用户控制
        2.分页对象与具体的业务对象分离。分页对象如果不能与具体的业务对象分离那么就不可能实现分页对象的重用,不可以实现代码的最大的重用。这不符合oo的按职责来设计对象的原则。
        3. ViewPageHelper帮助类的使用有两个好处,统一为分页代码所需的字符参数进行定义,便于contrller和jsp页面代码的维护。第二便于代码重用,减少在contrller中的if分支句语。如果不使用帮助类,则在每个controller中都会产生大量相同的代码。
        4. final关键字的使用,protected final void doInit()用于分页对象的实始化,它读取并设置总记录数,计算总页数,默认为第一页等。为什么不在构造函数中来做它呢?如果在构造函数来做它,子类就不可以扩展了。像这样的初始化方法的位置应该由扩展类来灵活控制。声明为protected是不让它由外部对象来进行访问,但是子类又可以进行调用。声明为final是为了子类不能重写它,如果子类重写不当就会造成分页对象的执行逻辑错误。但是如果子类又想扩展它怎么办?子类重写protected void onInit()方法就可以了。这样就能保证父类的逻辑,又能够让子类进行扩展。
        5.异常处理的思考,queryTotalRows()和queryPageList方法都是要求由子类实现的抽象类,这两个类的特点都是可能会调用业务对象去实现相应的功能,业务对象可能会访问业务数据库等,可能会抛出任何Exception,但是分页对象类去调用queryTotalRows()和queryPageList的方法是不应该对这些Exception进行任何处理的,如果进行try…catch那么就会隐藏了异常的细节,这是十分可怕的。如果这些方法抛出异常,分页对象应该是不能处理的,不能处理的异常应该封装为运行时异常,所以就有了下面的实现
                private List pageList(int startRow, int rowCount) throws ApplicationRuntimeException{
                try{
                        return queryPageList(startRow, rowCount);
                }catch(Exception ex){
                        throw new ApplicationRuntimeException(ex);
                }
        }

        private int totalRows() throws ApplicationRuntimeException{
                try{
                        return queryTotalRows();
                }
                catch(Exception ex){
                        throw new ApplicationRuntimeException(ex);
                }
        }

分页对象内部调用pageList和totalRows方法,这样就很好的解决了异常的问题,把异常交由外部调用者去决定是否处理,而不是强制调用者去处理。

5.        模板方法模式的使用,这是一个典型的模板方法模式的运用。在父类实现关键的算法代码,实现分页对象的处理逻辑,而把某些会发生改变的方法交由子类去实现,使得子类完全不用去关心父类的实现细节,子类只需要重写两个简单的方法就可以实现父类的功能。这就是模板方法带来的最大好处。模板方法模式在各种开源框架中有着广泛的运用,看看spring的源码就知道。子类只需要去实现自己最关心的细节,而父类实现那些不变的逻辑或算法。
6.        针对接口编程,而不是针对类编程。接口可以实现多重继承,而类却不能。接口有比类获得更多的好处,更利于扩展。比如说分页接口,它可以让用户有更多不同的实现,完全不依赖于任何类。只需要为它定制了共同的行为就可以了。在使用委托的时候接口比抽像类更好用。比如在装饰模式的使用中,可能需要实现一个接口,而其中还要有一个本接口的引用。 如果是抽象类,则不可以实现。
7.        通用框架应该具有灵活性,不应该依懒于任何具体的框架。如果通用框架依懒于某一技术细节,某一框架,那么它就有一定的局限性。所以通用分页不应该依懒于ibatis或hibernate 或spring的某一特点。更不应该依懒于sql或oralce某种数据库。 [/B]

使用道具 举报

回复
论坛徽章:
35
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:41:012011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:09
29#
 楼主| 发表于 2007-1-31 21:24 | 只看该作者
最初由 justforregister 发布
[B]帅哥果然有货啊

[/B]


谢谢啊

使用道具 举报

回复
论坛徽章:
11
生肖徽章:狗
日期:2007-01-25 16:58:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53会员2007贡献徽章
日期:2007-09-26 18:42:10开发板块每日发贴之星
日期:2007-03-25 01:12:09开发板块每日发贴之星
日期:2007-03-24 01:13:55开发板块每日发贴之星
日期:2007-03-18 01:09:34
30#
发表于 2007-2-12 10:41 | 只看该作者
好,支持,研究下

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表