如果在方法中启动或引用了对象,则在类图中关系的类型是什么?

Fou*_*ali 3 c# uml class-diagram

我正在对一个系统进行逆向工程并创建一个类图。

代码类似于以下示例:

class B
{
}

class C
{
}    

class A
{
    C GetC()
    {
       return new C();
    }

    void Foo()
    {
       B b = new B;
       C c = GetC(); // this function returns a reference to an object of type C
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道我是否有这段代码,A和B,A和C类之间是什么关系?

Adr*_*tti 5

假设它是UML类图,那么您就有一个依赖项。来自维基百科(重点是我的):

依赖关系是一种较弱的联系形式,它表示一类依赖于另一类,因为它在某个时间点使用它。如果独立类是依赖类的方法参数变量或局部变量,则一个类依赖于另一类。这与关联不同,关联是依赖类的属性是独立类的实例,有时两个类之间的关系非常弱。它们根本没有使用成员变量来实现。而是可以将它们实现为成员函数参数。

例如:

UML示例

在您的情况下,class A 使用 class B和class C。这是一个依赖,这不是组成因为高亮文本的:bc是(至少在这个例子),那么本地变量之间的关联A,并将它们仅仅是其使用(甚至不弱聚集)。

好吧,老实说-我希望UML纯粹主义者不要怪我太多-我会说使用代替组合,因为(从虚构的示例中猜测)b是完成任务的工具Foo()。如果它被用来(即使局部变量),以使(从外部来看)A一个容器B然后我说的组合物。例如在这种情况下:

class RocketLauncher {
    public void Launch(World world, Location target) {
        AutonomousObject rocket = world.Rocket.Factory.Build(_structure);
        rocket.MoveTo(world, target);
    }

    private static LauncherStructure _structure;
}
Run Code Online (Sandbox Code Playgroud)

即使严格地说Rocket使用 RocketLauncher我倾向于同时定义(LauncherStructureRocket为)组成。从外部的角度来看,a RocketLauncher是由(构造,具有)结构和火箭组成的(即使当前实现将创建委托到最后)。点(IMO)是您要在此图中表示的内容。如果您要描述实现,那么观点就无关紧要了:依赖关系是依赖关系,组合是组合。

如果您要描述更高级别的体系结构,则应将实现细节保留在图表之外,并尝试描述类接口(当然,当实现与抽象体系结构大不相同时,可能会闻到某种错误-在实现或体系结构方面- 原因 - (如果有的话- 必须记录下来)。

  • 请参见突出显示的文本:由于b是**局部变量**,因此不是组成部分。 (3认同)
  • 但是类B是在方法Foo()中启动的,这意味着对象b由类A拥有 (2认同)