【发布时间】:2011-12-04 19:19:46
【问题描述】:
关联和依赖有什么区别?你能给出代码示例吗? A类和B类是什么关系?
class A
{
B *b;
void f ()
{
b = new B ();
b->f();
delete b;
}
}
【问题讨论】:
标签: uml
关联和依赖有什么区别?你能给出代码示例吗? A类和B类是什么关系?
class A
{
B *b;
void f ()
{
b = new B ();
b->f();
delete b;
}
}
【问题讨论】:
标签: uml
简短的回答是:在 UML 中应该如何表示任何特定的源语言结构并没有严格定义。这将是所讨论语言的标准化 UML 配置文件的一部分,但遗憾的是,这些配置文件很少而且相差甚远。接下来是长答案。
在你的例子中,恐怕我不得不说“都不是”,只是为了难。 A 有一个B 类型的成员变量,所以关系实际上是聚合或组合...或有向关联。在 UML 中,与命名目标角色的直接关联在语义上等价于具有相应名称的属性。
根据经验,如果b 在A 的构造函数中被初始化,则它是一个聚合;如果它也在B 的析构函数(共享生命周期)中被销毁,那么它就是一个组合。如果两者都不适用,则为属性/定向关联。
如果b 不是A 中的成员变量,并且局部变量b 没有被操作(没有调用任何方法),那么我将其表示为依赖关系:A 需要B,但它没有该类型的属性。
但是f()实际上调用了B中定义的方法。对我来说,这使正确的关系成为<<use>>,这是一种更专业的依赖形式。
最后,(无向的)关联是两个类之间最弱的联系形式,正因为如此,我在描述源构造时倾向于不使用它们。当我这样做时,我通常在没有直接的源代码关系时使用它们,但是这两个类仍然存在某种关联。这方面的一个例子可能是,两者负责同一个更大算法的不同部分,但第三类同时使用它们。
【讨论】:
看看我问的这个问题可能会有用:does an association imply a dependency in UML
我的理解是:
协会
public class SchoolClass{
/** This field, of type Bar, represents an association, a conceptual link
* between SchoolClass and Student. (Yes, this should probably be
* a List<Student>, but the array notation is clearer for the explanation)
*/
private Student[] students;
}
依赖关系
public class SchoolClass{
private Timetable classTimetable;
public void generateTimetable(){
/*
* Here, SchoolClass depends on TimetableGenerator to function,
* but this doesn't represent a conceptual relationship. It's more of
* a logical implementation detail.
*/
TimetableGenerator timetableGen = new TimetableGenerator();
/*
* Timetable, however, is an association, as it is a conceptual
* relationship that describes some aspect of the data that the
* class holds (Remember OOP101? Objects consist of data and operations
* upon that data, associations are UMLs way or representing that data)
*/
classTimetable = timetableGen.generateTimetable();
}
}
【讨论】:
如果您想在 A 和 B 之间的关联中查看“代码级别”的差异,那么在 OO 语言中实现 A(或 B 或两者,取决于基数、可导航性......)将包括B 类型的属性。
在依赖项中,A 可能有一个方法,其中一个参数是 B 类型。所以 A 和 B 没有链接,但更改 B 会影响依赖类 A,因为可能 A 方法操作对象的方式B 不再有效(例如,B 更改了方法的签名,这会在 A 类中引发编译错误)
【讨论】:
从 Wiki 获取:依赖是一种较弱的关系形式,它表明一个类依赖于另一个类,因为它在某个时间点使用它。如果后者是前者方法的参数变量或局部变量,则一个类依赖于另一个。这与关联不同,前者的属性是后者的实例。
所以我认为这里的情况是关联,如果B是A的方法的参数变量或局部变量,那么它们是依赖关系。
【讨论】:
依赖项的定义确实非常松散。所以不会有代码表示。
Wiki:依赖关系是一种语义关系,其中对影响或独立建模元素的更改可能会影响依赖建模元素的语义。[1]
来自 OMG 规范:依赖关系是一种关系,表示单个或一组模型元素需要其他模型元素来进行规范或实现。这意味着依赖元素的完整语义在语义上或结构上取决于供应商元素的定义。
【讨论】: