`
阅读更多

    (大量参考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组建框架。

分享到:
评论

相关推荐

    RUOYI-YD CRM模块sql文件

    SQL文件通常包含了创建和填充数据库表的语句,对于CRM模块,这些语句可能包括CREATE TABLE语句来定义各表结构,INSERT INTO语句来插入初始数据,以及可能存在的ALTER TABLE语句来调整表结构。 分析这个SQL文件,...

    ABAP中的Table_Control编程

    当定义了一个Table Control并指定了相关的内表和工作区时,系统会在PBO (Process Before Output) 阶段自动地将内表中的数据行逐一加载到工作区,并将其转换为屏幕元素。这意味着Table Control的每一行实际上是与工作...

    SQL_2012_performance_tuning_module_2_table_index_structure

    有效的索引策略需要考虑查询模式、表大小、更新频率等因素。这部分将教我们如何分析查询执行计划,识别性能瓶颈,并创建和调整索引来最大化性能。 "Lesson 10: Optimizing Maintaining Indexes"探讨了索引的维护和...

    Lua教程(十一):模块与包详解

    在Lua中,模块本质上是一个包含函数和常量的表(table)。require函数通过模块名来加载模块,并返回一个全局的table,该table包含了模块的所有公开接口。这样,用户就可以通过模块名作为前缀来访问模块中的函数和...

    基于Java的网页表格组件 GWT Advanced Table.zip

    1. **Google Web Toolkit (GWT)**:了解GWT的基本概念,如模块系统(Module System)、事件处理、UI组件、异步RPC通信等。 2. **Java语言**:熟悉Java语法和面向对象编程,因为所有GWT代码都是用Java编写的。 3. *...

    eclipselink+jobss EAP6.2集成module

    在EclipseLink中,多租户可以通过数据源隔离、共享模式或隔离模式来实现。你需要根据你的具体需求选择合适的方式,并在配置中指定相应的多租户策略。 至于压缩包文件`ringerc-as7-eclipselink-integration-7b0ede4`...

    Elixir程序设计语言.pdf

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

    基于Java的实例源码-网页表格组件 GWT Advanced Table.zip

    6. **模块化开发**:如何组织GWT项目,使用模块(Module)和入口点(EntryPoint)。 7. **GWT编译和优化**:了解GWT的编译选项,如代码分割、优化级别和调试模式。 8. **本地化支持**:如果应用包含多语言支持,可能...

    软件设计书籍.pdf

    书中介绍了几种重要的设计方法,包括事务脚本(Transaction Script)、表模块(Table Module)和领域模型(Domain Model)等。 #### 二、事务脚本设计方法 事务脚本是一种简单的业务逻辑组织方式,它将每个业务操作视为...

    FloodDefender系统在针对SDN的DoS攻击下保护数据和控制平面资源

    4. 表未命中工程模块(Table-miss Engineering Module):该模块在检测到攻击时会发布保护规则,将一些表未命中的业务流量转发给相邻的交换机,同时保证保护规则数量不超过直接连接到控制器的交换机数量。...

    分层架构与业务逻辑实现方式

    此外,还有表模块(Table Module)和活动记录(Active Record)等实现方式,都是可以选择的。选择哪种实现方式,取决于具体的业务需求和项目特点。 三、结论 分层架构和业务逻辑实现方式是软件开发中非常重要的两...

    1602lcd英文资料,1602液晶英文版规格书定义.pdf

    - 指令表(Instruction Table):列出控制LCD的各种指令,如清屏、设置光标位置、显示控制等。 7. 检验规格 (Inspection Specification) - 描述了生产过程中对模块的检查标准和流程。 8. 可靠性测试 ...

    AntiSSDTHooking

    - **修改Import Address Table (IAT)**:在用户模式下,可以修改应用程序导入表中的函数地址,从而间接地实现对特定API的钩子处理。 - **直接修改SSDT表**:更深入的做法是在内核模式下直接修改SSDT表中的函数指针...

    PJSIP活动图1

    6. **MODULE**:包括用户代理模块(UA Module, sip_ua.c)、对话模块(Dialog Module, sip_dialog.c)以及应用程序模块,它们负责特定的功能,如会话处理、用户交互等。 7. **PARSER**(sip_parser.c):解析接收到...

    mica 语法.pdf

    MICA是一种为日立PLC(HISEC-R600)设计的编程语言,它的全称是Module Integrated Concept Architecture,意味着它是基于模块化集成结构和图形化表达的编程语言。MICA的特点包括使用图形化指令描述、指令数量较少...

    更新修改后的Python模块方法

    2. **使用单例模式**:确保类实例的唯一性,即使模块重新加载也能保留状态。 ##### 用reload的封装使用的方法代码 使用`importlib`库来重新加载模块: ```python import importlib def reload_module(module): ...

    Lua Quick Guide and Pitfalls

    2. **定义模块**:官方推荐使用 `local module = {}` 来定义模块,并通过 `return module` 返回。 #### 九、Lua 编程习惯 良好的编程习惯有助于提高代码质量和可维护性: 1. **注释**:清晰的注释有助于理解代码...

Global site tag (gtag.js) - Google Analytics