3

我需要为一个系统建模,其中将有一个团队,该团队将由在团队中执行角色并分配给他们技能的用户组成。

即A队5人,1人担任组长角色,都担任回复邮件的角色,但有些人有额外的接电话技能

我正在尝试确定如何最好地对此进行建模。

这个问题之前一定已经解决了,有没有关于如何建模的好资源?

编辑:我需要确定允许用户做什么,这可能是因为他们在某个团队中,执行某个角色或被分配了某种技能

4

7 回答 7

2

听起来您可以在这里使用复合模式的变体,至少对于部分问题。您可以从充当超类的 Unit 开始,然后您可以将 Team 作为 Unit 的子类。团队是一个容器,可能包含其他单位。此外,您可以拥有 User 子类 Unit。因此,您可以编写仅以单元为目标的代码,并以相同的方式对待所有团队和用户。然后,您可以创建一些由其他团队组成的复杂团队。

因此,您可以为您需要的每种用户类型或团队类型提供一个类。

如果角色的数量急剧增长并且你最终得到了太多的类(类爆炸),那么你可以应用装饰器模式。因此,您用另一个具有相似接口但不同(或附加)功能的对象包装(装饰)一个对象。

所以你可以有一个 BasicUser 和 AnswerPhoneDecorator。将任何 BasicUser 对象包装在 AnswerPhoneDecorator 中,您就有了一个可以接听电话的用户。

于 2008-10-14T20:24:34.047 回答
2

我在谷歌上搜索了这个,所以带着一粒盐。我发现了这篇关于角色建模和对象的论文。在第 30 页有一个角色模式。希望这对你来说不是一场疯狂的追逐。这是摘要

角色模式允许您设计一个组件,该组件可以在运行时使用新的上下文对象进行扩展,称为角色。根据上下文对象模式使用角色扩展组件。Component对应一个Decorator的Component,一个Role对应一个Context Object。角色扮演组件的状态集成是通过应用属性和策略来实现的。Property 用于定义 Component 的状态空间,Strategy 用于提供 Property 依赖的行为。

于 2008-10-14T11:07:11.707 回答
1

不是我听说过的任何事情,但它很简单,可以通过各种方式解决。

所以有团队、成员、角色和技能。团队只是成员容器,成员具有角色和技能。

这里还有一个小伪给你整个想法:

class Team
    container[Member] members

class Member
    container[Role] roles
    container[Skill] skills

然后根据它们是什么类型的东西以及你的编程语言的能力来实例化或子类化角色和技能。

..另一方面,在实践中,使 Team 类类似于 Role 和 Skill 类可能是有意义的——Member 类的属性。如果您需要找出某个成员可以访问的内容等信息。

于 2008-10-14T10:37:45.137 回答
0

我发现Enterprise Patterns and MDA: Building Better Software with Archetype Patterns and UML中的第 5 章讨论了如何很好地建模关系

于 2009-03-06T09:23:52.847 回答
0

这取决于您要建模的内容。鉴于上面的示例,您是否希望能够找到最适合给定问题的团队成员?

如果是这样的话,那么我会推荐这样的东西:将角色和技能想象为无向图中的顶点。给定的角色(通​​过边缘)与它能够具备的每项技能相关联(假设技能是由角色赋予的,而不仅仅是基于个人)。现在将所有团队成员连接到他们在团队中的任何角色,并将团队成员连接到适当的团队。

该图现在模拟了您的团队、团队成员、他们的角色以及他们应该赋予其角色的技能之间的关联。

现在要将给定的问题映射到团队成员(甚至团队),将问题与您认为需要的每个不同技能(即电子邮件、数据库、Web UI、Web 服务等)联系起来。现在您也可以将问题与这些实体相关联。

我不会介绍您可以使用它运行的每种类型的报告,但这里有一个简单的报告。如果您想找到一个可以解决该问题的人(如果他们存在),我会推荐这样的图遍历:

class Problem
{
  find_problem_solvers()
  {
    var problem_solvers = null
    for each (skill in skills_required)
    {
      var possible_problem_solvers = skill.find_problem_solvers()
      if(problem_solvers == null)
      {
        problem_solvers = new list().add_range(possible_problem_solvers)
      }
      else
      {
        for each problem_solver in problem_solvers:
        {
          if(problem_solver not in possible_problem_solvers)
            problem_solvers.remove(problem_solver)
        }
      }
      //No point continuing if we eliminated everyone!
      if(problem_solvers is empty) break;
     }
     return problem_solvers
   }
 }

正如你在这方面看到的那样,我对其他海报的图案没有太多用处。如果您正在尝试对域安全性或某种不同的业务逻辑进行建模。他们的技术很可能是正确的。

顺便说一下,上面的算法并不是最优的。

于 2008-10-18T00:52:11.573 回答
0

在您的示例中,我至少有 TeamMember BaseClass 和 2 个接口(iEmail 和 iPhone)。任何新的角色都将继承自 TeamMember 类,并根据它可以做什么,实现适当的接口……简而言之,角色将作为继承自 TeamMember 的类来实现,而技能将作为接口来实现。

例如,允许团队负责人拨打电话。然后我会让 TeamLeader 类继承自 TeamMember 并实现 iPhone 接口

温迪

于 2008-10-15T07:20:44.067 回答
0

尽管我相信设计模式是一个很好的工具,但我认为我不会使用任何特定的模式来解决这个问题。相反,我会尝试从不同的角度来处理它。我建议使用一个数据库来存储有关您的团队、团队成员及其角色的数据。现在,数据库并不是我的强项,但我会试一试:
创建一个表格来保存所有团队的所有团队成员。该表应具有属性:名称、角色、团队、技能,分别代表成员的名称和角色、他/她所属的团队以及他/她的技能。
现在,假设您的应用中有以下角色:RoleA(可以接听电话和发送电子邮件),角色B(只能发送电子邮件)和角色 TeamLeader(可以接听电话,发送电子邮件)例如,去开会。角色表将保存您应用程序中的所有角色,属性将是(在这种情况下):名称(角色名称),canAnswerPhone(布尔值,表示具有此角色的用户是否可以接听电话),可以发送电子邮件(布尔值表示他/她是否可以发送电子邮件)等等......
第三张表可以,例如,保存您的应用程序中的所有团队,以及关于他们的各种数据(例如,团队正在进行的项目等....)。
现在,您可以轻松地了解团队中的所有成员,他们可以做什么,改变他们的角色,看看谁是领导者,改变某个角色的作用等等...

我希望这对你有意义。祝您设计应用程序好运!

于 2008-10-15T08:03:30.550 回答