写点什么

REST 与旅行商问题的设计

  • 2013 年 9 月 03 日
  • 本文字数:1382 字

    阅读完需:约 5 分钟

最近,Mark Baker 在推特上对 Github 上的某个 Nokia REST API 项目发了条帖子:

尤其值得关注的是文中的这么一段话:

我们注意到的最大优点是,API 它本身就成为了描述 API 的文档

  • 如果没有 HATEOAS(超媒体即应用状态引擎),开发者必需获取数据,查找文档,然后才能明白如何发送下一条请求。
  • 有了 HATEOAS,开发者就能明白接下来能够做什么。

来自 CapGemini 的 Steve Jones 在他最近的一篇博客中专门对此进行了评论:

以上任何一条观点都让我忍不住要炮轰你。我是文档的忠实粉丝,也是设计的忠实粉丝。我所不敢苟同的是,有些家伙总把设计的过程看成一系列的抽象步骤,而把下一步当作唯一重要的事。

Steve 之前也提到过,他相信如今的 IT 界推崇技术而冷落思考,他表示这篇关于 Nokia 的文字在某种程度上再次印证了这一观点:思考及设计已死,或正在 IT 界消亡。他认为有些人不再重视设计的价值,并不断地削弱其在开发过程中的重要性。

让我们说清楚些,有着详细的文档非常重要。而以下两种情况都是糟糕的:

  1. 必须等到其他人创建了应用之后,我才可以着手打造一个客户端。
  2. 当前的文档看起来就像是“错综复杂的曲折通道”,你顶多只能看到下一步。

按照 Steve 所说,当前的趋势是以代码为核心,而非以设计为核心,尤其体现于 REST 和 HATEOAS 方面。如果服务能提供文档化的 API,那就使得设计者不仅能够设定他们所想要的结果,而且还能够明确他们如何完成目标,这一点在服务的实现还没有完成之前体现得尤其明显。Steve 表示,按照之前 Mark 所说的 REST 工作方式,设计者将不得不在 API、代码和伪设计间不断切换,无论如何,这至少是一种不太有效率的方式。基于他在当前各公司里的所见所闻,他表示当前的趋势正在妨碍 IT 界的发展,并影响到了 REST 及其它解决方案的维护。

这是我对 REST 的抗议之一,即在功能实现前缺乏事先设计工作。如果我的客户端和服务端是各自独立的团队,我可不希望开展一个瀑布式的项目,先完成服务端,再开始客户端工作。如果参与双方是独立的公司,我希望能够看出问题出自哪一方,而不是进入这种恶性循环:“你要的东西就在响应里”或是“这东西怎么和昨天不一样”,诸如此类。换句话说,我希望看到大家能计划好结果的呈现。

不过,Steve 也并不反对使用 REST 作为实现方式。他只是相信当前他所看到的方式(例如 Nokia API)无助于重要的设计阶段,并且会最终引导至一种旅行商问题的解决方式:

如果我不清楚完成整个旅行的路线,而只是基于我当前所处的位置所能看到的最快路线作出决定,那我实际上并没有看到一个贯穿始终的有效实现,而只是为下一步的实现选择了最简单的方式。

在 Steve 的帖子下有如下一条留言,为这次讨论加入了一些观点:

我也在公开的 API 中看到了类似的现象发生,无论是 REST 或是类库等等。开发者已经普遍拥护以极少的通信实现功能的这种(非常好的)观点。但事情在不断的迭代中出现了变化,出于某些原因,开发者认为事先的设计并不重要,甚至是有害的。对于 API 之下的底层工作,选择渐进演化的设计是能够接受的,但公开的 API 应该从一开始就是比较准确的。它可以以某些方式进行演化(例如扩展),但对它的重构会导致用户不该有的负担。

Steve 也呼吁 REST 应该有一个文档化 RESTful API 的标准实践,同时最好能提供一个测试环境。另一位留言者则指出,不要仅仅依赖于HATEOAS。

查看英文原文: REST and the Travelling Salesman Design

2013 年 9 月 03 日 03:062181
用户头像

发布了 428 篇内容, 共 157.0 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

web技术分享| 白板SDK之函数和方程式的运用

anyRTC开发者

前端 音视频 视频会议 白板 web技术分享

一个cpp协程库的前世今生(二十)外部调度

SkyFire

c++ cocpp

谈A股投资策略--《香帅中国财富报告》摘录(5/100)

hackstoic

投资

从零开发区块链应用(四)--自定义业务错误信息

看见月亮的人

(1-15/15) 预训练模型+微调范式下如何做到文本数据安全

mtfelix

300天创作 2022Y300P

1月月更|推荐学java——Spring集成MyBatis

逆锋起笔

mybatis ssm Spring Framework spring aop spring+mybatis

2022AJAX常见面试题分享

编程江湖

ajax

Spring都在用的技术,你确定不过来看看?1️⃣

XiaoLin_Java

1月日更

社区知识库|常见问答 FAQ 集合第 3 期:Topic 数量、Broker 设置等相关问题

Apache Pulsar

分布式 云原生 Apache Pulsar 开源社区 消息中间件

Tcp网络模型

你?

只有天空才是你的极限,我们热爱探索的过程并沉浸其中丨图数据库 TiMatch 团队访谈

PingCAP

HarmonyOS工程【鸿蒙开发02】

坚果

鸿蒙开发 1 月月更

博文推荐|深入解析Apache BookKeeper 系列:第一篇 — 架构原理

Apache Pulsar

开源 架构 云原生 中间件 Apache Pulsar

SIG技术直播来了!技术专家教你,如何使用 iLogtail 采集可观测数据?

OpenAnolis小助手

Linux 开源 数据 直播 采集

HTTP跨域小结

wong

nginx HTTP cros

低代码实现探索(二十四)业务的领域可视化构思

Geek_e1f2dc

博文推荐|Apache Pulsar: 统一消息流平台

Apache Pulsar

开源 云原生 broker Apache Pulsar 消息中间件

使用 google_breakpad 分析 Electron 崩溃日志文件

编程三昧

Electron 1 月月更 google_breakpad

从零开发区块链应用(二)--mysql安装及数据库表的安装创建

看见月亮的人

鸿蒙开发初体验【鸿蒙01】

坚果

鸿蒙 1 月月更

社区知识库|常见问答 FAQ 集合第 2 期:Topic 配置、ACK 等问题的解决

Apache Pulsar

架构 云原生 Apache Pulsar 开源社区 消息中间件

ReactNative进阶(二十四):react-native-scrollable-tab-view 标签导航器组件详解

No Silver Bullet

1月月更 ReactNative 标签导航

模块 5 作业

miliving

Go 语言快速入门指南:Go 结构体

宇宙之一粟

Go 语言 结构体 1月月更 1 月月更

设计模式【11】-- 搞定组合模式

秦怀杂货店

Java 组合模式

Spring中部署Activiti流程定义的三种姿势

华为云开发者社区

spring 工作流 Activiti流程 Activiti框架 Activiti Explorer

从零开发区块链应用(一)--golang配置文件管理工具viper

看见月亮的人

golang 区块链

从零开发区块链应用(三)--mysql初始化及gorm框架使用

看见月亮的人

REST与旅行商问题的设计-InfoQ