`
frankensteinlin
  • 浏览: 56444 次
  • 性别: Icon_minigender_1
  • 来自: ShangHai
社区版块
存档分类
最新评论

[领域模型] 领域模型--Now mission impossible[Java]

阅读更多
[领域模型] 领域模型--Now mission impossible[Java]
   潜水N久了,冒个泡,几年前就在javaeye参与过关于领域模型的讨论,越讨论我就越对这个模型越没有信心。
   领域模型是什么? 想到一个笑话: 工作时把我当超人,加薪时把我当隐形人。领域模型就是为实现这么个理想而提

出来的。什么贫血什么充血,其实就是要实现 对象化编程,把数据库当做隐形人。再说白点:就是数据库在与不在一个

样!对象在故我在,所有的方法都自然而然的加注到这么个对象上。
   领域模型的理想:
    还是银行转账这么个例子:
           事务开始:
           finder.find(帐户A)
           帐户A.减(500)。
           finder.find(帐户B)
           帐户B.加(500)。
           流水帐户.记录(XXX)
           事务结束。
    
   但是愿望是美好的,现实是残酷的 持久化是一座难以翻越的高山。就我浅薄的知识范围内来说,我没有找到一个很好

的技术解决方案(java)
          (1)事务范围内所有的对象的状态都要记录。
          (2)事务范围内所有的对象的变化都要记录。
          (3)事务结束是所有变化了的对象都要回写入数据库。
   上面这三件事看似简单,其实也就是所有数据库操作的全部,即使是hibernate也没做到这一点:
          (1)事务开始时就要建立一个对象图。
          (2)访问过的所有对象都要纳入这个事务发起的对象图中
          (3)无侵入的记录对象图中所有字段的变化。
          (4)回写变化了的字段【有可能是增量的】。
          (5)当出现异常时候,需要回滚【对象图是重建还是全部废弃?】
    如果持久化框架能做到上面几点,才能谈真正的领域对象。

    目前来说hibernate已经做到了一部分对象图的功能,但是仅仅是一小部分。


    另外我在论坛上经常看到DAO可以隔离数据的存贮,但我要说的是你如果用上了hibernate的话,想要随时替换成ibats几乎是不可能的,除非hibernate的大部分功能,你不用。

     
分享到:
评论
7 楼 frankensteinlin 2009-01-23  
guooscar 写道
nighthawk 写道
持久化对于domain object本身来说真的很重要吗?
domain object为什么要去关注存储与事务?存储是Repository的事情,而事务,是service的事情。当然,他们也是属于领域模型的一部分。

严重同意

理论上是这样,新手看了配有简单的例子的书都会这么说,但当稍微复杂的领域对象就会遇到问题,最简单的问题就是对象导航的问题,没有透明的持久化对象的支持,你的领域对象内部就会充满了DAO 和并且被事务对象严重侵入了。
6 楼 guooscar 2009-01-20  
nighthawk 写道
持久化对于domain object本身来说真的很重要吗?
domain object为什么要去关注存储与事务?存储是Repository的事情,而事务,是service的事情。当然,他们也是属于领域模型的一部分。

严重同意
5 楼 nighthawk 2009-01-20  
持久化对于domain object本身来说真的很重要吗?
domain object为什么要去关注存储与事务?存储是Repository的事情,而事务,是service的事情。当然,他们也是属于领域模型的一部分。
4 楼 wendong007 2009-01-19  
我觉得真正的领域模型应该是充血模型,不过现有条件下实现充血模型有点麻烦,大家不要老争论那些所谓能与不能的问题,而且这么做到底有没有意义,效费比高不高
3 楼 frankensteinlin 2009-01-16  
1)领域模型的提出就是为了对象化的操作,也就是的属性和行为应该是封装在一起的。操作应该是细粒度的。而这些有血有肉的对象属性的确是和数据库紧紧相连的。

2)很简单,当你做一连窜操作的时候,以事务的起点为根:
   1)取出A对象,操作。
   2) 导航到B对象操作。
   3) 导航到c对象操作。
   4)。。。。H对象操作。
   事务结束。
  
   a-h的对象那些需要回写数据库的? 如何回写?这些都需要对整个对象图进行管理。hibernate目前能做到的也就是 具有级联关系的一些对象而已。

   现在解决方案要么就是在A-H各个对象中弄个DAO来取数据,要么就是直接写在里面,做的最好的hibernate倒是能够无侵入的自动根据配置好的关系在对象图中遨游,但是遨游过后的再次回填,确实做不到的。不过怎么说也算进了一大步了。

   什么时候在对象图遨游般的回填数据库,那么领域模型的春天才算真正到来了。
              

2 楼 czx566 2009-01-16  
不明白为什么楼主觉得持久化 那里做不到了?
1 楼 diaodou 2009-01-16  
但我们最起码可以做到:
把领域模型分离出来,更好的封装领域或业务知识,可以一定程度减少需求变化的影响
提炼领域模式,比如Entity, Value Object这些building block

其实,领域模型对软件开发的方方面面都有影响的吧

相关推荐

    mongo-java-driver-3.9.1

    在Java程序中如果要使用MongoDB,需要MongoDB JDBC驱动。本资源内含4个文件:mongo-java-driver-3.9.1.jar,MongoDB JDBC驱动包。mongo-java-driver-3.9.1-sources.jar,MongoDB JDBC驱动源代码包。mongo-java-...

    mysql-connector-java-5.1.23 官网下载

    To begin your download, please click the Download Now button below. Download Now » mysql-connector-java-5.1.23.zip MD5: 1a6cbbfccab7884134471992005fe0f9 Size: 3.7M Signature java编程eclipse和...

    esp-idf-espnow-gateway:使用esp-idf的esp-now和MQTT之间的网关

    esp-idf-espnow-gateway 使用esp-idf的esp-now和MQTT之间的网关。 我的灵感来自于。 ESP-NOW可以与ESP8266 / 8285一起使用,但我们不能同时使用WiFi。该项目将ESP-NOW接收的数据传输到MQTT。 电池寿命 ESP8266 / ...

    KW-2200-now.zip

    在电力系统自动化领域,通信规约扮演着至关重要的角色,它定义了不同设备之间数据交换的格式和规则。KW-2200电力规约是一种专门用于电力系统数据传输的标准协议,主要应用于智能电网中的远程监控、数据采集和故障...

    ESP8266使用ESP-NOW示例工程

    ESP-NOW是Espressif Systems为ESP8266和ESP32设计的一种低延迟、点对点的数据传输模式,它不需要建立连接或者网络基础设施,非常适合用于设备间的即时通信。在这个"ESP8266使用ESP-NOW示例工程"中,我们将深入探讨...

    KW-2200-now.rar

    本压缩包“KW-2200-now.rar”提供了一套用于主站和从站模拟测试的工具,特别针对IEC 101和IEC 104协议的开发与测试人员。 首先,我们来详细了解一下IEC 101。它是国际电工委员会(IEC)制定的第一个电力系统通信...

    ServiceNow-Data-Model-v3.4 ServiceNow 数据模型CMDB,ITSM 数据模型,ITOM数据模型

    ### ServiceNow 数据模型详解 #### 一、概述 ServiceNow 的数据模型是其核心功能之一,为各种IT服务管理(ITSM)、配置管理数据库(CMDB)和IT运营(ITOM)提供了强大的支撑。该数据模型的设计旨在确保高度灵活性...

    20210407-中信证券-ServiceNow-NOW.US-深度跟踪报告:企业业务流程SAAS领军者,估值仍有提升空间.pdf

    ServiceNow是全球领先的企业业务流程管理SaaS提供商,其产品线涵盖了IT服务管理(ITSM)、客户服务管理(CSM)、人力资源管理(HRM)等多个领域。ServiceNow采用“one platform, one data model”战略,通过其核心...

    AE插件 --动力学(含教程)--Physics Now

    在视觉特效和动画制作领域,After Effects是不可或缺的工具,而Physics Now则为用户提供了更直观、更强大的物理效果模拟功能,使得动画中的物体运动更加真实且富有动态感。 首先,我们要理解动力学在动画制作中的...

    电子-比赛now.zip

    《电子比赛now.zip——探索STM32-F0/F1/F2单片机及嵌入式技术》 在当今数字化时代,电子竞技与嵌入式技术的结合正日益显现其强大的潜力。"电子-比赛now.zip"这个压缩包,无疑为我们提供了一个深入学习和实践STM32...

    apache-jmeter-4.0 now

    Apache JMeter是一款强大的性能测试工具,专为评估应用程序和...它的强大功能、灵活性和社区支持使其成为性能测试领域不可或缺的工具。通过使用这个压缩包,用户可以避免在线下载的麻烦,快速开始他们的性能测试工作。

    Atom-atom-carbon-now-sh,打开https://carbon.now.sh中当前编辑器内容的Atom包/.zip

    "Atom-atom-carbon-now-sh" 是一个专门为Atom编辑器设计的插件或包,它的主要功能是与"Carbon.now.sh"服务进行集成。Carbon.now.sh是一个在线工具,它能将代码片段渲染成高质量的图像,常用于分享代码截图,呈现出...

    Laravel开发-laravel-nowsms

    Blade::component('components.now-sms-form', 'nowsmsForm'); NowSms::setConfig([ 'url' => config('nowsms.url'), 'port' => config('nowsms.port'), 'username' => config('nowsms.username'), 'password'...

    date-time-old-n-now.rar_Time

    在IT领域,时间管理是至关重要的,特别是在编程和数据分析中。"date-time-old-n-now.rar_Time"这个压缩包文件显然与时间处理有关,其目的是区分旧的时间(old)和当前时间(now)。在这个主题中,我们可以深入探讨...

    terraform-provider-servicenow:管理ServiceNow对象的Terraform提供程序

    Terraform ServiceNow提供商 Terraform的自定义提供程序,用于管理ServiceNow实例中的对象,以在实例外部开发系统应用程序。 当您要创建具有适当源代码控制和持续开发集成的应用程序时,此功能特别有用。 要求 ...

    ESP-Now-Gateway:具有W5500以太网的ESP8266作为ESP-Now节点的网关运行。 包含节点演示代码

    ESP-Now-Gateway 具有W5500以太网的ESP8266作为ESP-Now节点的网关运行。 包含节点演示代码。更多信息提供了有关此项目的更多信息。组件此存储库分为两部分,网关代码(ESP-Now_Gateway)和独立传感器节点的演示/执行...

    Go-Now是一个golang的时间工具包

    在`now-master`这个压缩包中,我们可以期待找到Go-Now的源码,通过阅读和学习源码,我们可以深入理解其设计理念和实现方式,这对于提升Golang的日期和时间处理能力大有裨益。同时,通过研究源码,也可以借鉴其优秀的...

    WifiEspNow:ESP8266 和 ESP32 的 ESP-NOW Arduino 库

    ESP8266 和 ESP32 的 ESP-NOW Arduino 库 WifiEspNow是 ESP-NOW 的 Arduino 库,ESP-NOW 是乐鑫定义的无连接 WiFi 通信协议。 有关 ESP-NOW 的工作原理及其限制的更多信息,请参阅。 特征 是 ESP-IDF 中 ESP-NOW ...

Global site tag (gtag.js) - Google Analytics