2017-07-10 54 views
1

我想了解uml合成到代码的转换。 我有三个代码狗有内存的例子的问题。这三个例子可以被认为是一个组成(uml含义的组成)?试图将uml合成转换成代码[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 
    } 
} 

这是进一步组合物?

+0

除了您还有一个关联之外,您的最后一个示例基本上没有区别。请先尝试理解答案。 –

回答

2

是的;所有的例子在对于相同的组合物:

class Dog { 
    private Memory variable; 
} 

这相当于

enter image description here

创建狗的方式/内存在这里无关紧要的类之间的连接,这总是最终同样的。 (组成为约结构;创建它的方式是关于行为。)


关于例如临时存储存储器实例:

这将最有可能由编译器的示例,而不临时变量进行优化,但更有趣的问题将是如果你保留参考文献;在这种情况下,挡块内存关系将不再是(UML)的复合凝聚,但在最好的任一相关联或共享的聚集(也What is the difference between association, aggregation and composition?见)


关于最后一个例子:这很好,只要如Thomas所解释的那样,您坚持生命周期管理。

+0

似乎你在此期间添加了缺失的点:-)无论如何,我会留下我的答案(或附录),但是这会得到最高票数。 –

+0

我在输入时看到了您的答案,但您仍然在更详细地解释它。 –

0

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

在UML图中显示一个组合聚集,告诉编码器要小心,一旦主对象死亡,没有引用留给组合,并且内存管理也会将它带入比特严重。就数据库实现而言,它是需要设置的外键约束。 RDBMS将删除其主人被删除时的汇总(如果程序员/ DBA已为复合汇总设置了正确的限制:ON DELETE CASCADE)。

+0

只有在数据库开发人员已经定义了ON DELETE CASCADE规则时,您才会声明“一个RDBMS将删除它们的主集合时删除集合”,对应于不可分离组件的情况(请参阅https://stackoverflow.com/a/35214676/2795909) –

+0

@GerdWagner你可能是对的(我不是DBA)。重点在于之前的2个句子(这意味着你需要ON DELETE CASCADE)。 –