Spiga

细说业务逻辑(后篇)

2009-10-31 23:39 by T2噬菌体, 5134 visits, 收藏, 编辑

前篇:http://www.cnblogs.com/leoo2sk/archive/2009/10/29/1592568.html

3、业务逻辑的架构模式及实现

      Martin Fowler在《Patterns of Enterprise Application Architecture》一书中,总结了四种企业应用中业务逻辑的组织方式 :Transcation Script,Domain Model,Table Module及Service Layer,另外,本书的第十章“Data Source Architecture Patterns”中包含一种模式——Active Record。结合软件体系结构的近期发展及个人的理解,我更倾向将Active Record归入业务逻辑的组织模式,而Service Layer应该不算做业务逻辑特有的模式,所以,在本文中,将介绍四种模式:Transcation Script,Table Module,Active Record及Domain Model。

3.1、Transction Script

      3.1.1、概述

      Transction Script(以下简称TS)是一种面向过程的业务逻辑组织方式。这里首先要强调一点,这里的Transction一词与数据库系统中表示“事务”的Transction没有任何联系。TS是将领域中的业务分解为一个个业务过程,每个过程实现一项业务功能,具体到程序中,一个业务过程往往映射到一个方法。TS是完全面向过程的业务组织模式,适合应用于业务逻辑较简单的场合。

      应该说,我们见到的绝大多数系统都是以TS组织业务的。例如PetShop及Oxite等经典示例。有时为了方便维护,开发者会将同一领域实体相关的业务方法集中到一个类中,这里虽然用到了领域实体和类的概念,但和面向对象没有任何关系,完全是面向过程的。

      当使用TS时,可以不需要数据访问层,而是将数据操作执行代码(如执行SQL或存储过程的代码)直接嵌入在业务方法中,有时为了复用性和维护性可以编写一个helper类封装数据库的操作。当然这并不是说TS不能配合数据访问层使用,但由于应用TS的场合一般业务非常简单,如果配合Repository或ORM使用,业务逻辑层往往就会变得非常“瘦”,看起来仅仅是对数据访问层的封装。一般在需要支持多数据库的场合,要配合Repository和Abstract Factory使用。

      TS的示意图如下所示:

图3-1

图3-1、 Transcation Script架构示意

      可以看到,在TS中,业务层并没有面向对象的东西。也许会用到类,但类只是组织业务方法的模块,每个模块中有一个个业务方法,每个业务方法完成一个业务流程,完全按面向过程结构组织。

      3.1.2、分析

  • 什么时候可以用TS?

      应该说,如果具备以下条件之一,你可以考虑TS:

      1)系统业务十分简单直观,并且频繁变动的可能性不大

      2)工期很紧,需要尽量压缩设计的时间,尽快投入编码

      3)不能熟练掌握和使用OO进行系统的设计与开发

      4)厌恶OO,就是喜欢面向过程

  • TS的优点?

      1)设计阶段投入较小,启动耗费低。因为TS较容易掌握,使用起点低,所以使用TS的初期投入较少

      2)在业务比较简单直观的情况下,TS结构的代码直观易懂,具有良好的可维护性

  • TS的缺点?

      1)容易造成代码冗余。因为各个业务自行组织流程,所以减少了复用的机会,可能产生重复性代码

      2)因为TS天生不适合业务复杂的系统,当系统业务较复杂时,可能会令业务层代码繁杂不堪

3.2、Table Module

3.2.1、概述

      Table Module(以下简称TM)同样是一种面向过程的业务逻辑组织方式,与TS不同的是,TM更贴近关系型数据库结构。在TS中,一般使用DTO等进行数据表示和传递,其着眼点一般在单个对象。而TM一般根据数据表组织业务模块,每个模块对应一个表,其中包含了这个表的相应处理。并且在业务层内,使用库-表结构的对象进行数据操作,做到最大限度与数据表的对应。业务组织一般按照面向过程组织。

      一般当业务相对简单且业务基本集中在CRUD操作时,可以考虑TM。使用TM意味着使用数据驱动设计。通常自己实现一套库-表结构操作对象的库是难度比较大的,所以一般选用TM时,所使用的平台应该包括这么一套库。如.NET平台上的ADO.net就内置了丰富的库-表操作,DataSet,DataTable,DataAdapter等在TM架构的实现中可以起到非常方便的作用。

      使用TM后,一般不需要再配合Reponsitory或ORM,因为此时的业务层也是面向过程和面向关系型结构的,无须映射。

      TM的示意图如下:

图3-2图3-2、Table Module架构示意 

       在使用TM后,业务代码中往往有各种对象对应数据库中的库、表、记录、字段等元素,并提供类似关系数据库的操作。

3.2.2、分析

  • 什么时候可以用TM?

      如果同时具备以下条件,你可以考虑TM:

      1)系统业务较直观,以CRUD操作比较集中

      2)整个开发的指导思想是数据驱动

      3)所选用的平台有成熟的库-表操作库支持

  • TM的优点?

      1)类似关系数据库的数据操作方式非常直观,使得设计和编写数据操作功能的代码简单高效

  • TM的缺点?

      1)TM需要完全的数据驱动,从业务到UI传递、存放数据都要以表结构形式,造成一定程度上的不灵活

      2)当业务并非CRUD集中型操作,特别是领域模型和数据库表模型差异较大时,使用TM组织业务的难度非常大

3.3、Active Record

3.3.1、概述

      Active Record(以下简称AR)是一种面向对象的业务逻辑组织方式。AR适用于在业务较简单的情况下,应用面向对象思想进行设计。它的基本思想就是将领域中每个实体抽象出一个业务类(BO),然后,将这个实体的数据和行为封装成类的属性和方法。特别的,将CRUD功能也封装进BO中。也就是说,AR中的BO同时具备业务方法和持久化功能。其本身具有ORM的特性,其内部要处理关系实体间的关联问题。

      使用AR时,一般最好有相应框架支持,否则完全手工实现AR有点麻烦。像Castle框架中就有AR功能,Linq to sql也有AR的意思。使用AR后,一般不需要再单独使用数据访问层。

      AR的组织架构如下图:

图3-3 图3-3、Active Record架构示意

      从图3-3中可以看出,AR对业务领域进行了一个简单的OO抽象,将各个实体抽象为AR业务对象,AR业务对象内含有数据、业务方法及数据访问相关的ORM方法。另外,AR业务对象要维护实体间简单的一对多和多对多等关系。

3.3.2、分析

  • 什么时候可以用AR?

      如果同时具备以下条件,你可以考虑AR:

      1)系统业务较直观

      2)想尝试使用或习惯于使用OO进行系统设计与实现

      3)平台上有成熟的AR框架可以用

  • AR的优点?

      1)使用OO的方式进行设计与实现,能在一定程度上避免冗余代码问题)

      2)使用AR后,与某个实体相关的数据和业务全部集中于AR业务对象中,模块内聚性好,便于维护

      3)实践证明,AR结构的业务层编码效率很高

  • AR的缺点?

      1)AR仍需要关注数据之间的关联,在一定程度上带有数据表和影子,没有完全摆脱数据驱动,所以当业务领域和数据库结构差距大时,实施困难

      2)AR的CRUD是以个体为粒度的,当进行批量操作时,如一次查数千个数据,如果严格尊从AR就需要生成数千个AR业务对象,这简直是场灾难。所以在有大规模查询的情况下,可以考虑使用TS配合AR

      3)如果业务非常复杂,AR将力不从心

3.4、Domain Model

3.4.1、概述

      Domain Model(以下简称DM)是一种适合领域驱动和为复杂业务系统组织业务的面向对象业务逻辑组织方式。前面三种架构模式都有一个共同的缺点——不适合业务复杂的系统。那么何为复杂何为简单?很抱歉,我给不出明确答案,而且我估计世界上任何一个人都很难给出标准的无争议答案。因为软件系统中的复杂和简单本身就是一个难以量化的指标,很多时候,只能靠专业人员的经验了。

      我个人估计,世界上95%的软件系统其业务难度都不会超出上述三种模式的能力范围,而若你不幸遇到剩下的5%,恐怕目前只有Domain Model能帮你了。Domain Model是一种纯面向对象的业务架构模式,它的核心思想是获取领域中的各种实体抽象,然后完全按照现实领域中的情况去建模和运行。并且业务对象是“持久化无知”的。关于“持久化无知”下面细讨论。这个模式十分复杂和难以掌握,但一旦掌握并使用,其能力绝对会超乎你的想象。

      下面看一下DM的架构示意图:

图3-4  图3-4、Domain Model架构示意

      从图3-4中可以看出,DM看上去是个十分纠结的模式,而实际上,它确实很纠结!实际上,我认为如果能熟练掌握并运用DM进行业务逻辑的组织,那这人绝对是架构师中的大师级人物(我目前是做不到)。

      还是先结合图示分析一下DM中的要点。

      第一,DM中的业务对象是纯业务对象,不含数据访问操作。这个可以和AR中的业务对象对比一下。也就是说,DM中的业务对象是纯业务对象,它们只关注与业务的实现。

      第二,DM的组织内部对象多,关系复杂,而这种关系不再只是那种简单的一对一、一对多的关系,而是领域中的各种依赖和关联的抽象,关系类型多,非常复杂。

      第三,DM需要业务部分“持久化无知”。所谓持久化无知,指业务部分只需执行业务功能,而不必关系持久化。在使用DM时,必须设计一套ORM机制(注意这里用到了“机制”一词,而不是“框架”或“库”),使得在业务系统运行时,自动在必要的时候执行数据持久化操作。这也是为什么上图数据源和业务层间的箭头是虚线的关系。

      上文曾说过,DM要最大程度模拟现实情况。而现实世界和软件世界最大的区别就是现实世界是“内存无限大、永不停机的”,可以把现实世界看成在一个无限大内存里永不停止运行的程序。而软件世界不同,它的内存有限制,我们不能将所有对象都放在内存,而且一旦掉电,它就会停止运行,正因如此,我们才需要持久化机制去配合DM模拟现实世界。为了让业务更接近现实,它必须对持久化过程毫无感觉。而一套持久化机制默默为其营造了一个好似内存无限大、永不停机的环境,因此DM才得以发挥威力。

      第四,DM往往需要Services Layer的配合。因为DM内部仅有一个个业务对象,它们互相调用,并没有提供一个友好的接口与UI交互,所以在使用DM时,往往在其上对各种UI需要的服务进行封装(回顾一下Facade模式),形成一个Services Layer,以方便与UI交互。

3.4.2、分析

  • 什么时候可以用DM?

      如果同时具备以下条件,你可以考虑DM:

      1)系统业务极为复杂

      2)有功底扎实和经验丰富的精通OO的架构及设计师

      3)项目经费和时间充足

      4)贯彻领域驱动设计

  • DM的优点?

      1)完全的OO思想运用,将使你享受到OO的所有优势

      2)应付复杂业务的强力杀手锏。如果DM运用得当,将会使得复杂业务被高效解决

  • DM的缺点?

      1)使用门槛极高,难度极大,如果团队中没有精通OO和系统架构且经验丰富的专家很难实施

      2)设计过程极为复杂,可能会导致设计瘫痪

      3)如何设计良好的ORM机制辅助DM是一大难题

3.5、各种架构模式的比较及选择

      相信看过上文内容后,各位一定对各种业务组织模式及其特点、优劣、应用场景有了清晰地认识,如果我在这里再喋喋不休讨论各种模式的比较及如何选择,难免有侮辱各位智商之嫌O(∩_∩)O~,所以这里我只给大家呈现一幅决策网络图,以期起到一个梳理和归纳总结的作用。

图3-5

图3-5、业务架构模式决策网络

      (郑重声明:图3-5为本人原创,并非摘录自已有文献,因此此图的选型流程仅代表个人意见。由于笔者水平有限,不能保证此图一定合理和正确。因此在实际选型时请多多参考已有文献及咨询相关专家,此图只起总结归纳和探讨作用,不作为任何指导和规范。若因遵循此图选型而给项目带来的任何经济及其他方面损失,笔者不承担任何责任。)

4、结束语

      本文通过两篇文章的篇幅,先后介绍了业务逻辑的定义、相关理论及经典的业务逻辑相关的架构模式。本文中阐述了不少已有理论,亦掺杂诸多个人理解及看法。因此请各位在阅读时多进行批判吸收,同时参考以后经典文献及书目综合理解业务逻辑,切勿仅看我一家之言。

      另外,由于本文仅仅是综述性文章,不能具名业务逻辑的各个方面,在深度上也基本是浅尝辄止。因此,若希望深入理解业务逻辑,可以看到相关经典书籍及文献。

参考文献

[1] [意]Dino Esposito, Andrea Saltarello, .NET软件架构之美英文版(原名Microsoft .NET Architecting Application for the Enterprise), 人民邮电出版社, 2009

[2] [美]Martin Fowler, 企业应用架构模式影印版(原名Patterns of Enterprise Application Architecture), 中国电力出版社, 2004

[3] [美]Mclaughlin, Pollice, West, 深入浅出面向对象分析与设计影印版(原名Head First OOA&D), 东南大学出版社, 2007

[4] Google, www.google.com

Creative Commons License

本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名张洋(包含链接),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

Add your comment

47 条回复

  1. #1楼 Ivony...      2009-10-31 23:48
    汗一个那个声明。。。。。
     回复 引用 查看   
  2. #2楼 阿K&LiveCai      2009-10-31 23:52
    -- ..
     回复 引用 查看   
  3. #3楼 Ivony...      2009-11-01 00:16
    前后篇结合起来看,的确比较舒服,也完整的了解了LZ的思想了。

    虽然没看过那本书,但从LZ的介绍来看,业务逻辑的组织形式的划分,区别在于模型的不同定义。

    TS中的模型是方法,是过程,是流程。

    TM和AR中的模型是关系型数据,或者简单的说就是数据。

    DM中的模型是领域对象,领域对象是超越数据的一种东西,更接近于我们所理解的OO中的对象。

    所以这么看来,TM和AR归为一类的确也未尝不可。等待大牛来解答。


    或者我在猜,那个Service Layer是不是指的SOA的架构。。。。

    在这种组织形式中,模型是互不相干的服务,与DM的显著不同就是模型之间是不能纠结的,互不相干的。


    以上纯属个人猜测,不承担任何责任。
     回复 引用 查看   
  4. #4楼 Jeffrey Zhao      2009-11-01 00:17
    好像明白,又好像不明白……
     回复 引用 查看   
  5. #5楼 Jeffrey Zhao      2009-11-01 00:20
    我在怀疑,Active Record和Table Module到底应该算不算是业务逻辑的模式,他们是直接干数据的,数据如何就如何。
     回复 引用 查看   
  6. #6楼 Ivony...      2009-11-01 00:41
    因为最近几年一直是在做类似于领域模型的分析和设计,或者可以说是DDD。我不权威所以不知道自己做的工作是不是严格的符合。但可以结合自己的实际谈谈一些看法:


    首先就是ORM机制并不是必需的,应该更抽象的说,我们需要一个持久化的机制,事实上很多时候我都会混用关系数据库和其他持久化方式,甚至我认为狭义的ORM是不切实际的幻想。

    其次是DM的Service Layer我没看明白。甚至我会认为将业务对象与UI分开是对业务对象的一种割裂。UI应该很自然的展现Domain Model,而Domain Object与UI也应当是紧密相关,甚至于说Domain Object是自己可以确定自己的UI的东西。UI的逻辑本身就是Domain Object的一部分。


    考虑一个简单的例子,我们要订购一些商品,流程是:先创建一个订单,填写收货和个人信息,然后选择多个商品,再提交这个订单等候处理。

    简单的说,如果你用TM或AR的方式组织,那么,你不能在UI上展现为,在订单表增加一条记录,写入收货信息,然后再在订单商品明细表中增加多个商品销售信息,并关联到刚才的订单,最后修改订单状态。尽管实际上你数据库中就是这么干的,你的模型也是这么干的,负责这两种逻辑之间的转换工作的,就是业务逻辑层。

    那么如果采取DM,则你对Domain Object(订单)的操作与前台的操作是完全统一的,先创建一个订单(Domain Object),然后往这个订单里面增加商品(Domain Object),最后把这个订单提交处理。换言之Domain Object与你的前台逻辑是完全一致的,并不需要任何Layer可以直接与UI相通。
     回复 引用 查看   
  7. #7楼 个人知识管理      2009-11-01 00:43
    晕倒,很多概念第一接触。
    之前太注重UML,
    不能学这么多。UML已经够多数人折腾了
     回复 引用 查看   
  8. #8楼 KidYang      2009-11-01 00:50
    终于看到了下篇,先收藏。明天细看。
     回复 引用 查看   
  9. #9楼 Gsanidt      2009-11-01 00:51
    MS了解了...
     回复 引用 查看   
  10. #10楼 jaygor      2009-11-01 00:53
    TS和TM没什么好说的,大家都用过。

    我对AR的理解好像和楼主有差异。
    我一直以为AR是DM+Repository,只不过在java/c#下没有优雅地实现方式而已,因为AR模式一不小心就会变成胀血模型。
    莫非我理解错了?

    我一直想用DynamicProxy做个优雅的AR框架,不过后来发现NPersist已经做出来了(居然还是LGPL),正在考虑要不要据为已有,嘿嘿


    》》我认为如果能熟练掌握并运用DM进行业务逻辑的组织,那这人绝对是架构师中的大师级人物

    楼主这句话有点囧,我觉得看完Eric Evans的DDD(好像绝版了,InfoQ上有简化版),然后用pojo in action做最佳实践,就差不多了。不过DDD有点难,我第一遍愣是没看懂。

    楼主加油,期待你的续篇~~

     回复 引用 查看   
  11. #11楼 Ivony...      2009-11-01 01:27
    引用jaygor:
    TS和TM没什么好说的,大家都用过。

    我对AR的理解好像和楼主有差异。
    我一直以为AR是DM+Repository,只不过在java/c#下没有优雅地实现方式而已,因为AR模式一不小心就会变成胀血模型。
    莫非我理解错了?

    我一直想用DynamicProxy做个优雅的AR框架,不过后来发现NPersist已经做出来了(居然还是LGPL),正在考虑要不要据为已有,嘿嘿


    》》我认为如果能熟练掌握并运用DM进行业务逻辑的组织,那这人绝对是架构师中的大师级人物

    楼主这句话有点囧,我觉得看完Eric Evans的DDD(好像绝版了,InfoQ上有简化版),然后用pojo in action做最佳实践,就差不多了。不过DDD有点难,我第一遍愣是没看懂。

    楼主加油,期待你的续篇~~




    AR不应该与DM有什么关系,AR的R是Record,DM中的Object是无法自动是Record的,Record和Object不等价。两种方式出发点不同,一种从Record出发考虑问题,一个Record类型数据库中就存在一个表。而Domain Object数据库中不必存在表,甚至有些不必持久化。

    个人理解。


    其次我也不赞同LZ的两个评价,DM不应该是可望不可及的什么大师级的架构师才可以把玩的东西。我觉得DM就是现在,当下最流行的解决方案。它能解决的问题从复杂到简单,并不是软件系统要复杂到什么程度才能,才需要使用DM。而是软件系统过于简单你就会被数据库吞噬,现在的数据库功能越来越强大,简单的CURD,做做数据操作的软件,一个友好的数据库访问界面就可以搞定。而这样的软件,直接用Oracle的什么标准解决方案,或者是MOSS、ASP.NET动态数据应用程序什么的旧搞定了。
     回复 引用 查看   
  12. #12楼 jaygor      2009-11-01 02:15
    @Ivony...
    不好意思,我上面认为AR=DM+Repository是漏了一个前提:
    我先设计DM,然后用工具(比如Hibernate)根据DM生成表结构,这样DM就和表结构一样了。再说如果用db4o作持久化,record和object区别也不大了吧。
     回复 引用 查看   
  13. #13楼 mikelij      2009-11-01 02:36
    前后篇及其评论都看了。首先感谢你表达这些.
    提几点不同意见, 供你参考:
    1. 业务逻辑这个词, 我的理解, 从中文上说它应该与业务规则这个词等同。业务逻辑的英文是business logic. 似乎与Business Rules等同, 是不是就是业务规则? 你觉得呢?
    2. 你说的业务逻辑包括除界面和交互外的一切(包括数据库访问), 似乎囊括太多。似乎Buisness domain才包括business entity, business rules, input validation, business process, business flow, data access/data persistance等等. Busienss domain翻译成中文似乎叫做商业领域或者叫业务领域。
    你觉得呢?
    3. 据Microsoft Application architecture Guide 2.0文档, "ADO.NET Entity Framework. This framework gives you a strongly typed data-access
    experience over relational databases. It moves the data model from the physical structure
    of relational tables to a conceptual model that accurately reflects common business objects.
    The Entity Framework introduces a common Entity Data Model within the ADO.NET
    environment, allowing developers to define a flexible mapping to relational data."
    Business Object 似乎是乎是指的customized object, 而且通常是贫血模型, 而非充血.
    4. 据Microsoft Application architecture Guide 2.0文档, Data transfer object是能承载多个实体的传输结构。尽管它只包含数据,没有行为。可以叫做贫血模型,但是叫做"贫血实体类"不准确.
    5. 据Microsoft Application architecture Guide 2.0文档70页, Active Record是一种数据访问的pattern.
    6. 据我理解, Martin Fowler说的Transcation Script,Domain Model,Table Module及Service Layer指的是业务逻辑的组织方式(the way to organize business logic), 都是些很high level的系统分析设计理念.
    7. Active record映射到数据库表的记录,而Domain Model对应的是我们分析出来的domain, domain与表之间没有一一对应关系。domain可以对应多个表,也可以对应多个表的某些列和某些行。
    以上全部是个人意见。不当之处还请海涵。
     回复 引用 查看   
  14. #14楼 卡通一下      2009-11-01 07:48
    TS是将领域中的业务分解为一个个业务过程,每个过程实现一项业务功能,具体到程序中,一个业务过程往往映射到一个方法。TS是完全面向过程的业务组织模式,适合应用于业务逻辑较简单的场合。

    从一个全新的视角来观看过去的做法,继续思考...
     回复 引用 查看   
  15. #15楼       2009-11-01 07:55
    引用jaygor:
    @Ivony...
    不好意思,我上面认为AR=DM+Repository是漏了一个前提:
    我先设计DM,然后用工具(比如Hibernate)根据DM生成表结构,这样DM就和表结构一样了。再说如果用db4o作持久化,record和object区别也不大了吧。


    责任不同,AR是将持久化的责任丢给了对象本身。还DM强调其本身并不知道如何做持久化。
     回复 引用 查看   
  16. #16楼       2009-11-01 08:02
    @Ivony...

    同意兄台的说法,DM模式根本就没那么深奥。其关键的问题在于是否有良好的OO思想和强大的工具支持。

    即使是Hibernate,在处理对象持久化的问题也显得有些复杂,当然,也可能是我不太会用的原因。
     回复 引用 查看   
  17. #17楼 卡通一下      2009-11-01 08:43
    对号入座,自己的绝大部分程序都是TS模式,只是在初学编程时用过TM模式(那时的表设计大而全)。

    确实,在自己的头脑中面向过程的思维是根深蒂固的,先入为主吗!它就象人的一种习惯,改起来也是很难的。

    另外,如果将TM放在前面讲似乎更好。面向过程是人类的自然思维方式,AR与DM学习的门槛很高,新人恐难接受。

     回复 引用 查看   
  18. #18楼 炭炭      2009-11-01 09:57
    这篇文章写得太好了。

    一支瞧不起非 OO 的设计方式,但事实是这种系统大量存在有它的道理。现在我加盟的这家公司就是LZ 说的 TM 方式,任何设计居然都是table 的ER图,而且也证明了这是可行的。

    当然我还是喜欢 DDD, 至于大家说的 设计模式 ,大量的应用场合就是 DM 方式。所以有人说,设计模式那么多,我怎么都用不上啊? 原因就是你们根本就没有采用 DM 方式。

    真正的高手在 DM ,这点我是同意的。但是高手只有高手才能了解,遇到个井底之蛙习惯了前2种方式的,根本不知道你在说什么。以前在mcs 干果项目,里面那帮蠢货只知道第一种方式。当时如果读过LZ的这篇文章我就知道这也是做项目的一种方式,但当时对他们不 OO的方式严加鄙视,结果那帮人还说我水平有问题。也愿自己当时年轻气盛...

    ok,总之LZ好文,如果你在多个公司工作过并且读过许多设计书的话就知道他在说什么了。
     回复 引用 查看   
  19. #19楼 炭炭      2009-11-01 10:24

    TM 业务逻辑在数据库里,使用数据库的各种机制实现流程控制、事件触发等等,前面就是个皮.在这里你可以看到许多复杂的状态表和触发器等

    AR 业务逻辑在DLL里,换言之类关系中。

    更正上面一下,mcs里面应该只是ts,连DM都谈不上。
     回复 引用 查看   
  20. #20楼 jaygor      2009-11-01 10:49
    引用枫:
    引用jaygor:
    @Ivony...
    不好意思,我上面认为AR=DM+Repository是漏了一个前提:
    我先设计DM,然后用工具(比如Hibernate)根据DM生成表结构,这样DM就和表结构一样了。再说如果用db4o作持久化,record和object区别也不大了吧。


    责任不同,AR是将持久化的责任丢给了对象本身。还DM强调其本身并不知道如何做持久化。


    呵呵,说到职责区别了。从责任角度来说,一个对象的持久化是不是应该让对象本身负责?
    userRepository.Save(user)还是user.Save()?
    userRepository.FindById(userId)还是User.FindById(userId)?
    抛开单元测试和胀血模型不谈,从使用者的角度(比如Presentation层)来说,上面这两种模式谁更值得推荐?
    我拿Castle的ActiveRecord做DomainModel,并不觉得与DomainModel+Repository有太大差别,在某些情况下,少了Repository还显得更简练。
     回复 引用 查看   
  21. #21楼 炭炭      2009-11-01 11:12
    LS 的问题不是应该不应该, 而是类库的使用者觉得那种更舒服?我觉得两种都可以要。如果你的user 是一个纯数据的model就用第一种,如果user是一个包含数据的业务实体,user.save() 就比较容易让调用者想到并且用的舒服
     回复 引用 查看   
  22. #22楼 jaygor      2009-11-01 11:16
    不是应不应该的问题,而是类或者层的职责问题
     回复 引用 查看   
  23. #23楼 卡通一下      2009-11-01 11:26
    引用炭炭:
    ......
    真正的高手在 DM ,这点我是同意的。但是高手只有高手才能了解,遇到个井底之蛙习惯了前2种方式的,根本不知道你在说什么。以前在mcs 干果项目,里面那帮蠢货只知道第一种方式。
    ......
    结果那帮人还说我水平有问题。也愿自己当时年轻气盛...

    我肯定不是一个高手,而是个俗手,是一个写了n多年程序,但仍对架构模式不得要领的俗手。我的经历决定了自己的视野,自己早已过了气盛的岁数,但绝不是个蠢货!哈哈...

    虽没有考查过,但觉得楼主说“绝大多数系统都是以TS组织业务的。”,是有一定道理的。以我见过的MIS系统、HIS系统来讲,都是属于TS的。你说它们大吗...;小吗...;复杂吗...;简单吗...,见仁见智吧!
     回复 引用 查看   
  24. #24楼 Ivony...      2009-11-01 11:29
    @jaygor


    其实这一点LZ说的很好了,Domain Object应该是持久化无知的。换言之不论是你是根据DM用工具生成表结构,还是让Domain Object自己去Save,这两者都不是纯粹的DM,因为他们的模型不是持久化无知的。

    对于前者,你在设计Domain Object的时候必然要顾及其是否可以被工具自动生成表结构和持久化,这个问题我前阵子刚在老赵的回复中探讨过,如果你的Domain Object需要向持久化妥协,那么它就不会是纯粹的持久化无知,尽管现在纯粹的持久化无知还只是理想。

    对于后者,如果Domain Object自己可以Save,更显然的,他不是持久化无知的。



    当然现阶段真正纯粹的持久化无知大体上还很难,相关的框架、理念、工具、模型都还没有完善和完备。思想总是超前于实现这是正常的。那么如何界定DM与否呢?在于你的思考问题的出发点,业务模型或者说你的领域模型抽象模型是不是真正持久化无知的,你是不是在那个永动机的概念下做的建模。
     回复 引用 查看   
  25. #25楼 jaygor      2009-11-01 12:01
    纯粹的Domain Object当然是持久化无知的,而且我还极端地认为最好是POJO/POCO。
    好吧,我就不坚持AR=DM+Repository了。
    我不爽的是,按照DDD的架构来实践,接口和层一大堆,Presentation那边面对service、domain model、repository搞得不亦乐乎,写起来一堆的接口和类,新手还不知道怎样区分这三者的职责,最后代码全集中到了Facade层........
    干脆像AR那样合并domain model + domain object + repository + dao,也不要什么facade和dto、view object,省事,新手和老人皆大欢喜,而且也没觉得降低了OO。

     回复 引用 查看   
  26. #26楼 jaygor      2009-11-01 12:01
    为什么要分这么多模式?
    我觉得无非有两点:
    1、业务的实现以面向过程与面向对象的区别;
    2、问题域以关系型数据库设计为中心与以领域模型设计为中心的区别。
     回复 引用 查看   
  27. #27楼 韦恩卑鄙      2009-11-01 12:06
    是不是我看浅了,在我看 active record就是ado 2.x的 recordset
     回复 引用 查看   
  28. #28楼 韦恩卑鄙      2009-11-01 12:11
    @mikelij
    5. 据Microsoft Application architecture Guide 2.0文档70页, Active Record是一种数据访问的pattern.
    6. 据我理解, Martin Fowler说的Transcation Script,Domain Model,Table Module及Service Layer指的是业务逻辑的组织方式(the way to organize business logic), 都是些很high level的系统分析设计理念.
    7. Active record映射到数据库表的记录,而Domain Model对应的是我们分析出来的domain, domain与表之间没有一一对应关系。domain可以对应多个表,也可以对应多个表的某些列和某些行。



    赞同
     回复 引用 查看   
  29. #29楼       2009-11-01 13:22
    引用jaygor:
    引用枫:
    引用jaygor:
    @Ivony...
    不好意思,我上面认为AR=DM+Repository是漏了一个前提:
    我先设计DM,然后用工具(比如Hibernate)根据DM生成表结构,这样DM就和表结构一样了。再说如果用db4o作持久化,record和object区别也不大了吧。


    责任不同,AR是将持久化的责任丢给了对象本身。还DM强调其本身并不知道如何做持久化。


    呵呵,说到职责区别了。从责任角度来说,一个对象的持久化是不是应该让对象本身负责?
    userRepository.Save(user)还是user.Save...


    从万物中抽象出来的对象,应该是没有持久化这种概念的。所谓的持久化,不过是因为条件限制,而设法将对象这种三维的概念分解为二维的表来存储。这种意义上来看,两者的取舍就很明显了。

    至于实际应用中是否按照理论来,那只是一个各方面进行均衡的结果。所以出现对象知道如何持久化也不奇怪,这种做法下只是认为对象是应该有持久化的这个概念。
     回复 引用 查看   
  30. #30楼 hbdrawn      2009-11-01 14:21
    @jaygor
    呵呵,大同小异,可以看作理解层次的不同而已。支持
     回复 引用 查看   
  31. #31楼 Ivony...      2009-11-01 14:34
    引用枫:

    从万物中抽象出来的对象,应该是没有持久化这种概念的。所谓的持久化,不过是因为条件限制,而设法将对象这种三维的概念分解为二维的表来存储。这种意义上来看,两者的取舍就很明显了。

    至于实际应用中是否按照理论来,那只是一个各方面进行均衡的结果。所以出现对象知道如何持久化也不奇怪,这种做法下只是认为对象是应该有持久化的这个概念。



    持久化的确是因为条件限制,但与什么三维二维没有半点关系,没有谁强迫你把对象放到关系型数据库。
     回复 引用 查看   
  32. #32楼 为什么没有吉日火?[未注册用户]2009-11-02 07:33
    这是因为楼主的文章与接贴都是在概念名词上打转,离现实太远。吉日的文章有点俗,但贴近生活,涉及敏感话题,所以叫那些大牛好生地酸!
     回复 引用   
  33. #33楼 jaygor      2009-11-02 10:01
    终于掉到首页之后了,嘿嘿
    可以打广告了,本人新建了一个群,主要讨论开发方法和软件架构方面的东东,欢迎大家加入,群号:74686298
     回复 引用 查看   
  34. #34楼[楼主] EricZhang(T2噬菌体)      2009-11-02 11:21
    引用为什么没有吉日火?:这是因为楼主的文章与接贴都是在概念名词上打转,离现实太远。吉日的文章有点俗,但贴近生活,涉及敏感话题,所以叫那些大牛好生地酸!

    我写文章不在乎火不火,主要是对自己知识的一个总结和提升。同时和朋友们分享一些自己的经验。
    再说离现实近还是远要辩证的看。学习枪炮制造技术的人好像离战场近,学习数学和物理的人好像离战场远。但是后者最终制造出了原子弹,让所有枪炮相形见绌。
     回复 引用 查看   
  35. #35楼 Ivony...      2009-11-02 12:13
    引用EricZhang(T2噬菌体):
    引用为什么没有吉日火?:这是因为楼主的文章与接贴都是在概念名词上打转,离现实太远。吉日的文章有点俗,但贴近生活,涉及敏感话题,所以叫那些大牛好生地酸!

    我写文章不在乎火不火,主要是对自己知识的一个总结和提升。同时和朋友们分享一些自己的经验。
    再说离现实近还是远要辩证的看。学习枪炮制造技术的人好像离战场近,学习数学和物理的人好像离战场远。但是后者最终制造出了原子弹,让所有枪炮相形见绌。



    这个我是同意的,LZ其实也没必要过于在意,呵呵。文章质量其实是得到了众人的认可的。


    至于人气么,口水文肯定比技术文要火这没办法,但不是我们都去写口水文的理由。就想要有人去前线冲锋,也要有人默默无闻的在科学院研究原子弹。

    即使前线冲锋的回来了几十个将军元帅,而后面造原子弹的大众只有那么几个两弹一星元勋被人记住。
     回复 引用 查看   
  36. #36楼 asheng      2009-11-02 15:51
    楼主写博客 很学术化 类似写书面的论文一样
    不过 还是上篇感觉容易看懂一些~
     回复 引用 查看   
  37. #37楼 麒麟.NET      2009-11-02 16:22
    我觉得在AR和DM之间还应该存在一个模式,即业务实体(贫血模型)+业务逻辑层,应对业务逻辑比AR复杂比DM简单的情况。
     回复 引用 查看   
  38. #38楼 stubas[未注册用户]2009-11-02 18:48
    DDD其实很简单,很朴实。
    微软DotNet,目前实现DDD的技术上的设施已经齐备了
    Aop有企业库
    Ioc也有Unility
    Orm方面,微软的新版本的实体框架(可以到实体框架team的blog,里面说的一些设计理念,无不是为了更好支持DDD(属性追踪,实体单向关联,Poco都支持了)

    别神话DDD

    jdon是这方面的一个不错国内论坛,有兴趣的可以去那边看看
     回复 引用   
  39. #39楼 barryguo      2009-11-25 16:43
    "持久化无知" 的概念好像不太合适,在现实世界中,有最起码的纸质文档的手工管理,这在概念上也是一种持久化;还有就是LZ也提到的,持久化是业务逻辑分化的结果,也说明持久化是业务的一部分,只不过这部分不是业务逻辑的核心而已。
     回复 引用 查看   
  40. #40楼 barryguo      2009-11-25 17:08
    很明显,Table Module和TS缺了controller一层。对象间的关系由controller在程序流程中表达。这也是pojo的思想。使用DM的水平不一定高,使用TM的水平不一定低。他们的区别是风格的不同,而不是面向对象和面向过程的区别。
     回复 引用 查看   
  41. #41楼 Old      2009-12-12 10:42
    好文章。读了舒服!
     回复 引用 查看   
  42. #42楼 ablok[未注册用户]2009-12-15 21:14
    问楼主一个与理论和技术均无关的问题,图3-5是用什么软件画出来的?一直想找一个好用的画此类图形的软件。
     回复 引用   
  43. #43楼 CareySon      2009-12-24 07:15
    楼主的理论功底十分的强大..
    拜读...
     回复 引用 查看   
  44. #44楼[楼主] EricZhang(T2噬菌体)      2010-01-31 16:13
    @ablok
    Microsoft Visio 2007
     回复 引用 查看   
  45. #45楼 WushanRen      2010-06-30 11:16
    请问有 深入浅出面向对象分析与设计 电子书么?
     回复 引用 查看   
  46. #46楼 virus      2010-06-30 16:04
    @WushanRen
    这本书在veryCd上面有下载,csdn也有
     回复 引用 查看   
  47. #47楼 freshfish      2011-05-23 23:32
    评论太多了,没耐心看完。不过还是感谢楼主分享
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1593740 dBbFHUvvNTM=