尝试将uml合成翻译成代码[uml]

时间:2017-07-10 08:41:49

标签: java uml composition

我试图理解uml合成到代码中的翻译。 我对Dog有记忆的三个代码示例有疑问。这三个例子可以被认为是一种成分(uml意义上的成分)吗?

示例1

class Memory {
    // CODE
}

class Dog {
    private Memory variable;

    Dog(Memory variable) {
        this.variable = variable;
    }
}

class Factory {
    Dog createDog() {
        Memory memory = new Memory() // memory contains reference to object Memory only moment and after create dog don't use it
        return new Dog(memory);
    }
}

示例2

class Memory {
    // CODE
}

class Dog {
    private Memory variable;

    Dog(Memory variable) {
        this.variable = variable;
    }
}

class Factory {
    Dog createDog() {
        return new Dog(new Memory());
    }
}

示例3

class Memory {
    // CODE
}

class MemoryFactory {
    Memory createMemory() {
        return new Memory();
    }
}

class Dog {
    private Memory variable;

    Dog(MemoryFactory memoryFactory) {
        this.variable = memoryFactory.createMemory();
    }
}

class Factory {
    Dog createDog() {
        MemoryFactory factory = new MemoryFactory()
        return new Dog(factory);
    }
}

一个不同的例子:

class Memory {
    // CODE
}

class Dog {
    private Memory variable;

    Dog() {
        this.variable = new Memory();
        Other other = new Other();
        other.method(variable);
    }
}

class Other {
    void method(Memory memory) {
        // code which don't save reference to memory
    }
}

这是进一步的构成?

2 个答案:

答案 0 :(得分:2)

是;所有例子在组成方面都是相同的:

class Dog {
    private Memory variable;
}

相当于

enter image description here

你创建Dog / Memory的方式与这个类之间的连接无关,它总是最终是相同的。 (构成与结构有关;你创建它的方式与行为有关。)

关于暂存存储实例的示例:

这很可能是由编译器在没有临时变量的情况下优化的,但更有趣的问题是如果保留引用的话。在这种情况下,Dog-Memory关系将不再是(UML)复合聚合,但最多只能是关联或共享聚合(另请参阅What is the difference between association, aggregation and composition?

关于最后一个例子:只要你坚持Thomas所解释的生命周期管理,那就没问题了。

答案 1 :(得分:0)

基本上我同意彼得的回答。但是,与共享聚合(几乎没有语义)相比,组合(或形式上正确的复合聚合)是关于对象的生命周期。所以你确实有一个简单的关联,并显示通常就足够了。根据所需语言的运行时实现方式,Memory对象在Dog对象死亡时将会或不会消失。从实施(直接)中无法看出这一事实。例如。在某些语言中有对象引用计数一个如果你在运行时在其他地方使用Memory对象它将继续存在虽然Dog已经死了。

在UML图中显示复合聚合告诉编码人员注意,一旦主对象死亡,复合没有任何参考,内存管理也会把它带到严重的位置。就数据库实现而言,它是需要设置的外键约束。删除主服务器时,RDBMS将删除聚合(如果程序员/ DBA为复合聚合设置了正确的约束:ON DELETE CASCADE)。