创建类图以模拟MVC应用程序

时间:2010-11-03 19:14:03

标签: ruby-on-rails model-view-controller uml class-diagram

我正在创建一个使用Ruby on Rails作为应用程序服务器并将Java客户端作为前端的库存系统。

项目的一部分要求我们创建一个集成的类图(包含所有类并显示关系的类图)。设计类的方式以及我们之前教过的内容是使用边界 - 实体 - 控制器(BCE)模式来创建适当的类,但是,因为我们使用的是Rails,它使用的是一个MVC架构,它们直接冲突,因为两个模式之间没有1:1的相关性,特别是考虑到我们案例中的“视图”只是XML,因此视图中没有类图和 Boundary 类共享控制器的输入和视图的输出

到目前为止,我们的类图仅包含与Rails相关的类(因为客户端类主要只是UI)。这是我们到目前为止所做的结果(忽略了我们有一百万个getter和setter的事实 - 这是我们实际上不会以这种方式实现的项目的要求;我们将使用{{ 1}}): nothing to see here....

那么,我们是否走在正确的轨道上?有什么要添加/编辑/移动的吗?我们究竟如何正确建模我们将要使用的内置ActiveRecord验证器方法(例如attr_accessor)?

非常感谢任何帮助!感谢。

2 个答案:

答案 0 :(得分:0)

看起来你有几个限制。如果我理解正确,您在分析中使用BCE,在体系结构中使用MVC。在RUP中,有两种用于这些目的的模型 - 分析模型和设计模型 - 都通过类图表示。因此,如果您想在一个怪异的图表中显示您使用BCE方法以及MVC架构,您可以从分析中绘制边界,控件和实体,并根据设计的RoR绘制解决方案类,并使用依赖关系将它们连接到{ {1}}刻板印象。

我不完全确定在RoR中如何实现验证方法,我的猜测是,当你在模型类定义中调用validates ...方法时,通过使用新的私有方法进行元编程来增强特定的模型类,作为验证阶段的回调。我真的不确定这一点,但如果它是真的并且涉及元编程,那么你就有问题了。 AFAIK,你可以绘制图表,它会在添加方法之后显示类(类似于类级别的对象图......),或者你可以通过包合并对元模式进行建模,这也不容易。

答案 1 :(得分:0)

您已经正确分析了conflict between BCE and MVC。因此,让我们尝试映射您的类:

  • EmployeeStoreProductLocation显然是«entity»
  • EmployeeControllerStoreControllerProductControllerLocationController显然是«control»,对应于各个实体的simpla管理。
  • ActiveRecord并不是真正的实体。这表明您不再处于分析模型中,而已处于更加完善的设计模型中。但是,您仍然可以使用《实体》,因为此类仅有助于实现它们。
  • ManagerReceiver对于我正确分类来说有些模棱两可。但是,如果应该假设Employee扮演特殊角色,则最好使用组合而不是继承,因为Employee可能以Employee开始,然后一天是{ {1}},之后为receiver。通用化/专业化关系不允许这种灵活性:如果创建了员工,则一生都是经理或接管人。

还不清楚的是,您的manager是否真的与用例相对应,并且确实在贡献类之间进行了协调:

  • 用例通常由动词来描述,例如用XxxController代替Maintain employee records
  • 用例可能需要访问多个实体。例如,维护员工记录的一部分当然是将员工分配到商店。由于控制器将负责协调所有对象之间的关系,因此它还应访问商店,因为它需要确保分配给员工的商店确实存在并且处于允许分配的状态(例如,不在状态“ StoreShutDownDefinitively”中) ”)。而且在您当前的图中绝对不清楚。

对于参与者(用户或远程系统)和用例之间的每个链接,原则上都应该期望EmployeeController。仅仅创建XML是不够的:您需要将XML发送到另一个系统,或者在屏幕上显示XML,并在需要时进行一些滚动。也许您可能不得不对请求做出反应或让用户有机会查询另一条记录:

  • 在分析模型中,«边界»类的数量与链接的参与者一样多。
  • 但是在设计模型中,您可以决定将多个边界重新组合到一个涵盖所有边界的类中。但是您至少需要一个边界类别。
  • 我不知道RoR,但是如果我对diagram in that article的理解很好,则您的边界将与视图和路线相对应。在经典MVC中,您还需要将控制器置于边界内。但是,仔细阅读本文的细节,我会觉得RoR «boundary»实际上更接近用例(即«control»)而不是MVC控制器。