`
oiunt
  • 浏览: 8421 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

DDD和TDD结合建模过程记录

阅读更多
2010-11-4

在考虑项目立项的草稿问题时,发现不同的用户获取的ProjectInfo中包含的立项草稿应该是不同的,所以,这里可能不应该只用一个字段savedProjectInitByCurrentUser来表示保存的草稿,而应该是一种其他的方式。
比如,可以采用ProjectInfo中调用草稿Service的方式,用来读取指定用户创建的草稿。
    public ProjectInit getSavedProjectInit(String username, BizObjectSandboxMgrService sandboxService) {
        if (savedProjectInitByCurrentUser != null) {
            return (ProjectInit) savedProjectInitByCurrentUser.retriveBizObject();
        }
        return null;
    }
同时,对于ProjectInfo处于不同状态时,getSavedProjectInit()应该是不同的实现。对于新建的项目,那么创建的草稿就是内存中的数据,如果是已经存在的项目,那么立项草稿就根据用户的信息来获取。这也提示我们采用状态模式来处理。比如上面一段代码就是projectinfo处于新建时的获取草稿的代码,下面是projectinfo处于已经保存状态时的获取草稿的代码。
    public ProjectInit getSavedProjectInit(String username, BizObjectSandboxMgrService sandboxService) {
        if(savedProjectInitByCurrentUser == null && !hasLoadedSavedProjectInit) {
            savedProjectInitByCurrentUser = sandboxService.getBizObjectByOwnerAndBizObjectInfo(username,
                    ProjectInfo.class.toString(), parent.getId());
            hasLoadedSavedProjectInit = true;
        }
       
        if(savedProjectInitByCurrentUser == null) {
            return null;
        }
        else {
            return (ProjectInit) savedProjectInitByCurrentUser.retriveBizObject();
        }
    }



2010-11-5
关于项目立项的历史版本保存问题。
当调用ProjectInfo.acceptProjectInit()时,内部应该更新当前最新的项目立项信息,同时保存上一个项目立项为历史记录。由于我们是采用的通用的历史机制,也就是ProjectInfo中即使具有项目立项的历史版本集合,那么也是无法通过级联操作更新历史记录信息的!这是因为通用的历史机制是基于元数据驱动的,ProjectInfo表与历史信息表并没有外键关系,而是通过元数据来关联的。
最开始的一个思考是在ProjectInfo中没有立项信息的历史信息,当ProjectInfo.acceptProjectInit()时,内部直接调用历史服务进行持久化操作。这个方案的问题在于历史版本的持久化早于ProjectInfo及其相关对象的持久化,可能出现数据同步的问题(当然通过事务可以解决)。另外一个问题是如果将ProjectInfo移动到了客户端,那么在进行ProjectInfo.acceptProjectInit()的时候,就会与服务器端进行通信进行数据持久化,这个数据通信其实是可以与项目信息的持久化一起的。这样分析之后得到的一个结果是,领域实体(值)对象的方法不要直接进行持久化操作!持久化的操作应该由服务调用Repository来驱动持久化,目前这个原则还是比较正确的。
因此,目前采用的模型是,ProjectInfo包含一个立项历史版本的集合,这个集合是transient的。当需要获取立项历史版本的时候,通过历史服务来获取。同时,保存新的历史版本时,也是存入到这个集合,然后最后调用updateProjectInfo的时候来显式的进行持久化操作,而不是隐式的!持久化的代码可能如下:
updateProjectInfo(projectInfo);
updateProjectInitHistory(projectInfo.getProjectInitHistory());
当ProjectInfo.acceptProjectInit()的时候,执行代码仅仅是在立项历史版本集合中添加一条记录。

2010-11-12
关于页面数据绑定是采用领域实体还是DTO的问题
一直以来都是采用实体与DTO进行转换后,然后将DTO绑定到页面对象。但是,EL表达式提供了足够丰富的表达方式,所以直接采用实体来进行页面展示和数据获取的绑定是可行的。比如要绑定项目立项的类型,传到jsp的对象可以是ProjectInfo对象,其中包含savedProjectInitialByCurrentUser项目立项对象,那么可以通过ProjectInfo对象来导航所有的savedProjectInitialByCurrentUser的属性。
<SELECT NAME="projectType" SIZE="1">
<c:forEach var="type" items="${PROJECT_TYPE_LIST}">
<c:choose>
<c:when test="${PROJECT_INFO_OBJECT.savedProjectInitialByCurrentUser.projectType.id == type.id}">
<OPTION VALUE="${type.id}" selected><c:out value="${type.metaItemName}"></c:out></OPTION>
</c:when>
<c:otherwise>
<OPTION VALUE="${type.id}"><c:out value="${type.metaItemName}"></c:out></OPTION>
</c:otherwise>
</c:choose>
</c:forEach>
</SELECT>
以上这种方法对于实体只是数据载体的用法,理论上是可行的,而且也是简便的。如果ProjectInfo的数据量过大,可以通过类似于构建DTO的方法,将ProjectInfo中不需要的数据去掉。
但是这种方法对于数据的充血模型来说,也就是DDD的思想,是不行的。因为在DDD中的数据实体不仅仅是数据的载体,而是封装了业务规则和逻辑的对象,所以其接口的设计不能是每个属性都有标准set和get方法,如果是这样,就无法将领域对象传到jsp中实现属性的提取。所以,对于DDD来说,需要设置DTO来专门进行前段的数据展示与接收。
0
0
分享到:
评论

相关推荐

    DDD领域建模和TDD知识.png

    DDD领域建模和TDD知识

    DDD领域建模.xmind

    DDD领域建模和TDD相关知识

    DDD 学习材料

    通过对实际问题域的建模和设计,学习者能够更好地掌握 DDD 的精髓,实现更加灵活、可维护的软件系统。在实际应用中,DDD 可以与其他方法学相结合,比如敏捷开发、测试驱动开发(TDD)等,共同构建高质量的软件产品。

    typescript-clean-architecture-implementation:使用tdd的api,遵循ddd和typescript之上的可靠原则

    总之,“typescript-clean-architecture-implementation”项目是实践TDD、DDD和Clean Architecture原则的典型示例,它利用TypeScript的优势来构建一个可靠的API。这个项目可以帮助开发者学习如何在实际项目中应用...

    DDD领域驱动设计_领域驱动设计_twice9t6_

    在实际应用中,DDD常常结合其他软件工程实践,如持续集成、TDD(测试驱动开发)、BDD(行为驱动开发)以及微服务架构,以实现高效、灵活的软件开发。通过DDD,开发团队可以更有效地与业务专家沟通,确保软件的开发...

    领域驱动设计和开发实战.pdf

    - **企业架构的核心**:领域建模和DDD在企业架构中扮演核心角色,促进IT与业务部门之间的紧密合作。 - **围绕领域模型构建**:企业架构的各个组件(业务或基础设施)应当围绕领域模型进行设计和实现。 #### 六、...

    01. 领域驱动设计概览1

    领域驱动设计(DDD)是一种由Eric Evans提出的软件开发方法,主要针对大型复杂系统的领域建模和分析。它强调以业务领域为中心,通过建立领域模型来理解和表述业务逻辑,从而简化系统的复杂性,增强其可扩展性和适应...

    领域驱动设计官方示例代码

    10. **测试驱动开发**:为了确保领域模型的正确性,开发过程中应遵循 TDD(测试驱动开发),编写单元测试和集成测试,以验证领域逻辑和业务规则。 这个"dddsample" 示例代码可能涵盖了以上这些 DDD 概念的具体实现...

    tdd-jbrains-course

    8. **领域驱动设计(DDD)**:探讨如何在TDD的指导下应用DDD原则,以更好地理解和建模业务需求。 9. **代码覆盖率**:讨论代码覆盖率工具,如JaCoCo,以及如何使用它们来度量和监控测试的质量。 10. **最佳实践**...

    《领域驱动设计C# 2008实现问题.设计.解决方案》.((美)Tim McCarthy) [PDF]__(0521).rar

    7. **测试驱动开发**(TDD):DDD往往与TDD紧密结合,通过编写测试用例来驱动模型的构建和改进,确保系统的质量。 8. **持续集成与持续交付**(CI/CD):在实际项目中,如何在C# 2008环境中实现高效的CI/CD流程,以...

    领域驱动设计和开发实战

    例如,业务规则的处理,数据的持久化机制,缓存策略,事务管理,安全性,代码生成工具,测试驱动开发(TDD)和重构等都会影响项目的成功。此外,领域模型应具备以下特点: 1. 领域模型应专注于特定的业务操作领域,...

    Block_DDD_Basic_to_Advance:在此存储库中,我放置了取决于BLoC和DDD体系结构的代码

    通过对这个项目的学习,开发者可以深入了解如何在Flutter应用中有效地结合BLoC和DDD,从而构建出高效、可扩展且易于测试的代码。同时,项目中的Firebase集成和测试实践也会提供关于如何在实际环境中运用这些技术的...

    系统分析与设计 第四版 中文课件

    此外,课件可能还会涉及敏捷开发、迭代模型和瀑布模型等不同的开发方法,以及软件工程中的最佳实践,如TDD(测试驱动开发)和DDD(领域驱动设计)等。这些内容将帮助学生在实际项目中灵活应对,提高开发效率和软件...

    领域驱动设计

    - **测试驱动开发 (TDD)**:通过编写单元测试来驱动开发过程,确保领域逻辑的正确性和稳定性。 #### 六、领域驱动设计的发展趋势 随着软件行业的不断发展,DDD也在不断地演进和完善。未来,DDD将继续强调业务领域...

    《领域驱动设计C# 2008实现问题.设计.解决方案》.((美)Tim McCarthy) [PDF](0520_).rar

    领域驱动设计是一种将业务领域知识与软件开发紧密结合的方法论,它强调通过深入理解和建模业务领域,来指导软件架构的设计和实现。 领域驱动设计的核心思想是将复杂的业务逻辑和规则转化为软件模型,以领域模型为...

    领域驱动设计概览

    DDD的开放性体现在其方法论特性上,允许结合各种软件开发实践和技术,如用例、TDD、用户故事、整洁架构、六边形架构、函数式编程等。这些方法可以与DDD相互融合,共同构建出更加灵活、可扩展的系统。例如,CQRS...

    面向对象分析与设计.ppt

    面向对象分析与设计(Object-Oriented Analysis and Design,简称OOAD)是软件工程领域中的一个核心概念,它涉及到在软件开发过程中如何有效地理解和建模真实世界的问题,以及如何设计出能够满足需求的、可扩展的、...

    基于Spring的Java平台程序架构研究.pdf

    通过结合领域驱动设计、测试驱动开发以及依赖注入和切面编程等关键技术,不仅可以解决传统开发过程中遇到的问题,还能有效提升软件质量,加快开发进度。这对于当前软件行业的快速发展具有重要意义。

    SharpArchitecture asp.net MVC 应用

    - **日志记录**:提供日志记录支持,便于调试和问题追踪。 - **权限管理**:包含角色和权限管理模块,用于控制用户访问权限。 **3. 开发流程与最佳实践** 使用SharpArchitecture框架,开发者可以遵循以下步骤进行...

Global site tag (gtag.js) - Google Analytics