【发布时间】:2021-11-28 18:20:59
【问题描述】:
我在Visual Paradigm software 中创建了两个简单的类A 和B,这样在这两个类之间就有一个COMPOSITION。但是,生成的代码(在 Java 中)与 OR 相同,但没有这两个类之间的关联。换句话说,如果A类和B类之间存在组合,则生成的代码与我删除A类和B类之间的组合时相同。也就是说,generated code中不考虑类之间的组合视觉范式。 解决办法是什么?
编辑:应@Christophe 的要求,我添加了一个测试示例项目的照片(类图),以及Visual Paradigm 生成的两个Java 类,在这两种情况下(与并且没有两个类之间的组合关系)生成的代码完全相同。
Visual Paradigm 生成的代码:
public class Class {
private int attribute;
public void operation() {
// TODO - implement Class.operation
throw new UnsupportedOperationException();
}
}
public class Class2 {
private int attribute;
public void operation() {
// TODO - implement Class2.operation
throw new UnsupportedOperationException();
}
}
P.S. 我用 IBM Rational Rhapsody 试了一下,效果更好。也就是说,它在代码中更详细地生成了模型的特征。查看下面 IBM Rational Rhapsody 生成的代码,并与 Visual Paradigm 生成的代码进行比较:
由 IBM Rational Rhapsody 生成的代码:
package Default;
//----------------------------------------------------------------------------
// Default/class_0.java
//----------------------------------------------------------------------------
//## package Default
//## class class_0
public class class_0 {
protected int attribute_0; //## attribute attribute_0
protected class_1 itsClass_1; //## link itsClass_1
// Constructors
//## auto_generated
public class_0() {
initRelations();
}
//## operation Operation_1()
public void Operation_1() {
//#[ operation Operation_1()
//#]
}
//## auto_generated
public int getAttribute_0() {
return attribute_0;
}
//## auto_generated
public void setAttribute_0(int p_attribute_0) {
attribute_0 = p_attribute_0;
}
//## auto_generated
public class_1 getItsClass_1() {
return itsClass_1;
}
//## auto_generated
public void __setItsClass_1(class_1 p_class_1) {
itsClass_1 = p_class_1;
}
//## auto_generated
public void _setItsClass_1(class_1 p_class_1) {
if(itsClass_1 != null)
{
itsClass_1.__setItsClass_0(null);
}
__setItsClass_1(p_class_1);
}
//## auto_generated
public class_1 newItsClass_1() {
itsClass_1 = new class_1();
itsClass_1._setItsClass_0(this);
return itsClass_1;
}
//## auto_generated
public void deleteItsClass_1() {
itsClass_1.__setItsClass_0(null);
itsClass_1=null;
}
//## auto_generated
protected void initRelations() {
itsClass_1 = newItsClass_1();
}
}
/*********************************************************************
File Path : DefaultComponent/DefaultConfig/Default/class_0.java
*********************************************************************/
二等代号:
package Default;
//----------------------------------------------------------------------------
// Default/class_1.java
//----------------------------------------------------------------------------
//## package Default
//## class class_1
public class class_1 {
protected int attribute_0; //## attribute attribute_0
protected class_0 itsClass_0; //## link itsClass_0
// Constructors
//## auto_generated
public class_1() {
}
//## operation Operation_1()
public void Operation_1() {
//#[ operation Operation_1()
//#]
}
//## auto_generated
public int getAttribute_0() {
return attribute_0;
}
//## auto_generated
public void setAttribute_0(int p_attribute_0) {
attribute_0 = p_attribute_0;
}
//## auto_generated
public class_0 getItsClass_0() {
return itsClass_0;
}
//## auto_generated
public void __setItsClass_0(class_0 p_class_0) {
itsClass_0 = p_class_0;
}
//## auto_generated
public void _setItsClass_0(class_0 p_class_0) {
if(itsClass_0 != null)
{
itsClass_0.__setItsClass_1(null);
}
__setItsClass_0(p_class_0);
}
//## auto_generated
public void setItsClass_0(class_0 p_class_0) {
if(p_class_0 != null)
{
p_class_0._setItsClass_1(this);
}
_setItsClass_0(p_class_0);
}
//## auto_generated
public void _clearItsClass_0() {
itsClass_0 = null;
}
}
/*********************************************************************
File Path : DefaultComponent/DefaultConfig/Default/class_1.java
*********************************************************************/
如您所见,IBM 生成的代码还包括关联(组合)和其他功能。
这是IBM Rational Rhapsody生成的上述代码的类图:
【问题讨论】:
-
您需要知道复合聚合只是一个运行时信息,因此可以确定所有者在复合死亡时将其销毁。
-
能否请您展示两个有组合和无组合的图表,以便我们可以看到设置(多重性、可导航性等)和生成的单一源代码。您是否还可以偶然验证它不是相同的代码,例如因为您的编辑器在生成期间阻止了文件的更新?
-
@Christophe,完成。
-
@Questioner 现在很清楚,为什么它不能按预期工作 ;-)
-
您没有将角色名或多重性添加到您的 Visual Paradigm 模型中(您在 IBM 模型中这样做了)。我可以想象它在生成代码时会起作用。
标签: uml code-generation class-diagram rhapsody visual-paradigm