ruby-on-rails 创建类图来建模MVC应用程序

pcww981p  于 2023-02-01  发布在  Ruby
关注(0)|答案(2)|浏览(142)

我正在创建一个库存系统,其中Ruby on Rails作为应用服务器,Java客户机作为前端。
项目的一部分要求我们创建一个集成的类图(一个包含所有类并显示关系的类图)。类的设计方式和我们之前学到的是使用 Boundary-Entity-Controller(BCE)模式来创建适当的类,然而,由于我们使用的是使用MVC架构的Rails,它们直接冲突,因为在两个模式之间没有1:1的相关性,特别是考虑到我们案例中的“视图”仅仅是XML,所以没有视图的类图,而 Boundary 类共享控制器的 * 输入 * 和视图的 * 输出 *。
到目前为止,我们的类图只展示了Rails相关的类(因为客户端类大多只是UI),以下是我们到目前为止所做的工作的结果(忽略我们有一百万个getter和setter的事实--这是项目的需求,我们实际上不会以这种方式实现;我们将使用attr_accessor):

那么,我们的思路是否正确?有什么要添加/编辑/移动的吗?我们如何准确地对将要使用的内置ActiveRecord验证器方法(例如validates_numericality_of :price)进行正确建模?
任何帮助都非常感谢!谢谢。

rn0zuynd

rn0zuynd1#

看起来你被赋予了几个约束。如果我理解正确的话,你在分析中使用了BCE,在架构中使用了MVC。在RUP中有两个模型用于这些目的--分析模型和设计模型--都是通过类图来表达的。所以如果你想在一个巨大的图中显示你使用了BCE方法以及MVC架构,你可以画出边界,分析中的控件和实体以及基于RoR的解决方案类,并使用依赖关系将它们与<<trace>>构造型连接起来。
我并不完全确定validate方法是如何在RoR中实现的,我的猜测是,当你在一个模型类定义中调用validate... method时,这个特定的模型类会通过元编程得到增强,这个元编程使用了新的私有方法,它将作为验证阶段的回调函数。我真的不确定这一点,但是如果这是真的,并且涉及到元编程,那么你就有问题了。AFAIK,你可以画一个图来显示添加方法后的类(类似于类级别上的对象图...),或者你可以通过包合并来建模元程序,这也不容易。

vc9ivgsu

vc9ivgsu2#

您已经正确地分析了conflict between BCE and MVC,现在让我们尝试Map您的类:

  • 很明显的是
  • EmployeeControllerStoreControllerProductControllerLocationController显然是«control»,其对应于各个实体的简单管理。
  • ActiveRecord并不是一个真正的实体。这表明您不再处于分析模型中,而是已经处于一个更精细的设计模型中。然后您仍然可以使用“entity”,因为该类只对它们的实现有贡献。
  • ManagerReceiver对于我来说有点模糊,无法正确分类。但是,如果应该表示Employee的特殊角色,则最好使用组合而不是继承,因为Employee可能开始为Employee,然后某一天成为receiver。而后来是manager。泛化/特化关系不允许这种灵活性:如果创建了职员,则该职员在其整个生命周期中将不是“经理”就是“接收人”。

不太清楚的是,您的XxxController是否真的对应于用例,是否真的在贡献类之间进行了协调:

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

最后但并非最不重要的一点是,原则上,对于参与者(用户或远程系统)和用例之间的每个链接,都需要一个«boundary»。您需要将XML发送到另一个系统,或者在屏幕上显示XML,如果需要的话,可以进行一些滚动。并且您可能需要对请求做出React,或者给予用户查询另一个记录的机会:

  • 在一个分析模型中,你将拥有和被链接的参与者一样多的“边界”类。
  • 但是在设计模型中,你可以决定将几个边界重新组合到一个类中,这个类可以覆盖所有的边界,但是你至少需要一个边界类。
  • 我不知道RoR,但是如果我很好地理解diagram in that article,你的边界应该对应于视图和路由。在经典的MVC中,你也应该在边界中有控制器。但是看了这篇文章的细节,我有一个印象,RoR ActionController实际上更接近于用例(即“控制”),而不是MVC控制器。

相关问题