【发布时间】:2015-09-16 14:20:09
【问题描述】:
在 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 操作所采用的 路由,使其最终调用域层中对象的某些操作。这个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 的 统一接口 约束是否尊重表示层/域层分离的松散耦合?起初,它似乎是表示层的一个细节(就像 Java Swing 中的
actionPerformed()方法)。但困扰我的部分是http://...com/sales直接绑定到Sale(这是一个域)对象。
另一种说法:通过创建 REST 资源和 REST 动词通过 Uniform 访问它们接口,应用程序/业务逻辑不是被放入表示层吗? Larman 的 SSD 方法是关于层的,他明确指出应用程序逻辑不应进入表示层。例如,对http://...com/sales的 POST 会创建一个新的sales/001资源并发送makeNewSale()。第一部分似乎是业务逻辑。我的 REST 资源名称遵循我的许多域对象名称这一事实似乎我的表示层(更多)耦合到我的域层,而不是我使用 Swing 并且仅从actionPerformed()上的 @987654348 调用makeNewSale()@。Larman 的 SSD 概念面向 RCP 模型(在服务器中有状态),但 SSD 能否轻松地与 REST 理念相结合?例如,
endSale()的存在是为了使系统脱离enterItem()调用的循环。在本书的后面,Larman 甚至为此提供了一个状态图:
我读到了How to manage state in REST,如果需要,似乎必须注意在每个系统操作上传递状态(如上面的身份验证令牌示例),或者“状态”实际上封装在资源中。我想了想,使用 REST,endSale()可能会被完全删除。
我在这里使用了一个具体的例子,所以答案也可以是具体的。
【问题讨论】:
-
我刚看了Jim Webber's talk at YOW 2011,听到他讨论资源的副作用。他提到了无限数量的资源,我认为这是将它们用作抽象而不是直接访问域对象。在某些情况下,可以直接链接它们;在其他情况下不是(因此有副作用)。对资源的副作用可能只是 Larman 方法中的系统操作。
-
答案stackoverflow.com/a/35708211/1168342非常相关。我应该早点用谷歌搜索 DDD 和 REST。
-
另一件有助于(过渡)的事情是知道 REST 是一种频谱(你不必一路走下去,Larman 的 RPI 就像 Level 0):martinfowler.com/articles/richardsonMaturityModel.html
标签: rest restful-architecture methodology