将 UML 类关联“1 到 n”转换为 java 代码

Posted

技术标签:

【中文标题】将 UML 类关联“1 到 n”转换为 java 代码【英文标题】:Convert UML class association "1 to n" to java code 【发布时间】:2019-06-12 19:29:19 【问题描述】:

我必须做从 UML 类图到 java 代码的逆向工程。这是一个例子:

如您所见,一个 SCSIController 可以有 1..4 个 DiskDrive。我可以用这种方式在java中表示它吗?

public class SCSIController extends Controller
    private List disks;

    public SCSIController()
        disks=new ArrayList();
    

    public void addDisk(DiskDrive d)
        if(disks.size()<4 && !disks.contains(d))
            disks.add(d);
            ………
            ………
        else
             ……… //do something else
    

在将 DiskDrive 添加到 SCSIController 之前,我检查 SCSIController 在其磁盘列表中的 DiskDrive 是否少于 4 个。这是编码这种 1 到 n 关联的正确方法吗?

【问题讨论】:

既然您预先知道实际数字,也许数组会更容易。 DiskDrive 驱动器 = new DiskDrive[4]; 如果我使用数组,是否需要一个计数器来知道数组中有多少有效元素? 你不能做 myArray.add(...),所以当添加一个元素时,你需要知道将它放入什么索引。 如果你想使用数组数据结构,你可以添加一个私有静态变量并在 addDisk 方法中增加它。但是,我会选择 HashSet 数据结构,因为原则上它不接受重复。其次,你可以用 4 个元素初始化这个集合(HashSet(4)),性能第一:-) 次要问题——从技术上讲,这是正向工程;逆向工程将获取 Java 源代码并从中提取模型。这些术语来自模型驱动的软件开发,这是一种构建模型并从中生成(正向工程)源代码的方法。 【参考方案1】:

基本上你是对的。但是,您的多重性不需要唯一性

虽然这很有意义 :-) 严格遵守 UML 规范,您可以在代码中省略 &amp;&amp; !disks.contains(d))。或者您添加如上所示的类型。 (或者可能只是假设人们能够以正确的方式识别出来。)

旁注:我认为 SCSIController 也可以不连接驱动器。您的 UML 显示 1..4,因此您至少需要一个驱动器,这会使您的代码在这方面出错。

【讨论】:

你认为我可以使用构造函数 public SCSIController(DiskDrive d)disks=new ArrayList();disks.add(d); 解决吗? 这将是一个解决方案。从实践经验来看,我会与 UML 作者争论它应该是0..4

以上是关于将 UML 类关联“1 到 n”转换为 java 代码的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 项目生成 UML 类图 [关闭]

UML中的类图关系

UML类图(下):关联聚合组合依赖

UML

uml类关系常见图标的含义

UML用例图、类图