`
ljh2008
  • 浏览: 45948 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

领域对象的关联设计

阅读更多

请大家访问原文地址:http://yanyaner.com/

 

 

正如DDD这本书所说的,领域驱动设计是应对日益复杂的软件系统开发的有效途径,前面的文章中我也讲过,领域模型是一个系统更本质、更核心的东西,准确地 抓住了域模型,你就抓住了系统的“神”,也就能更加灵活地应对需求的变化。我见过很多初学者在学会了ooad和一些设计模式的知识后,恨不得把学到的所有 东西都应用到系统设计当中去,最终的结果就是系统非常的复杂,难于实现和维护。我们知道,真正设计得好的系统,应该是简单的,一目了然。在进行领域模型设 计时,我们的一个原则就是要将复杂的系统简单化,关系要由多对多、一对多双向、一对多单向、一对一,直至独立的对象。大道至简,切不可走入“分析瘫痪”的 歧途。

在这里,我只想结合一个项目实际中的一部分,谈谈一对多双向及一对多单向的设计,希望大家在实际项目中能做到举一反三。

本项目是一个风电场实时监控系统,系统中有这么两组一对多关系:一级菜单和二级菜单,风机与风机实时监控记录,根据我们对需求的理解,有人很快设计出下面的领域图:




 

从图中可以看到,一级菜单和二级菜单均为一对多双向关联,注意secondMeuns与fanRecords集合是多方在一方中的代码体现,那像这种设计有什么好处、有什么问题呢?我们可以从两个方面来考虑这个问题:

一, 建立对象之间的关联关系,好处是对象之间可以方便地实现导航,即:得到聚合根对象后,就可以得到与之相关联的对象;缺点是实例化聚合根对象时将实例化与之 相关的所有对象,如果这些相关对象的在业务中从来没有被用到,则会造成不必要的内存与性能开销(当然,现在的很多ORM框架都有lazy功能,性能倒不是 大的问题)。

那也就是说,我们可以根据业务来确定一对多的关联关系,如果业务中90%的情况是读取到聚合根对象,都一定需要访问它相关的对 象,则可以设计为双向关联,在一方中添加一个集合存储多方对象,否则,则可简化为单向关联,也就成了多对一了(注意:我们这时站在多方的立场来看,是多对 一)。

根据需求及业务,我们可以做出这样的决策:一级菜单和二级菜单的设计要做成一对多双向关联;风机与风机实时记录,可设计为一对多双向关联,也可以设计为单向,因为很多时候仅仅是查看一下风机的信息,并不去关注该风机的实时记录,但有的时候也要查看。

二、综合业务与界面呈现来考虑。

根据需求来看,一个一级菜单中的二级菜单数据不会太多,即时全部加载出来,也不存在性能问题,从界面呈现来看,一级菜单中的二级菜单会一般情况下都会全部显示出来,因此,一级菜单和二级菜单两者设计为一对多双向关联关系,不存在任何问题。

再 来看风机和风机实时记录,根据需求,一个风机每10秒钟就会产生一条实时记录(每半年清理一次),实时记录的数据量将非常庞大,如果在风机这边设计一个实 时记录的集合,我敢保证你永远都不会直接去取这个集合中的数据(不信你调用fan.getFanRecordes()试一下哈),从界面上来看,一般都是 通过分页来查看风机实时记录的,因此,在Fan中包含FanRecordes集合,没有实际意义,也就是说,Fan与FanRecord设计为单向关系, 把前面的一对多双向关联改为现在的FanRecord与Fan的多对一关系(图我就不再去画了)。

也许你有疑问,在一方去掉多方的关联,要是业务实现时又要得到一方所关联的对象怎么办呢?答案是,添加一个相应的业务方法。

总的来说,领域对象之间关系在设计时,应根据需求、业务及界面实现等几个方面综合考虑,尽量将问题简化,当然,初学者喜欢将所学的全部应用到设计中,这也很正常的,我相信每个设计师经历过,大家都是这么过来的。

 

分享到:
评论

相关推荐

    领域驱动设计第二分卷

    7.4 运输领域中的关联设计 121 7.5 聚合的边界 123 7.6 选择仓储 124 7.7 场景概述 125 7.7.1 应用特性示例:改变一件货物的目的地126 7.7.2 应用特性示例:重复业务126 7.8 对象的创建 126 7.8.1 cargo的...

    设计模式:可复用面向对象软件的基础--详细书签版

    对软件设计领域有着独特的贡献,因为它捕获了面向对象设计的有价值的经验,并且用简洁可复用的形式表达出来。它将成为我在寻找面向对象设计思想过程中经常翻阅的一本书﹕这正是复用的真实含义所在,不是吗﹖”--sanjiv ...

    领域驱动设计第一分卷

    7.4 运输领域中的关联设计 121 7.5 聚合的边界 123 7.6 选择仓储 124 7.7 场景概述 125 7.7.1 应用特性示例:改变一件货物的目的地126 7.7.2 应用特性示例:重复业务126 7.8 对象的创建 126 7.8.1 cargo的...

    面向对象系统分析与设计课件及复习资料

    面向对象系统分析与设计课件及复习资料 为老师上课用课件和复习指导 内容包括: 1.3 uml概述 1.3.1 uml简史 1.3.2 uml概貌 1.3.3 uml的特点和用途 第2章 面向对象的软件开发过程 2.1 rational统一...

    领域驱动设计与模式实战

    1.3.2 领域驱动设计 1.3.3 测试驱动开发 1.3.4 重构 1.3.5 选择一种还是选择组合 1.4 持续集成 1.4.1 解决方案(或至少是正确方向上的一大步) 1.4.2 从我的组织汲取的教训 1.4.3 更多信息 1.5 不要忘记运行机制 ...

    设计模式 GOF 23

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

    UML与系统分析设计

    1.2 面向对象的系统分析与设计 1.2.1 面向对象的主要概念 1.2.2 面向对象的系统分析与设计方法 1.3 UML概述 1.3.1 UML简史 1.3.2 UML概貌 1.3.3 UML的特点和用途 第2章 面向对象的软件开发过程 ...

    设计模式实训教程代码

    第三部分对各种相关联的设计模式进行了深入分析和比较,旨在阐明各种设计模式比较理想的应用场景和它们之间的区别;第四部分探讨了设计模式的混编,讲解了如何在实际开发中将各种设计模式混合起来使用,以发挥设计...

    01基于DDD设计的基础知识

    领域驱动设计基础知识 领域服务 聚合及聚合根(Aggregate,Aggregate Root) 实体(Entity) 值对象(Value Object 工厂(Factory) 关联的设计 仓储(Repository)

    UML和模式应用(架构师必备).part06.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    OOD启思录 高清pdf

    而《OOD启思录》被读者评价为“面向对象设计领域中的Effective C++”——正如Effective C++能帮助你迈向C++专家层面,《OOD启思录》能帮助你迈入OOD殿堂。 本书提供了改进面向对象设计的真知灼见。  全书共11章,...

    重构-改善既有代码的设计 中文版.pdf

    12.2 Convert Procedural Design to Objects(将过程化设计转化为对象设计) 12.3 Separate Domain from Presentation(将领域和表述/显示分离) 12.4 Extract Hierarchy(提炼继承体系) 第13章 重构,复用,与现实...

    重构 改善既有代码的设计

     Convert Procedural Design to Objects 将过程式设计转换为面向对象   Separate Domain from Presentation 将领域逻辑与表现分离   Extract Hierarchy 提取继承层次  Chapter 13:Refactoring,Reuse,and...

    6Kv变电所及低压配电系统设计

    供配电CAD技术是计算机技术在电气工程设计领域的另一应用。但是我国供配电CAD技术仍停留在绘图和计算相分离的阶段,还未形成一体化的CAD系统,而供配电系统的设计是一项复杂的工程,它包括需求分析、各级负荷容量的...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    淘宝技术部研发工程师,2011年加入淘宝网,参与了阿里云手机商城、口碑网迁移、店铺建站、offer、支付宝卡宝、生活商城、淘宝同学等项目,在分布式系统架构设计、高并发系统设计、系统稳定性保障等领域积累了较为...

    UML和模式应用(架构师必备).part01.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part07.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    【文献综述】基于JAVA的俄罗斯方块游戏设计与实现.pdf

    "面向对象程序设计语言" 的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的 实际集合体叫做"对象" 。一个对象可以想象成绑定了很多"行为(代码) "和"状态(数 据) "的物体。...

Global site tag (gtag.js) - Google Analytics