与 REST 和 Larman 的(RCP?)系统操作作斗争

Struggling with REST and Larman's (RCP?) system operations

在 Craig Larman 的书中 Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition),用例被转换为包含系统操作的系统序列图 (SSD)。这是一种首先进行高级设计的方法,可以轻松追踪到需求(用例),然后通过 OO 设计原则在域级别详细说明系统操作来完善它。

我正在尝试使用 RESTful 服务来理解这种方法。问题点似乎在于 资源 无状态操作

这是书中的一个示例,一个具有四个系统操作的 SSD:

SSD 也是表示层(左侧)和领域层(右侧)的抽象。领域层可能还包括应用程序和/或业务逻辑。

在 Larman 的方法中,系统操作(例如,makeNewSale())应该由 GRASP Controller 处理,这是一个 非表示层处理系统操作的对象。

现在,假设我们尝试以这种方式使用 RESTful 服务:

所以,假设我到目前为止的理解是正确的,我的问题是:

  1. REST 的统一接口 约束是否尊重presentation/domain 层分离的松散耦合?起初,它似乎是表示层的细节(就像 Java Swing 中的一个 actionPerformed() 方法)。但困扰我的部分是 http://...com/sales 直接绑定到 Sale(这是一个域)对象。

    另一种表达方式:通过创建 REST 资源和通过统一接口访问它们的 REST 动词,application/business 逻辑不是被放入表示层吗? Larman 的 SSD 方法是关于层的,他明确指出应用程序逻辑不应进入表示层。例如,POST 到 http://...com/sales 创建新的 sales/001 资源并发送 makeNewSale()。第一部分看起来像是业务逻辑。事实上,我的 REST 资源名称遵循我的许多域对象名称,这似乎比我使用 Swing 并且仅从 actionPerformed() 调用 makeNewSale() 时我的表示层(更多)耦合到我的域层JButton.

  2. Larman 的 SSD 概念面向 RCP 模型(在服务器中有状态),但是 SSD 是否可以轻松地与 REST 哲学相吻合?例如,endSale() 的存在是为了使系统摆脱 enterItem() 调用的循环。在本书的后面,Larman 甚至给出了一个状态图:

    我读到 How to manage state in REST 并且似乎必须在需要时注意每个系统操作的传递状态(如上面的身份验证令牌示例中所示),或者 "state" 实际上封装在资源中。我考虑了一下,使用 REST,endSale() 可能会被完全删除。

我这里用了具体的例子,这样回答也能具体一点。

我会尽力回答您的问题,但请记住,这是一个非常有争议的话题..

  1. REST 统一接口确实尊重表示和业务逻辑之间的关注点分离。分离是关于表示层不知道业务逻辑实现的细节,反之亦然,但是隐藏域实体可以做什么(即可用于资源的服务)是没有意义的。您想要隐藏的是如何执行操作。

  2. REST的HATEOAS原则规定资源的表示(域实体的实例)应该封装client/server交互的状态,所以服务应该return 以一种或另一种方式向客户陈述。这一点,以及超媒体的使用(即指向可用服务的链接 - 表示可以在资源上完成的操作,给定其状态)应该很容易映射到您发布的状态图。

让我们继续你的例子:

假设有一个服务 newSale returning 一个 Sale 对象。必须使用 POST 方法调用此服务。在 Salehypermedia 部分有 2 个链接,一个指向 addItem 服务(这也是一个 POST 并接受更新版本的 Sale 对象,return 在它被保存后对其进行编辑),以及一个到 endSale 服务(也是一个 POST),它保存 Sale 并将其标记为 'complete'.最后一项服务不 return 任何资源表示,只有成功保存对象时的 http 响应 OK。