UML
来源: |
时间:2018-11-09
|
|

JHipster,UML

JHipster-UML是一个JHipster子项目,可以用来替代使用实体子生成器我们的想法是,使用可视化工具管理关系比使用经典的Yeoman问题和答案更容易

JHipster-UML项目可以在GitHub上获得,它是一个像JHipster(Apache 2.0许可证)这样的开源项目。如果您喜欢这个项目,请不要忘记给我们一个关于GitHub的明星!

这是本页面的内容:

  1. 介绍

  2. 问题和错误

  3. 安装

  4. 如何使用JHipster-UML
    4.1。UML文件
    4.2。使用JHipster-UML
    4.3。生成了什么
    4.4。JHipster指出
    4.5。保留字

  5. 例子
    5.1。Modelio
    5.2。UML Designer
    5.3。GenMyModel
    5.4。其他编辑
    5.5。枚举
    5.6。表名
    5.7。所需关系

  6. 测试

  7. 贡献:问题和改进
    7.1。解析器修改

  8. 附件


介绍

JHipster-UML是通常Q&A的替代品,因为它为您提供了使用UML编辑器创建将由JHipster-UML解析的图表的可能性。

以下是我们支持的编辑器列表:


问题和错误

JHipster-UML 可以在GitHub上获得,并遵循与JHipster相同的贡献指南

请使用我们的项目提交问题和提取请求:

提交任何内容时,您必须尽可能准确:

  • 一个发布的问题必须只有一个问题(或一个需求/问题);

  • 拉请求是受欢迎的,但提交必须是'原子'才能真正理解。

请注意,使用JHipster-UML(或JHipster)可能会很麻烦(必须安装一些工具才能真正使用Node环境而没有任何问题)。如果您在Windows上遇到问题,链接可能会有所帮助。

Windows上可以遇到的另一个问题就是这个问题该链接提供了解决方案,以解决这种情况。

最后,Windows用户使用Git Bash报告了一个问题。JHipster生成器的问题(来自InquirerJS)无法工作(用户在回答问题时卡住了)。使用JHipster UML(或JHipster)时,您可能希望使用Powershell或其他shell。


安装

要安装JHipster UML,只需使用以下命令:

   npm install -g jhipster-uml
   # or
   yarn global add jhipster-uml

但是,如果您不想全局安装最新版本,因为它与您的生成器版本不匹配(请参见下文),或者您希望它包含在本地,请使用此命令:

    npm install jhipster-uml --save-dev
    # or
    yarn add jhipster-uml --dev

如果你想要'前沿'(几乎完全可以安全使用)版本,你可以从我们的GitHub项目中克隆我们的git repo 

git clone https://github.com/jhipster/jhipster-uml.git 用于HTTPS

git clone git@github.com:jhipster/jhipster-uml.git 用于SSH

JHipster UML是一个可以与JHipster的生成器一起使用的工具如果您在v3.0.0之前使用生成器,则必须使用JHipster UML v1.6.5(最新的补丁版本)。否则,使用v2.0.0 +是发生器的v3.0.0 +的选择。


如何使用它

JHipster-UML非常易于使用,您只需要在XMI中导出的类图,JHipster-UML将解析它以创建您的实体。

UML文件

类图应该模拟JHipster应用程序域的实体,因此您有限制,您必须遵循该方法。

实体

每个实体由一个类表示,其字段是类的属性。属性必须具有JHipster支持的类型,否则它将不起作用。要使JHipster支持的类型如“BigDecimal”,“LocalDate”......,您可以为它创建PrimitiveTypeDataType您可以查看具有JHipster支持的所有类型的表以及您可以在此处使用的验证

预订实体

以下是JHipster正确创建的类的示例。我们将属性publicationDate和price设置为我们创建为DataType的BigDecimalLocalDate 类型。

请注意,您不需要大写类型名称(除了像BigDecimal这样的组合名称,JHipster-UML大写简单名称)。

关系

我们只是使用JHipster中的示例来展示如何使用编辑器来完成它。请注意,我们支持“ 管理关系”页面中列出的关系

一到一

一到一

在这里,我们在Driver和Car之间建立了双向的一对一关系,Driver作为关系的所有者。

如果您正在寻找单向关系:

一到One2

请注意,为了实现单向关系,我们只删除了citizen标签,以便Passport没有它。

一个一对多

一个一对多

在这种双向关系中,所有者可以拥有许多汽车,而汽车只能拥有一个所有者。

JHipster(尚未)支持一对多关系的单向关系(有关此内容的详细信息,请参阅页面)。这是这种关联的一个例子:

一到Many2

多到一

如前所示,相当于一对多的关系是多对一的:

一到Many2

现在汽车知道他们的主人,但不是相反。

许多一对多

许多一对多

在这里,我们在Car(所有者)和Driver之间建立了多对多的关系。

声明要用于在Angular中显示关系的字段

为此,您必须()在注入的字段名称之间添加字段名称。

在一对多关系中,您可以将其添加到关系的“多个”侧:

  • UML

otherEntityField一对多

  • JDL

    relationship OneToMany {
      One{many} to Many{one(<otherEntityField>)}}

在多对多关系中,您可以在实体的所有者端添加它:

  • UML

otherEntityField多对多

  • JDL

    relationship ManyToMany {
      Owner{notOwner(<otherEntityField>)} to NotOwner{owner}}

反身性案件

自反性

如您所见,有三种反身性。JHipster-UML仅支持前两个(一对一和一对多)。支持多对多案例,因为:

  • 它可能导致过度复杂和错误的模型(可以更容易地实现相同的效果);

  • JHipster不支持它(这是一件好事);

一个完整的例子

我们使用此处提供的Oracle HR示例中的图表

这是这种图表的截图(来自Modelio):
HR UML图

正如您所看到的,我们将其更改为使其更有趣。JHipster可以在它们之间生成实体和关联(一对一,一对多等),在这个例子中,我们添加了每种类型的关联(甚至是反身和继承)。JHipster还不支持继承(但是反射性是由JHipster支持的,并带有警告),但我们决定将它包含在示例中,以便有一个可靠的基础来使用。

使用JHipster-UML

在UML编辑器中设置JHipster应用程序和类图后,请按照下列步骤操作:

  • 第1步 - 将类图导出为XMI文件格式

  • 步骤2 - 在JHipster应用程序根文件夹中,执行命令

jhipster-uml <your_file.xmi>

请注意,您不需要提供数据库类型(sql,mongodb或cassandra),因为JHipster-UML会为您检测类型(来自.yo-rc.json文件)。

但是,如果您希望在JHipster应用程序之外执行JHipster-UML,则需要传递一个额外的参数:数据库类型名称。以下是要执行的命令:

jhipster-uml <your_file.xmi> [--db (sql | mongodb | cassandra)]

也可以生成JHipster DTO,只需传递--dtoarg即可启用此功能。

jhipster-uml <your_file.xmi> [--db (sql | mongodb | cassandra)] [--dto]

您可以使用选择实体的分页--paginate

jhipster-uml <your_file.xmi> [--db (sql | mongodb | cassandra)] [--paginate]

最后,您可以使用选择服务--service

jhipster-uml <your_file.xmi> [--db (sql | mongodb | cassandra)] [--service]

请注意,使用该paginate选项而不选择任何实体来生成分页会取消您选择使用此选项。

最后,如果你需要帮助,也有一个命令:

jhipster-uml --help

  • 第3步 - 就是这样!

注意:如果要使用可用的类和方法,JHipster-UML的首选入口点是ParserFactory(这样您就不会打开文件,读取它,找到根元素等)。

JHipster-UML文件

JHipster-UML可以通过命令行和/或基于JSON的配置文件来配置jumlfile帮助中描述的选项可以在两者中使用,但是命令行优先于jumlfile

一个具体的例子

jumlfile内容:

{
  "db": "sql",
  "force": "true"}

呼叫:

jhipster-uml --no-force

您将拥有以下执行选项:

  • db:sql

  • force:false(没有力)

生成了什么

执行JHipster-UML后,将创建.jhipster文件夹(如果之前不存在),并以JSON格式填充XMI文件中存在的实体。

请注意,至少不能生成一个实体:用户实体。它实际上是由JHipster在创建新应用程序时搭建的(并且JHipster-UML会显示警告消息)。

接下来,它非常简单:只需运行你的应用程序!

JHipster指出

JHipster是一个很好的脚手架工具,有许多约定,其中一些在使用JHipster-UML生成实体时值得一提:

  • 您不必id在实体中使用字段,因为JHipster默认生成一个字段,如果检测到ID,JHipster-UML会删除任何字段;

  • 您不必在关系中使用复数形式,JHipster s在需要时添加例如,如果实体A和实体B之间存在多对多关系,则不必命名关系的结束,as或者bs因为JHipster会为您做到这一点;

保留字

JHipster保留了禁止(在某些情况下)单词的列表例如,如果要为应用程序生成实体,并且此应用程序使用Cassandra,则不能使用BATCH字段名称或表名称中的单词

从v2.0.0开始,JHipster UML会检测到这些单词并在遇到这种情况时立即抛出异常。但是,当保留字可以使用或不能使用时,JHipster UML无法100%准确地断言。这就是为什么当可能存在使用此类关键字的风险时,它会向用户发出黄色消息警告。


例子

这里将讨论每个编辑器,以便您知道如何获得一个好的XMI文件。

注意:JHipster-UML可以检测到错误的XMI文件,它会显示它找到的第一个错误并立即退出(失败快速行为)。

在JHipster-UML中,每个编辑器都已经过Oracle示例测试。如果您希望在“虚拟项目”中看到示例,您只需为每个编辑器下载这些文件,并测试JHipster和JHipster-UML:

Modelio

对Mac用户的注意事项:Modelio在Mac(GUI)上表现得很奇怪,它可能是由Mac上的图形和窗口管理器引起的,因为它还没有在Linux Ubuntu上诊断出来。它有效,但互动可能不愉快。

重要版本说明:

  • Modelio v3.3已经过测试并正常运行,但v3.4中存在一个错误,导致用户无法导出图表。从v3.4.1开始修复此错误。

  • Modelio v3.5.X在处理双向多对多关系时引入了一个错误(JHipster UML解析XMI时的错误Cannot read property '0' of undefined)。此问题似乎已在更高版本(v3.6.X)中得到修复。

Modelio可以在这里免费下载如果您正在下载任何3.3+版本,请确保您拥有Java 8(否则将无法使用)。

示例文件在这里

启动后,创建一个项目,您将看到此视图:

空Modelio项目

请注意左侧面板标题为“类模型”。您只需要'Class','Attributes','Aggregation','Composition'和'Data Type'对象。您已经可以猜到为什么需要第一个2.“聚合”对象用于定义聚合:B聚合为A表示A有0个,1个或更多个(n个)B实例.A不创建(和破坏)B实例。组合意味着如果A由B(0,1或n个实例)组成,则它创建,管理和销毁B实例。

您可以使用其中任何一个,解析器只会将两者视为关联。

在这两种情况下,基数和关联名称都很重要。

最后,“数据类型”对象使您可以创建自定义类型(Modelio未提出的类型),例如BigDecimal,或LocalDate

在这个例子中,我们将解释如何连接两个类:

Modelio组合示例

如您所见,员工有工作(但也根本没有工作)。解析器会注意到一些事情:

  • 两个班级(员工和工作);

  • 两个字段(电子邮件和标题),它们的类型,它们所属的类(每个类包含其字段)。他们的能见度没有考虑在内;

  • 将它们与协会的方向联系起来的协会(这很重要!);

  • 基数(1和0..1)意味着员工可以有一份工作(0或1),并且两名员工不分担工作(只有一名员工,为了这个例子);

  • 有一个注入的领域:工作,员工。

这种关联被称为一对一。返回几个部分以查看其他类型的关联。

Modelio支持约束。双击字段,转到“注释和约束”选项卡,第一个图标应为“添加约束”,然后选择“约束”,双击约束,并为其命名(它应该是JHipster约束之一)。对于约束值,请在“Body”字段中输入。

最后,一旦你的图表完成,你只需要导出它。

导出到XMI Modelio

检查模型透视图,找到项目后,进入一个级别并右键单击最后一个元素(您的项目名称较低的名称),XMI,导出XMI。应弹出一个窗口,选择输出路径,将兼容性更改为OMG UML2.4.1,将扩展名留给XMI,然后就可以开始了。

评论

要注释类(或属性),只需双击元素,选择Notes and constraints选项卡,然后添加一个note

Modelio,评论

请注意,此编辑器无法进行评论关系。

UML设计器

UML Designer可以在这里下载它的工作方式与Eclipse相同。要创建一个空项目,只需单击File - > New - > Modeling Project。输入名称,然后进行验证。如果没有创建file.uml,请右键单击项目,然后单击New - > Other - > UML Designer - > UML Model,并输入所需的任何名称。

此处提供示例XMI文件

然后,您将通过以下视图呈现:

UML Designer,仪表板

双击“设计”类别下的“类图”。您现在可以在右侧看到“调色板”。您只需要这些对象:'Class','PrimitiveType','DataType'(均在'Enumeration'下),'Composition'和'Aggregation'(均在'Association'下)。

使用UML Designer,您可以通过使用DataType或PrimitiveType(解析器识别两者)来创建自定义类型。

以下是使用此编辑器的示例:

使用UML Designer的员工和工作

要创建属性,只需双击该类,然后添加属性即可。您可以通过右键单击图上的某个位置(在空白区域中)导入类型,然后导入原始类型,然后选择UML和Java。这将为您省去手动创建类型繁琐工作(使用DataTypes或PrimitiveTypes)。

不幸的是,UML Designer还不支持约束。

UML Designer提供的一个好处是你不需要导出到XMI,只需转到你的工作区,你就会看到保存的项目已经是正确的格式,所以这很酷。

单向关系

该编辑器支持单向关系。为此,在两个类之间创建所需的关系,双击关系并进行调整。

评论

可以对类和属性(而不是关系)进行注释,实现这一点非常简单:单击元素,然后选择comment添加自己的元素

Uml Designer,评论

GenMyModel

GenMyModel是一个浏览器中的UML编辑器,可以在这里找到你可以免费使用它但有限制,我们希望这个编辑器能让用户在没有下载应用程序限制的情况下使用JHipster-UML。

XMI文件示例位于此处

注册后进入Projects - > New Projects,输入它的名称,在Model Type中选择UML,在默认图中选择Class Diagram,然后单击Create project。然后会显示以下屏幕:

GenMyModel dashbord

在网格左侧的面板上,可以制作图表的所有元素。我们只需要元素'Class','DataType','Attribute','Aggregation'和'Composition'。您可以使用'Aggregation'或'Composition',解析器只能看到两个类之间的关联及其基数。

下面是一个示例,介绍如何创建两个实体,它们之间具有一对多关系,并通过'DataType'声明JHipster类型:

GenMyModel图

解析器会注意到一些事情:

  • 两个班级,“作者”和“书”。

  • 两个DataTypes,'LocalDate'和'BigDecimal'

  • 属性,您可以使用默认类型或声明的DataTypes设置类型。

  • '作者'和'书'之间的聚合(方向很重要!)。

  • 书中有两个注入的字段“作者”和作者中的“书”。

  • 基数(1和0 .. *)表示书籍可以有一个作者,而作者可以有几本书,这些书籍对应于作者和书籍之间的一对多关系。

遗憾的是,您无法为属性创建自定义约束以适合JHipster。

完成图表后,您可以将其导出到XMI。要做到这一点,只需单击工具 - >导出为UML(XMI)

单向关系

在GenMyModel中,创建单向关系非常简单:只需从您不想要的字段中删除名称,就可以了。

例如,采取这个简单的情况:

GenMyModel,单向

这里MyClass将有一个myClass2属性,但MyClass2不会有myClass字段。

评论

注释可用于类,属性和关系字段。

只需单击元素并在描述字段中写注释即可。

GenMyModel,评论

其他编辑

Sparx EA

Guillaume Finance已经添加了对此编辑器的处理支持。这是回购,您可以在这里阅读演示文稿

枚举

JHipster和JHipster UML都支持枚举。以下是您定义它们的方式:

  • 对于Modelio,拖放Enumeration对象并将其放置在某处。最后,将Enumeration Literal对象添加到枚举中以添加它;

  • 对于UML Designer,Enumeration可以放置和使用对象。然而,字面意思并没有被调用Enumeration Literal,只是Literal;

  • GenMyModel拥有所需的对象:Enum并且Enum Literal在主对象面板中(在屏幕的左侧)。

表名

从v1.6.2开始,现在可以为实体指定表名。

要做到这一点,只需要指定表名和类名,如下所示:

tablenameimage

<ENTITY_NAME>/s*(<TABLE_NAME>)无论编辑如何,这个惯例都是通用的。

但是,如果您不想选择特殊的表名,则只需编写类名即可。JHipster UML将负责将其转换为适当的表名。例如,如果您的类名是MyClass,那么您的表名将是my_class

请注意,自v1.6.2起,此功能可用于UML编辑器。

所需关系

从v2.0.0开始,可以建立所需的关系。要指定一个,只需确保要求的关系结束不是“0”(“1”或“*”将执行此操作)。要查看示例,请记住Oracle的完整HR示例,并注意JobHistory类有3个必需的关系。


测试JHipster-UML

测试可在测试文件夹中找到,并可通过npm test我们使用Mocha进行测试(以及chai和期望来自chai)。

如果你愿意,另一个运行测试的命令,或只运行你想要的测试,是:mocha请注意,您需要在根目录中才能使用此命令,并且您可能还需要安装全局mocha npm install -g mocha(或者只使用node_modules文件夹中的文件,如果您npm install使用JHipster-UML ,则可以使用该文件夹)目录)。但是,如果您不想在全局安装所有内容,请执行以下操作:

  • npm install 安装mocha依赖项,

  • ./node_modules/mocha/bin/mocha要运行测试,请注意您可能需要使用/一些“异国情调”的操作系统。


贡献:问题和改进

因为我们的工具是不完美的(),你可能会注意到一些违规行为。GitHub提供了一个非常好的问题跟踪器,以便每个人都可以发布一个问题。我们遵循与JHipster相同的指导方针,增加了一些内容:

  • 内部发现的错误(由JHipster-UML团队发布)可能会在问题跟踪器中发布,但有关受支持的UML编辑器的错误除外。

  • 增强功能也是如此。

注意:在JHipster-UML的github页面上发布PR和问题,这里不在主JHipster页面上。

解析器修改

1.0.0版本带来了一个新的解析器系统,只要XMI易于解析,就可以轻松地进行任何更改(解析器创建,更新,删除)。

添加解析器

解析器实现

添加解析器非常简单。如果你是Java开发人员,你可能对OOP原则非常熟悉(我们希望如此)。在开发JHipster-UML时,我们想到了它的架构,就像我们通常用Java做的那样。

您只需“扩展”我们的抽象解析器(AbstractParser),或实现我们的接口(Parser)来添加解析器的具体实现。

您应该注意到Parser接口的某些方法会抛出UnimplementedOperationException这个想法显然来自Java,你可以在具体的解析器中实现这个方法。

有些方法不会抛出任何异常,只会调用其他方法。如果您熟悉Java 8,我们只是复制了它非常棒的默认方法,并且做了相同的操作(因此您不需要手动实现它们)。

就像在Java中一样,您可以覆盖任何您想要的方法,并创建自己的方法。你不受限制(除非你想超载)。

AbstractParser类提供了一些字段,默认构造函数和一些方法,因此您不必在以后创建或实现它们。

显然,您应该实现这些方法中的每一个(或覆盖#parse#findElements方法)。

getter不是强制性的,但可以作为获取某些重要字段的方法,并提供在发送这些字段之前修改它们的方法。

编辑检测

当您完成创建闪亮的新解析器后,应将其添加到可用编辑器的“列表”中:

  • 首先要求它就像这里一样;

  • 让它像这里一样可用;

  • 这里一样将它添加到列表中

但是,必须遵守一些准则:

  • 您的解析器名称必须是<editor_parser>;

  • 编辑器的JS文件不能是大写的,不能包含任何空格,(Modelio - > modelio_parser.js,UML Designer - > umldesigner_parser.js);

  • 编辑器的类名必须大写(Modelio - > ModelioParser,UML Designer - > UMLDesignerParser)。

关于EditorDetector,它可以检测创建XMI文件的编辑器。要做到这一点,您必须首先找到XMI文件中提到编辑器的位置,然后添加返回编辑器的代码,就像这里一样如果你的编辑器无法检测,将其添加在这里,并指出它的名字一样,它已经为UML设计完成这里

测试

最后,在提交超级解析器之前,您需要做的下一件事就是测试它。因为我们相信测试,但真的喜欢良好的测试(使用BDD),我们的测试是通过Mocha和chai完成的。如果你不知道它是所有关于尚未这样做,我们建议您访问ChaiJS页面,看到一个我们的测试文件来熟悉它。

你应该想知道你应该使用什么形式的测试。答案很简单:这取决于你!无论是应该还是期望(例如RSpec),我们都不会在此强制执行任何特殊规则。但是,我们建议使用Expect,因为我们这样做,并且它应该使测试相当容易理解。

我们只是想让你测试一下“值得考验的”:

  • 接口的方法(公共方法不是接口类!);

  • 您没有义务测试其他方法(私有方法,因为它们在短期/长期内应该是安全且不断变化的),但由于JS中没有实现可见性(据我们所知),您可能需要测试它们(这取决于你)。

名称和文件的一般准则:

  • 您的测试文件名称应遵循与前面提到的相同的规则。例如,如果您的解析器名称是“Modelio”,那么您的测试文件应该是modelio_parser_test.js

  • 用于测试的XMI文件也是如此。如果您的解析器名称是UMLDesigner,那么您的一个测试XMI文件的名称可以是umldesigner_parser_problem_test.[...](文件扩展名不是静态的)。

修改解析器

更改解析器(然后提交更改)非常简单:只需进行更改并对其进行测试(如果需要,创建测试)。

如果需要传递测试(抛出或不抛出异常等),您可以创建一个XMI文件。

如果更改任何名称,请不要忘记修改编辑器检测器

删除解析器

删除解析器是一件非常容易的事情。首先,从编辑器(editors/editors.js)中删除它,然后从EditorDetector(editors/editor_detector.js)中删除它最后,只需删除解析器文件和为其创建的测试。

如果删除任何解析器,请不要忘记修改编辑器检测器


附件

以下是此项目支持的类型:

SQLMongoDB的卡桑德拉验证
必需的,最小长度,最大长度,模式
整数整数整数必需的,最小的,最大的
必需的,最小的,最大的
BigDecimal的BigDecimal的BigDecimal的必需的,最小的,最大的
浮动浮动浮动必需的,最小的,最大的
必需的,最小的,最大的
枚举枚举
需要
布尔布尔布尔需要
LOCALDATE的LOCALDATE的
需要


日期需要
ZonedDateTimeZonedDateTime
需要


UUID需要
斑点斑点
必需,minbytes,maxbytes
AnyBlobAnyBlob
必需,minbytes,maxbytes
ImageBlobImageBlob
必需,minbytes,maxbytes
TextBlobTextBlob
必需,minbytes,maxbytes



J


提交
查看更多评论
没有更多评论