Java敏捷开发:使用Java域模型进行数据管理

作者 : IT 大叔 本文共6326个字,预计阅读时间需要16分钟 发布时间: 2020-09-11

在过去的几十年中,计算机科学家一直在完善用于软件开发的最佳实践。最近,这些最佳实践最终形成了一种称为敏捷开发的设计方法。敏捷可以用于许多编程语言中,但是在Java开发人员中越来越受欢迎。

敏捷Java将所有测试驱动的开发,面向对象的设计和软件体系结构整合到一种简单的方法中,以构建健壮且高度可扩展的软件系统。

今天,您将学习如何使用Spring框架实现不同的关系模型。我们将向您展示如何使用测试驱动的敏捷开发方法。这些流行的方法有助于我们设计和开发健壮且可管理的应用程序。

这是我们今天要介绍的内容:

  • 什么是敏捷开发?
  • 什么是测试驱动的开发?
  • Java数据管理领域模型
  • 独立实体
  • 一对一的单向关系
  • 一对一的自我参照关系
  • 一对多双向关系
  • 多对多单向关系
  • 接下来要学什么
敏捷开发方法

敏捷开发是一种席卷整个行业的新方法。这种软件开发方法使我们能够在1-4周内以较短的迭代增量地构建程序。增量过程有助于使开发过程与业务需求保持一致。

敏捷开发是一种软件开发的迭代方法,专注于创建自适应产品。项目进行多次迭代,每个迭代都基于先前的迭代,并逐步接近最终产品。

敏捷方法还优先考虑了开发团队和业务团队在各个阶段之间的密切亲密协作。在每次迭代结束时,开发人员都会重新评估业务需求和开发实践。这些发现将用于在下一次迭代中调整产品。敏捷也欢迎可以在任何迭代中添加的新功能思想,即使是在后期也可以。

传统开发仅在流程开始时就考虑了业务需求,这意味着产品可能不再是最佳产品,或者在开发周期结束时无法满足业务需求。

什么是测试驱动的开发?

测试驱动开发(TDD)是使敏捷开发成为可能的关键开发技术。TDD通过在开发过程中创建和测试少量代码来专注于逐步开发。如果所有小段代码都通过了测试,则该项目已准备就绪。

TDD完美地支持了敏捷开发,因为它可以确保每个功能在继续开发下一个功能之前都能正常工作。然后,开发人员可以在敏捷迭代结束时组合所有工作功能,以形成工作项目组件

测试驱动的开发过程

TDD流程包含4个步骤:

  1. 编写测试代码以检查所需的小功能。
  2. 运行测试。这应该会失败,因为尚未添加任何代码。如果通过,请返回步骤1。
  3. 仅添加足够的代码以实现所需的功能。
  4. 再次运行测试。如果通过,请继续使用其他功能。如果测试失败,请重新访问步骤3。

使用TDD,我们可以采取较小的措施来完成较大的项目。您可以将其分解为几个小步骤,例如“创建登录按钮”,“显示最新内容”等,而不必为大型任务“创建Web应用程序”所淹没。

TDD对调试也很有帮助。与传统的编码过程相比,TDD过程的每个周期所涉及的代码更少。检查一个10行功能的bug比一个完整的1,000行项目要容易得多。

使用敏捷和测试驱动的开发时,最佳实践是使用域模型为解决方案建模。这将帮助团队中的每个人了解程序的体系结构以及如何在最终产品中连接其组件。下面,我们将解释什么是域模型,并为您提供一些示例,说明如何在代码中表示这些模型。

Java数据管理领域模型

软件体系结构是指编程解决方案的基本结构。该体系结构通常是在开发过程的早期创建的。它作为计划如何设计程序片段以及如何相互交互的计划

将域建模视为描述程序的真实世界实体及其之间关系的一种方式。

敏捷的开发人员偏爱为其实际应用程序和基于团队的计划进行领域建模。领域建模是一种概念模型,可同时跟踪项目段的行为和数据。这些段中的每一个都称为“域”,代表代码中的真实世界知识或行为领域。

然后将这些域连接到模型中的所有其他相关域。完成后,域模型将使开发人员能够跟踪他们需要包括哪些行为以及每个团队将计划进行哪些交互。

领域模型图的示例

域通常表示为通过箭头网络连接到其他链接域的矩形。在Java中,域通过类表示。

敏捷开发人员之所以使用此模型,是因为它允许所有项目成员了解每个项目组件的目的和联系。域模型还将代码排除在计划过程之外。相反,开发人员仅在开始编写域函数时才开始考虑代码。这使开发人员可以对每个域进行编程以适合所有先前创建的项目部分,并应用整个项目周期中收集的更多最新信息。

概述:域模型的开发过程

域模型有很多类型:

  • 独立实体
  • 一对一单向
  • 一对一双向
  • 一对一自我参照
  • 一对多单向
  • 一对多双向
  • 一对多自我参照
  • 多对多单向
  • 多对多双向
  • 具有联接属性的多对多双向
  • 多对多自引用
  • 具有连接属性的多对多自引用
  • 单表继承
  • 具体表继承
  • 类表继承

每个领域都有各自的优点和缺点,适用于特定类型的项目。五个最常见的域模型是独立实体,一对一单向,一对一自引用,一对多双向和多对多。

了解域模型名称:

大多数域名的第一部分是指相互链接的实体数量以及是否存在父实体,例如具有“一对一”关系的实体。第二部分介绍了链接访问的方向。在单向中,访问仅以一种方式进行,而双向则以两种方式进行。

每个模型都需要相同的7个常规步骤来创建。让我们深入了解它们。

  1. 数据传输对象:开发一个充当用户界面和数据访问对象层之间映射的对象。内部数据库设计不应向用户界面公开。
  2. 模拟服务:开发模拟服务,将数据保存到内存数据库中。
  3. 模拟用户界面:开发一个模拟用户界面,以演示如何与模拟服务集成。通过显示UI如何与服务交互,UI团队可以与服务开发团队合作。
  4. 资源层:创建一个资源软件层以包含程序实体。实体由Hibernate实现管理。
  5. 数据访问层:创建一个数据访问软件层,以简化对实体的访问。这由Spring处理。
  6. 业务服务层:创建一个业务服务软件层,该层管理数据访问子系统并允许应用程序调用数据访问层。必须包含一个映射器,才能将数据访问对象转换为实体。
  7. 表示层:创建一个表示软件层,该层使用基于JSON REST的Spring控制器向用户公开服务。

根据所选域模型类型,每个步骤都需要稍微不同的代码实现。在本文的后面,我们将探讨对于前5个域模型而言,数据传输对象的创建有何不同。

如何配置您的工作区

要成功运行Java域模型,您将需要5个工具。如果您现在不想下载任何内容,请随时跳到带有嵌入式代码的示例部分。

您需要的工具是:

  • 面向Java EE开发人员的Eclipse IDE
  • JDK 1.7
  • 阿帕奇Maven
  • MySQL数据库服务器
  • 阿帕奇雄猫

您还需要我们在Github上的Spring-Hibernate书中的源代码zip。

Java敏捷开发:使用Java域模型进行数据管理插图

然后,您需要解压缩这些文件并将其作为Maven项目导入到Eclipse中。

Java敏捷开发:使用Java域模型进行数据管理插图(2)

选择“现有Maven项目”选项后,选择已解压缩下载文件的文件夹,然后选择包含POM的目录,如下所示。

Java敏捷开发:使用Java域模型进行数据管理插图(4)

从这里开始,使用MySQL创建一个spring在MySQL Workbench中命名的新模式。

接下来,打开Tomcat并安装v7.0服务器。然后,单击添加库-> JRE系统->库->备用JRE->已安装的JRE。将其设置为默认值,然后单击“完成”。

最后,将Spring OODD项目添加到Tomcat配置中。一旦启动,Tomcat将从中加载索引页面web.xml

恭喜,您现在有了实现Java域模型的工作区!

接下来,我们将讨论五个常见的领域模型,并教您如何为每个模型创建数据传输对象。

独立实体

该模型的特征是没有关系的单个实体。它用于在将单个实体添加到关系模型之前对其进行演示。开发人员使用一个独立的实体来查看Spring应用程序的各个组件并了解它们所扮演的角色。

例如,我们可以查看Product带有String字段的实体name

独立实体

实体与类

类是相关数据集合的技术表示。实体是代表实际对象或功能的数据集合。在Java中,代表现实世界概念或行为的类是实体。

开发数据传输对象:独立实体

要为独立实体创建数据传输对象,请使用以下代码创建一个类:

public class ProductDto implements Serializable {
  private static final long serialVersionUID = 1L; private Integer id;
  private String name;
 
  // getters and setters 
}

此处,implements关键字将此对象映射到用户界面。每个变量都是私有的,以避免将数据库设计公开给用户界面。

一对一的单向关系

一对一的单向模型涉及两个单独的实体,数据和服务只能在一个方向上移动。数据发送到子对象后,就无法再引用父对象,因为在子对象中没有指向父对象的链接。

一对一的单向关系

例如,假设我们有一个书店运费由一到一单向模式有两个实体所代表的程序,BookShipping。该Book实体都有一个标识符和一个字符串name字段,类似地,Shipping实体都有一个标识符和一个字符串city字段。的实例中Shipping必须存在的实例Book。的Book是关系的持有端。它可以遍历Shipping,但Shipping不能遍历Book

这用于过程的第一阶段不需要知道第二阶段的结果的情况。例如,Book上面的实体不需要知道Shipping实体中正在发生什么,例如书将要去的城市。该Book实体只需要知道某本书传递给Shipping,因此它可以从库存中移除。

开发数据传输对象:一对一的单向关系

要以一对一的单向关系创建数据传输对象,将使用以下BookDto类:

public class BookDto { 
  private Integer id; 
  private String name; 
  private String city;
 
  // getters and setters 
}

同样,我们使用私有变量封装实体设计,以防止客户端或UI查看不需要的信息。数据传输对象包含对象的标识符Book,名称和城市字段。但是,它没有Shipping实体的标识符。当Book和和Shipping在服务中相关时,用户只能Book通过数据传输对象看到该对象。

这种架构将帮助您的用户界面团队,因为他们不必管理Shipping实体标识符,而可以将服务作为一个对象调用。

一对一的自我参照关系

在一对一的自引用关系中,实体链接到同一类的另一个实例。因为它是一对一的,所以一个实例不能链接到多个其他实例。但是,并非此模型中的所有实例都需要具有关系。

一对一的自我参照关系

例如,假设一个Student实体与一个导师(也是的一个实例)之间的关系Student。每个Student实体都有一个标识符和一个字符串名称字段。该Student实体可以有一个可选的导师是谁也Student。此关联是在的第一个实例中声明的Student,而不是在指导者中声明的Student

当同一类的实例之间的关系过于相似而需要单独的类时,最好使用此方法。这也使它成为关系是可选的而不是标准的情况的理想选择。

开发数据传输对象:一对一的自引用关系

对于一对一的自引用关系,我们的数据传输对象将如下所示:

public class StudentDto {
    private Integer id;
    private String name;
    private String mentorName;
    
    // getters and setters
}
 

请注意,我们有idname,和mentorName,但不包括导师的对象标识。

数据传输对象没有Student指导者对象的标识符,因为UI团队不需要查看我们的关系系统的内部设计。我们只包含一个mentorName,因为每个人Student只能有一个指导者。

一对多双向关系

当父实体与子实体的任意数量的实例相关联时,存在一对多的双向关系,并且每个子实体都包含一个指向父实体的链接。通讯可以从父级到子级,也可以从子级实例到父级,因为双方都必须具有彼此的链接。

一对多双向关系

例如,考虑一个程序,其中列出了具有两个实体Item和的项目的功能Feature。该Item实体具有标识符和字符串类型name字段。该Feature实体还具有一个标识符和一个字符串类型number 字段。的每个实例都Item必须包含指向至少一个的链接。同样,每个的实例Feature必须链接到的一个实例Item

由于关系是双向的,因此Item或的所有实例都Feature可以访问与其链接的任何实例。

当您要在复杂关系网络中的多个父级之间重用子实例时,最好使用此方法。在上面的示例中,的父实例Item可能链接到子功能Waterproof,但是防水也链接到的许多其他实例Item。此外,我们Item可以链接到描述它所需的许多功能。

开发数据传输对象:一对多双向关系

对于一对多的双向关系,我们的数据传输对象将如下所示:

public class ItemDto {
    private Integer id;
    private String name;
    private List<String> featureList;
    
   // getters and setters
}

Item数据传输对象都有一个标识符,名称Item,和字符串的列表Feature名称。使用Feature名称列表可以使我们将多个Feature对象链接到一个对象Item

我们Feature在数据传输对象中排除了该对象的标识符,以简化UI团队的API调用。这不仅可以确保数据库设计的安全,而且还可以避免UI团队管理每个子对象的标识符的麻烦。

多对多单向关系

在多对多单向关系中,父实例链接到任意数量的子实例,子实例可以链接到任意数量的父实例。父实例可以访问其子实例。但是,不允许子实例访问其父实例。

多对多单向关系

例如,假设您正在创建一个简单的社交媒体程序,该程序允许父实体User链接到子实体Group。该User实体具有一个标识符和一个字符串类型名称字段。该Group实体还具有一个标识符和字符串类型名称字段。

每个多对多关系都有一个父母。在此示例中,用户是父母。的每个实例User都链接到的至少一个实例Group。的许多实例User可以链接到的相同实例Group

的实例User可以访问所有链接的Group实例中的数据,但是,Group实例不能访问该User实例中的数据。

这最好用于安全地创建复杂的网络,其中一些数据是公共的,而某些则是敏感的。

开发数据传输对象:多对多单向关系

对于多对多单向关系,我们需要创建三个数据传输对象。

public class UserDto {
    private Integer id;
    private String name;
 
    // getters and setters
}
 
public class GroupDto {
    private Integer id;
    private String name;
 
    // getters and setters
}
 
public class UserGroupDto {
    private UserDto userDto;
    private GroupDto groupDto;
    
    // getters and setters
}

UserDto数据传输对象都有一个标识符和该用户的名称。类似地,GroupDto对象具有标识符和组的名称。第三个对象UserGroupDto是连接对象,它连接UserDtoGroupDtoUserGroupDto,具有UserDtoGroupDto内部的实例,可用于一起调用两个传输对象。

接下来要学什么

恭喜你!您已迈出第一步,以实现敏捷体系结构规划中使用的前5个领域模型。

从这里开始,您就可以探索10个更高级的域模型。您还可以进行超出最初的数据传输对象步骤的工作,以创建自己的功能完整的体系结构。

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Java敏捷开发:使用Java域模型进行数据管理

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论