【问题标题】:Sequence Diagrams and Class Diagrams: Which object should functions be part of?序列图和类图:函数应该属于哪个对象?
【发布时间】:2014-10-13 00:14:16
【问题描述】:

因此,我正在进行涉及序列图的软件工程课程作业。这是其中一件事,它以如此快的速度被覆盖,我有点想填补空白,但不完全确定发生了什么。

无论如何,假设我有对象 A 和对象 B。假设 A 对 B 通电。那么我们将有一个函数“powerOn()”,其中一个箭头指向 A,对吗?

现在,这个函数是 B 的函数还是 A 的函数?我认为这将是 B 的函数,并且 A 调用该函数,因为可能有另一种方式,例如对象 C 来启动 B,并且您肯定不会为每个函数设置单独的函数,您只会让两者都调用 B 上的函数。这样正确吗?

在更一般的术语中,从 A 到 B 的任何函数在这种情况下总是箭头指向的对象的函数吗?

即它们会作为对象 A 或 B 中的函数包含在类图中吗?

【问题讨论】:

    标签: uml class-diagram sequence-diagram


    【解决方案1】:

    A 类知道 B 对象的存在并引用它们这一事实由关联 A->B 显示。

    A 实例可以调用这些 B 实例之一的某些功能这一事实不是由类图显示,而是由更彻底的复合结构图显示。在类图中,您只能通过评论提及它。

    选择的问题:如果使改变B实例状态的函数成为B或A类的一部分,不是UML问题,而是OOP问题。是的,通常最好将函数放入 B 中,以进行封装和隔离,否则您必须允许 A 直接使用 B 的状态,这是不好的 OOP 行为。 (但我们根本不知道您是否在 OOP 中工作,因此不可能说您必​​须这样做)

    【讨论】:

      【解决方案2】:

      关于您的问题:

      那么我们将有一个函数“powerOn()”,其中一个箭头指向 A,对吗?

      是的。

      现在,这个函数是 B 的函数还是 A 的函数?

      B 的函数,但是,将从A 中的函数执行

      您只需调用B 上的函数即可。这是正确的吗?

      每个类都有在B上执行相同功能的代码。

      它们会作为函数包含在对象AB 中吗?

      B

      现在,让我们举一个真实世界的例子。

      让我们创建一个名为 FastFoodVendingMachineClass 的类,就像您的示例中的 B 类。

      让我们创建另一个名为 CatClass 的类,就像您的示例中的 A 类。

      FastFoodVendingMachineClass 类表示自动售货机,它执行多种操作,也称为“方法”。

      (简化)类图:

      ...................................................................
      ....+-----------------------------------------------------------+..
      ....|                          <<class>>                        |..
      ....|                FastFoodVendingMachineClass                |..
      ....+-----------------------------------------------------------+..
      ...................................................................
      

      CatClass 代表一个用户同时执行多个操作,也就是“方法”。

      (简化)类图:

      ...................................................................
      ....+-------------------------------------------------+............
      ....|                    <<class>>                    |............
      ....|                    CatClass                     |............
      ....+-------------------------------------------------+............
      ...................................................................
      

      现在,小猫是一只训练有素的宠物,它饿了,想要吃点东西, 从机器。所以,它从它的主人那里得到钱,然后走到机器前, 插入钱,选择一个按钮,然后得到食物。

      用类描述的对象/主题都执行几种操作, 对自己,或对他人。

      这在序列图中看起来如何?

      序列图:

      ................................................................................
      .............+--------------+..............+-----------------------------+......
      .............|   CatClass   |..............| FastFoodVendingMachineClass |......
      .............+-------+------+..............+--------------+--------------+......
      .....................|....................................|.....................
      ...................+-+-+................................+-+-+...................
      ......<<start>>....|   |................................|   |...................
      ..(*)=============>|   +---+............................|   |...................
      ...................|   |...|............................|   |...................
      ...................|   |...|..<<returns>>...............|   |...................
      ...............+===+   +<--+............................|   |...................
      ..............."...|   |................................|   |...................
      ....GetFood().."...|   |................................|   |...................
      ..............."...|   |..........InsertMoney().........|   |...................
      ...............+==>+   +===============================>+   +---+...............
      ...................|   |................................|   |...|...............
      ...................|   |..........<<returns>>...........|   |...|...............
      ...............+===+   +<-------------------------------+   |<--+...............
      ..............."...|   |................................|   |...................
      .....Insert...."...|   |................................|   |...................
      .....Money....."...|   |.....ReceiveMoney(Price)........|   |...................
      .....(Price)...+==>+   +===============================>+   +---+...............
      ...................|   |................................|   |...|...............
      ...................|   |..........<<returns>>...........|   |...|...............
      ...............+===+   +<-------------------------------+   |<--+...............
      ..............."...|   |................................|   |...................
      .....Select...."...|   |................................|   |...................
      .Fishburguer()."...|   |.....SelectProduct(Option)......|   |.....Product.=.....
      ...............+==>+   +===============================>+   +---+.Release.......
      ...................|   |................................|   |...|.Product.......
      ...................|   |............Product.............|   |...|.(Option)......
      ...............+---+   +<-------------------------------+   |<--+...............
      ..<<returns>>..|...|   |................................|   |...................
      ...............|...|   |..........<<returns>>...........|   |...................
      ...............+-->+   +------------------------------->+   +---+.Change.=......
      ...................|   |................................|   |...|.Return........
      ......<<finish>>...|   |.............Change.............|   |...|.Option()......
      ..(O)<=============|   |<-------------------------------+   |<--+...............
      ...................|   |................................|   |...................
      ...................+-+-+................................+-+-+...................
      .....................|....................................|.....................
      .....................X....................................X.....................
      ................................................................................
      

      还有,更详细的类图:

      ...................................................................
      ....+-------------------------------------------------+............
      ....|                    <<class>>                    |............
      ....|                    CatClass                     |............
      ....+-------------------------------------------------+............
      ....| [+] bool: GetFood();                            |............
      ....| [+] void: InsertMoney(Currency Price);          |............
      ....| [+] void: SelectFishburguer();                  |............
      ....+-------------------------------------------------+............
      ...................................................................
      
      ...................................................................
      ....+-----------------------------------------------------------+..
      ....|                          <<class>>                        |..
      ....|                FastFoodVendingMachineClass                |..
      ....+-----------------------------------------------------------+..
      ....| [+] void: ReceiveMoney(Currency Price);                   |..
      ....| [+] void: SelectProduct(int Option);                      |..
      ....| [+] Product: ReleaseProduct(int Option);                  |..
      ....| [+] void: NotifyEmpty();                                  |..
      ....| [+] Currency: ReturnChange();                             |..
      ....+-----------------------------------------------------------+..
      ...................................................................
      

      比较类图和序列图。请注意,从一个条到另一个条的箭头表示一个对象(“类的实例”)执行另一个对象的方法。

      还要注意,有时,同一个对象可能会从同一个对象调用另一个方法。

      例如,FastFoodVendingMachineClass 类有一个SelectProduct 方法,执行时可能会执行ReleaseProduct 方法。但是,如果, 小猫按下了食物用完的选项?

      SelectProduct 方法将执行类似于NotifyEmpty 方法的东西, 就像在同一台机器上发出“哔”声或打开灯一样。

      我喜欢在序列图中添加一个&amp;lt;&amp;lt;start&amp;gt;&amp;gt; 状态和一个&amp;lt;&amp;lt;finish&amp;gt;&amp;gt; 状态,使图表更清晰,即几个类之间的一系列操作。

      这不是很常见,但是,是有效的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多