`
阅读更多

    (大量参考PoEAA...-_-...)


    最近网上看到这样的帖子<<谁能告诉我Hibernate有何优秀之处>> 作者给出了对hibernate在实现orm的诸多不满和怀疑。而且很多开发人员都有着这样疑问,“怎么这个流行东东,我用起来就是不顺手呢?,“或许这个东东只是用来吹牛的”。然而,这或许很可能是因为,你习惯的架构模式开发策略并不适合使用orm这种持久化模式。用了反而是加大复杂度降低性能和效率。比如,用惯了resultset,喜欢把resultset放在表示层作为展示的数据结构的人。这样的开发人员因为习惯了二维表为核心进行开发,对于Hibernate这样的orm工具根本就没办法了解其优势了。但是这并不是说这种以二维表的架构模式就比较差了,只是不同的模式有不同的优缺点就看所在的应用是否适合使用了。或许你就一直在使用这样的模式在开发应用,自己还没有意识到(甚至一直以为这样的方式可以适应任何应用,:-)。反而被其他架构模式中才会用到的框架搞的晕头转向甚至被误导。事实上,像前面提到的以二维表为核心的架构被称之为表模块架构(设计)模式。

       何为“表模块”(table module)?“处理某一个数据库表、视图或虚拟表中所有行为的业务逻辑组成的一个实例”。最初,我就是从马丁同学的POEAA中得到的这个定义。在书中他被定义在DomainLogic 层次或者该层次的一部分,DomainLogic也就是其他架构模型中的BizLogic层。与该模式相对应个还有完成相似功能的DomainModel以及TransactionScript模式。该层次的职责是专门处理业务逻辑。

       简单的讲,所谓“表模块”就是以一个类对应数据库中一个表(视图)的数据来组织业务逻辑。从设计层次表妙面上看这种结构很像经典OO模型,同样是以不同对象对应不同逻辑。但是,它与领域建模不同之处在于,它的对象并不表示一个问题领域对象在软件系统中的映射。而是表示对一组数据的处理逻辑,而通常这组数据的结构是重数据库表或试图上的二维数据结构。当然也可以来自其他集成部分,比如返回两位数据结构的webservice

       这里给出个比较形象的例子:

<!----><!---->
<!---->

       (上图)感觉像比较标准的OO吧,好象一个Contract的对象表示合同,而Product表示产品,还有他们之间的关联关系。但是其实现实给出几个方法的时候就看出区别了。Product内部的数据其实就是一个两位结构的rowset。而不像真正的领域模型分析出来的表示一个Product的数据,Contract也是如此。

<!----><!---->
<!---->

       你会发现tableModule的类中一个对象其实对应一个表的数据,其拥有的操作也有很多是多数据记录的。多数据记录的操作在真正的领域中往往应该放在类似Manager这样的实体中,而不是业务实体本身。

       使用这种模式实现的业务逻辑层不像领域模型模式可以适应搞复杂度的逻辑。但是由于它更亲近于数据持久的二维表,没有像领域模型那样需要复杂的ORM支持。书对于数据驱动的应用或模块非常适合。POEAA中也已经给出了这种bizLogic最有效的持久层实现,就是table getway,当然也可以使用其他的方式比如“查询工厂”。

       事实上,最多使用这种模式的情况是当后台数据源大部分都是一种两维甚至多维数据结构的时候进行。比如一个极端的例子(几乎没有业务),一个应用的复杂查询模块,这种模块就是一个查询模型加上一组对数据进行排列统计过滤的TableModule

       

<!----><!----><!---->

       表模块还具有很多特点:处理的二维数据表将成为代码的核心部分。所以,是否使用tableModule还会取决于整个应用的其他部分是否对这种二维表提供强大的支持。(如上图)

       优点:持久层架构简单,在复杂度大的以数据为核心的应用中开发效率极高。而且表模块能够识别的table越多,能够处理table的组建工具越强,这种模型的能力越强。

       缺点:不能适应复杂的应用逻辑,或者与表结构差别较大的应用逻辑。由于没有对内部的两位数据表(table)进行有效标识的方式(比如,无法快速简单的确定使用table是否是需要的数据内容),对于大量细颗粒的逻辑会增加其复杂度。

       其实java中的 rowset/jdbc resultset.net中的 dateSet/dataTable都属于表模块操作的二维表。但是,由于.netGUI层面以及持久化层面对他自己的二维表的强大支持使得 TableModule几乎成为MS.Net上的首选模式。这也就可以解释了,许多.net开发人员一直抱怨,看到dataset/dataTable泛滥,甚至在WebService中也是这样。而java中却有所不同,虽然有持久化用到的jdbc/resultSet的支持(事实上jdbc/ado 给出的接口都只直接适合TableModule。),然而其他方面就少得可怜了。所以,使用java还是以其他的bizLogic架构模式为好。除非你的逻辑真的很简单,简单到把resultSet放在jsp中都不会造成逻辑混乱。又或者你能够自己提供一套完整的 rowset组建框架。

分享到:
评论

相关推荐

    Elixir程序设计语言.pdf

    Table of Contents 第⼀部分:基础 Introduction 基础集合Enum 模块 模式匹配 控制语句 函数管道操作符 模块(Module) Mix 魔符(Sigil) ⽂档模块 测试推导字符串 ⽇期和时间 ⾃定义Mix任务 IEx辅助函数 第⼆部分:⾼...

    ABAP面试大全

    2.3.5财务模块:财务模块开发中常用的表有哪些,简单举例说明: 12 2.3.6 PM 常用的TABLE 12 2.3.6 inner join 与 left-outer join的区别? 13 3. 权限相关 14 3.1 什么是权限对象(Authorization Objects)?在 ...

    linux驱动学习去开发入门

    MODULE_DEVICE_TABLE(""); 上述MODULE_声明习惯上放在文件最后。 (12)初始化和关闭 初始化的实际定义通常如下: static int _ _init initialization_function(void) { /*初始化代码*/ } module_init...

    基于java实现的数据库管理系统.pdf

    and…、=、、&lt;、、&gt;、&gt;=条件 匹配 该模块在包名下的module包中,其中包括Create.java、Alter.java、Drop.java、Insert.java、Delete.java、Update.java、Select.java 七个功能,每个模块的构造函数和init()函数执⾏...

    微服务逆向生成工程源码(兼容mysql,oracle,postgresql和达梦数据库)

    ## 该工程的意义 ... 2.6、修改module为模块名称 2.7、修改rootPackage为根包名称 2.8、修改application为启动类名称 2.9、其他内容无需修改 - 3、运行Run.java,生成代码,路径为out目录下 。

    Lua中模块以及实现方法指南

    从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块。从使用者的角度来看,一个模块就是一个程序库,可以通过require来加载,之后便得到一个类型为table的全局变量。

    exmo:在express-js中用于连接和使用MongoDB(Mongoose),MySQL(sequelize)的库

    创建表(无模式,空表) db ( 'table-name' ) . create ( ) ; 创建表(使用schema ) const schema = { ... } ; db ( 'table-name' ) . create ( schema ) ; 重命名表 db ( 'table-name' ) . rename ( 'new-n

    dayrui-xunruicms-master.zip

    CI4框架采用多个Module作为App应用,迅睿CMS继续沿用此设计模式,并且支持多个App插件化。 1、插件目录结构:dayrui/App/***/。 2、插件支持独立运行。 3、插件内部结构遵循CI4App规则。 四、自定义CI扩展类 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 module模块和包的介绍 05 模块的执行以及__name__ 06 关于模块的介绍 07 time时间模块 08 random模块 第22章 01 模块的补充 02 sys修改环境变量 03 BASEDIR的介绍 04 os模块的介绍 05 sys模块的介绍 06 json...

    asp.net知识库

    Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的...

    迅睿CMS免费开源系统

    八、万能Table类迅睿CMS框架为开发者准备了万能的Table类,此类用于对数据表的增删改查操作,只需要配置文件,逻辑功能由迅睿CMS来帮你完成。1、支持任意表数据展示。2、多表联合查询。3、自定义字段格式入库规则。...

    基于.NET的网络聊天软件的设计及实现

    choice to operating environment, system feasibility analysis,requirements analysis of system functions, partition of function module, design and development of database and data table to specific ...

    C++轻量级通用插件框架源码

    这样还有一个好处是只有约定了接口就可以让多个模块并行开发,模块相互之间不存在编译依赖(不需要其他插件的LIB等文件),这可用于测试驱动开发模式。 c) 多接口转换、引用计数管理 采用智能指针类来管理接口的...

    迅睿CMS免费开源系统-PHP

    框架采用多个Module作为App应用,迅睿CMS继续沿用此设计模式,并且支持多个App插件化。 1、插件目录结构:dayrui/App/***/。 2、插件支持独立运行。 3、插件内部结构遵循CI4App规则。 四、自定义CI扩展类 迅睿CMS在...

    Digg(顶一下)插件 For phpcms2007 sp4(gbk)

    一、Digg插件简介: Digg是WEB 2.0概念下的一种新的互动模式,可以由网友自己票选出大家最关注的新闻、话题。去年年底phoenixtv.com凤凰网启用了该功能,现在163.com的大批门户网站也开始使用该功能。类似的,也有...

    SAP屠夫作品汇总

    2 Automatic Posting Configuration (MM Module) 171 例1:如何使用Valuation group code 180 例2 PO condition和OBYC 182 例3使用PO处理委外加工 182 例4 Account assignment的逻辑分析 182 例5采购运费处理 182 例6...

    PHP MySQL的安装与配置详解

    LoadModule php5_module “D:/Software/GreenSoft/Php/php5.4.6/php5apache2_2.dll” #php.ini路径设置 PHPIniDir “D:/Software/GreenSoft/Php/php5.4.6/” AddType application/x-httpd-php .php AddType appli

    understanding linux network internals

    Module Initialization Code 模块初始化 Section 7.3. Optimized Macro-Based Tagging 基于标记的模块优化 Section 7.4. Boot-Time Initialization Routines 启动时的初始化例程 Section 7.5. Memory ...

    ZendFramework中文文档

    3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 ...

Global site tag (gtag.js) - Google Analytics