与 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 服务:
- REST 的统一接口 约束是表示层的一部分。例如,可以配置资源上的 POST 操作所采用的 route,允许它最终调用 Domain 层中对象的某些操作。这个Byte Rot blog by Aliostad很好的解释了传统层架构和REST的细节。
- 在 Larman 的示例中,收银员在 GUI 中单击某处以调用
http://...com/sales - POST request
,最终 GRASP 控制器接收到 makeNewSale()
。 REST 部分 http://...com/sales - POST request
为销售创建新资源,例如 001
并且 makeNewSale()
被发送到 GRASP 控制器对象。
- 系统上不存在会话控制器(在 GRASP 控制器模式中提到),因为 REST 操作在服务器上是无状态的。这意味着系统操作实际上可能需要更多参数来将状态信息传递给服务器,而这在用例中并不明显。例如,
makeNewSale()
可能需要接收和处理身份验证令牌作为参数,因为 :System
没有会话信息。我在 RESTful Authentication 找到了一个相关的问题和答案
所以,假设我到目前为止的理解是正确的,我的问题是:
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
.
Larman 的 SSD 概念面向 RCP 模型(在服务器中有状态),但是 SSD 是否可以轻松地与 REST 哲学相吻合?例如,endSale()
的存在是为了使系统摆脱 enterItem()
调用的循环。在本书的后面,Larman 甚至给出了一个状态图:
我读到 How to manage state in REST 并且似乎必须在需要时注意每个系统操作的传递状态(如上面的身份验证令牌示例中所示),或者 "state" 实际上封装在资源中。我考虑了一下,使用 REST,endSale()
可能会被完全删除。
我这里用了具体的例子,这样回答也能具体一点。
我会尽力回答您的问题,但请记住,这是一个非常有争议的话题..
REST 统一接口确实尊重表示和业务逻辑之间的关注点分离。分离是关于表示层不知道业务逻辑实现的细节,反之亦然,但是隐藏域实体可以做什么(即可用于资源的服务)是没有意义的。您想要隐藏的是如何执行操作。
REST的HATEOAS原则规定资源的表示(域实体的实例)应该封装client/server交互的状态,所以服务应该return 以一种或另一种方式向客户陈述。这一点,以及超媒体的使用(即指向可用服务的链接 - 表示可以在资源上完成的操作,给定其状态)应该很容易映射到您发布的状态图。
让我们继续你的例子:
假设有一个服务 newSale
returning 一个 Sale
对象。必须使用 POST
方法调用此服务。在 Sale
的 hypermedia
部分有 2 个链接,一个指向 addItem
服务(这也是一个 POST
并接受更新版本的 Sale
对象,return 在它被保存后对其进行编辑),以及一个到 endSale
服务(也是一个 POST
),它保存 Sale
并将其标记为 'complete'.最后一项服务不 return 任何资源表示,只有成功保存对象时的 http 响应 OK。
在 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 服务:
- REST 的统一接口 约束是表示层的一部分。例如,可以配置资源上的 POST 操作所采用的 route,允许它最终调用 Domain 层中对象的某些操作。这个Byte Rot blog by Aliostad很好的解释了传统层架构和REST的细节。
- 在 Larman 的示例中,收银员在 GUI 中单击某处以调用
http://...com/sales - POST request
,最终 GRASP 控制器接收到makeNewSale()
。 REST 部分http://...com/sales - POST request
为销售创建新资源,例如001
并且makeNewSale()
被发送到 GRASP 控制器对象。
- 在 Larman 的示例中,收银员在 GUI 中单击某处以调用
- 系统上不存在会话控制器(在 GRASP 控制器模式中提到),因为 REST 操作在服务器上是无状态的。这意味着系统操作实际上可能需要更多参数来将状态信息传递给服务器,而这在用例中并不明显。例如,
makeNewSale()
可能需要接收和处理身份验证令牌作为参数,因为:System
没有会话信息。我在 RESTful Authentication 找到了一个相关的问题和答案
所以,假设我到目前为止的理解是正确的,我的问题是:
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
.Larman 的 SSD 概念面向 RCP 模型(在服务器中有状态),但是 SSD 是否可以轻松地与 REST 哲学相吻合?例如,
endSale()
的存在是为了使系统摆脱enterItem()
调用的循环。在本书的后面,Larman 甚至给出了一个状态图:
我读到 How to manage state in REST 并且似乎必须在需要时注意每个系统操作的传递状态(如上面的身份验证令牌示例中所示),或者 "state" 实际上封装在资源中。我考虑了一下,使用 REST,endSale()
可能会被完全删除。
我这里用了具体的例子,这样回答也能具体一点。
我会尽力回答您的问题,但请记住,这是一个非常有争议的话题..
REST 统一接口确实尊重表示和业务逻辑之间的关注点分离。分离是关于表示层不知道业务逻辑实现的细节,反之亦然,但是隐藏域实体可以做什么(即可用于资源的服务)是没有意义的。您想要隐藏的是如何执行操作。
REST的HATEOAS原则规定资源的表示(域实体的实例)应该封装client/server交互的状态,所以服务应该return 以一种或另一种方式向客户陈述。这一点,以及超媒体的使用(即指向可用服务的链接 - 表示可以在资源上完成的操作,给定其状态)应该很容易映射到您发布的状态图。
让我们继续你的例子:
假设有一个服务 newSale
returning 一个 Sale
对象。必须使用 POST
方法调用此服务。在 Sale
的 hypermedia
部分有 2 个链接,一个指向 addItem
服务(这也是一个 POST
并接受更新版本的 Sale
对象,return 在它被保存后对其进行编辑),以及一个到 endSale
服务(也是一个 POST
),它保存 Sale
并将其标记为 'complete'.最后一项服务不 return 任何资源表示,只有成功保存对象时的 http 响应 OK。