确定用例中的参与者

6

我正在从事一个小的业余项目,正在尝试以略微不同的方式进行操作。

我正在构建一个ERP系统,其中包括收银机、产品目录、销售数据库、销售日志(类似于数据库,但用于会计目的)、打印机、支付合作伙伴和购物篮(购物车)。

虽然打印机是硬件设备,但我需要编写更高级别的代码来打印收据。

唯一不需要编程的部分是支付合作伙伴。

我有两个问题。

1)将一堆产品销售给客户的用例是否被命名为“在收银台出售商品”的一个用例,还是应该细分为几个用例,例如“添加产品到购物车”和“完成销售”(将销售日志写入并打印收据)?

2)虽然我正在编写目录、销售数据库、销售日志、购物篮等程序,但我可以将它们视为用例中的参与者吗?或者只有销售人员和支付合作伙伴才是参与者?


我认为使用用例分离会是一个更好的主意。而且我没有清楚地理解你对演员的说明。 - Nivid Dholakia
我希望销售数据库、销售日志、购物篮等成为角色,原因是这样很容易识别演员所扮演的角色,因为我可以在用例图上看到演员。这不容易在这里解释,但与DCI有关——一种新的范式:http://en.wikipedia.org/wiki/Data,_Context,_and_Interaction。 - Ant Kutschera
1
我不确定这是否符合使用案例中的Actor。您能否解释一下为什么它们需要成为Actor?我已经快速浏览了维基百科文章,似乎这些Roles与对象相关联,并且提到领域模型,这听起来像是领域对象。目录、销售数据库、销售日志、购物篮等完全可以作为领域模型中的类进行建模。实际上,在n层样式应用程序中,这将是标准做法。 - James P.
顺便提一下,这是一篇关于Java中DCI的有趣文章:http://www.jroller.com/sebastianKuebeck/entry/object_oriented_programming_2_0 - James P.
我已经写了很多关于DCI的文章 - 我很熟悉它。在DCI中,论点是,首先从用例开始,识别参与者及其扮演的角色,然后角色告诉您在哪里放置系统行为。问题是,当您开始进行分析时,会发现这些对象不是参与者。因此,您最终无法确定角色。用例和实现之间的连接很难建立。但是,如果这些对象也是参与者,则角色识别就很容易了。 - Ant Kutschera
我问过的大多数人都同意,这些对象确实不是演员。因此,在我看来,DCI 在声称系统行为是由演员扮演的角色实现时存在一些问题,因为这些演员并不存在。 - Ant Kutschera
5个回答

3
用例分析看起来很简单,但这个问题暴露了一些内在的复杂性。
每个用例必须对参与者有意义,即它必须代表与系统进行明确定义的交互。每个参与者和用例在谈论系统时也必须有意义,甚至可以使用日常语言。如果你发现定义参与者或用例很困难,那么可能系统上下文不清晰,因此领域模型可能会有所帮助。
用例必须代表一个明确定义的交互,但不一定是完整的交互。在需要同时查看完整和部分交互用例的情况下,可以使用“包含”关系。例如,您可以考虑让用例“购买商品”包括“浏览产品”,“将商品添加到购物车”和“结账<>取消”,每个都对客户有意义。
(我有点困惑您的系统是面向实体还是在线交易;拥有收银机和打印的收据似乎暗示前者,在分析中使用的概念中的购物车则暗示后者。以上假设为在线系统。)
然而,在您的情况下,您正在谈论可能被视为系统本身一部分的参与者。这通常意味着您试图同时定义系统及其子系统,这在您开始分析之前已经形成了(最终的)系统设计的情况下很常见。
然后,您需要将分析分为两个级别。在上层(系统)级别上,非常严格地处理整个系统。在您的情况下,您可能需要参与者“客户”,“支付伙伴”,“职员”(对于实体交易系统),“会计师”(以及可能是“管理员”),以及如上所述的用例加上“更新产品目录”,“审计销售日志”等。
然后,您将系统分解为子系统,并为每个子系统进行单独的分析。这里,子系统可以是彼此的用例中的参与者。例如,“打印收据”本身不是系统级别的有意义的用例,因为它本身不是系统作为一个整体和系统级别参与者之间的交互,但对于打印机子系统来说,它是有意义的,以收银机为参与者。
在开始子系统分解之前,您无需完成系统级别分析,事实上我认为最好同时启动它们 - 尽管这要求分析/设计人员能够快速切换上下文,并且在任何给定时间都要有纪律地工作在哪个上下文中。
所以,在所有这些之后(呼!),我认为您问题的答案是:
  1. 两者都可以,只要每个使用案例对其参与者具有良好定义的(但不一定完整)系统交互意义即可。
  2. 可以,但不是在同一级别上;如果为系统创建一个模型,并为每个子系统创建单独的模型,则可以将子系统用作彼此使用案例中的参与者。

我已经授予了这个赏金,因为从两个层面上看待使用情况对我来说是最有意义的。谢谢。 - Ant Kutschera
与此同时,我还发现了协作使用图表,这可能更适合角色分析。 - Ant Kutschera

1

我认为你需要先退后一步。演员和用例的目的首先是要问:“谁会使用这个系统?”以及“他们为什么会使用它?”你可能会将打印机等识别为演员-实际上,其中一些可能确实是-但你会错过关键点。

根据您的描述,我猜测演员及其用例如下:

  • 演员:客户
    • 主要用例:购买产品。这可能会分解成几个子步骤,例如浏览/比较产品,选择产品(放入购物篮),结算等。还将有支持用例:检查订单状态,退货,投诉等。
  • 演员:帐务职员
    • 用例:大概与检查订单/付款状态有关

当您设计每个用例的流程时,您可能会确定需要与之交互的其他外部组件-例如支付合作伙伴。如果您愿意,可以将这些显示为演员(我个人不喜欢,但纯属个人偏好)。

您还将识别系统中发挥实现 UC 行为作用的其他元素(例如销售数据库等)。 这些是系统的一部分 - 通常不会显示为 Actors。

因此,总之:用例旨在帮助您确定系统的目的以及谁从中获得价值 - 而不是构建内部设计组件。

希望对您有所帮助。


1

首先,不要在这个阶段考虑编程。考虑业务需求是什么。

客户需要:

  • 浏览目录
  • 将商品添加到购物车
  • 结账

系统需要:

  • 显示所请求的产品
  • 完成销售(或不完成)
  • 收集付款
  • 为客户生成销售收据
  • 交付已购买的产品

第一个列表将是您的高级用例,第二个列表将是这些高级用例的一部分或包含在其中。如果用例的某个部分足够复杂(或者只是足够冗长),以至于需要将其放入自己的用例中,则使用包含。隐藏复杂性,就像这样。

至于目录、销售数据库、销售日志、购物篮等是否是参与者 - 参与者与系统(或用例)进行交互。我很难想象目录会与某些东西进行交互。另一方面,客户肯定会与目录进行交互。

一个演员必须在现实世界中是可行的。如果一个系统代表现实世界中的某些东西,那么这个系统可以被视为一个演员。但在现实世界中,目录是惰性的;篮子也是惰性的。销售日志和销售数据库代表纸质记录-它们是惰性的对象而不是演员。
顺便问一下-销售人员是系统吗?

0

用例不是绝对的。你可以有一个模糊的用例,比如“管理用户”(我不确定管理用例是否是一个好的实践,但这是为了举例而已...)在系统的第一次草稿中,然后将其分解成更详细的用例图,沿途完善细节,直到你得出一个基本功能。

至于你的第二个问题,这些听起来像典型的领域对象(要建模为基本类图)。我认为它们不应该被建模为演员,除非它们扮演着积极的角色。演员可以是物理人员,也可以是与你创建的系统交互的其他系统。这些演员可能最终成为所谓的替代类。

更新

通过上面链接的文章, 看起来演员(同义词为player)是用来限定要添加角色的目标对象的。如果这是正确的话,那么这个词就有了不同的含义。

角色是一种特殊的对象,它为另一个对象(演员或播放器)添加行为


0

没有看其他答案的情况下,这是我的回答:

1)销售一堆产品给客户的用例是否应该命名为“在收银台出售物品”,还是应该分成几个用例,比如“将产品添加到购物车”和“完成销售”(这将写入销售日志并打印收据)。

我总是尝试使用用例作为“与系统交互并为参与者带来价值的过程”。 “销售商品”将具有价值。“将产品添加到购物车”将没有价值。

我写“我尝试”,因为通常你会从符合我的定义的好用例开始,但然后你开始添加细节并扩展你的用例...

2)虽然我正在编写目录、销售数据库、销售日志、购物篮等程序,但我可以将它们建模为用例中的参与者吗?或者唯一的参与者是销售人员和支付伙伴吗?

我不仅将演员用于真实人员,还将其用于与您的系统交互的系统。但“数据库”、“日志”等术语告诉我,您似乎想在图表中加入太多细节。

也许一个好的方法是首先考虑创建用例图的原因。

对我来说,大多数时候的原因是我想要对我需要构建的系统有一个初步的印象。然后我使用图表作为主持会议的工具。它有助于找到以下三个问题的答案:

  • 谁将使用该系统?
  • 这些参与者将如何使用该系统?
  • 哪些其他系统正在与新系统进行接口交互?

就是这样。当需要更详细的信息时,我会使用不同的一组图表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接