后端开发完接口才给接口定义, 是常规操作吗?

2019-04-18 22:36:53 +08:00
 Chingim

最近加入了一个 1000 多人的中型公司, 在做项目的过程中, 后端不愿意先协商接口定义, 坚持等他开发完后才给接口文档, 理由是先给接口文档, 实现的过程中难免有变动, 改动起来很麻烦.

而作为前端, 我的理由是, 产品需求文档以及设计稿已经具备的情况下, 先约定接口定义, 前后端可以并行开发, 提高效率.

几番交涉之后还是没有达成一致, 现在是他开发一个接口, 给一个接口的文档.

之前就职的小公司是开发前给接口定义, 所有人评审接口之后再开发的. 我觉得效率很高, 定义好的接口, 开发过程中的改动也只是简单的增减, 不会有很大的变化.

是公司规模造成的开发流程差异吗? 请朋友们说说

17860 次点击
所在节点    程序员
143 条回复
rockagen
2019-04-19 12:42:05 +08:00
前端还是图样图森破,对一个 http 业务请求到后端的复杂度一无所知,按你们的公司的人数来看的话,内部系统应该是解耦合的,后端拿到需求是要去其他部门沟通 RPC 接口的吧,只能说后端能先实现大体流程,保证业务能跑通的同时输出接口,细节部分放后面去优化。好了,我要上台拿衣服去了。
lihongjie0209
2019-04-19 12:42:26 +08:00
@reus 就一句话 多个接口怎么保证事务?
后端把 post 拆分为 post1 post2 post3, 前端怎么做事务?
lihongjie0209
2019-04-19 12:53:34 +08:00
@reus 不好意思, 我们多端还真是多个接口的, 我们只需要保证核心的领域逻辑不变, 适配任何端都是可以的。

至于你说的 web 和页面耦合, 我这套接口就是给 web 页面做的, 只要由这种需求,那么我也会把 xxx 前 返回给前端, 因为类似小程序你要改 UI 还需要重新发布。
lihongjie0209
2019-04-19 12:54:46 +08:00
@Chingim 套一个 DTO 的事情
reus
2019-04-19 13:01:26 +08:00
@lihongjie0209 谁和你说要这样拆了?事务当然是一个接口啊。

你钱多或者接口少,当然可以一种终端一套接口。后端完全没有文档的不也有么。
xuanbg
2019-04-19 13:07:39 +08:00
当然应该先定文档再来按文档实现咯,你们的后端太菜,缺少自信。
sichuyoudang312
2019-04-19 13:07:46 +08:00
同 23 楼
reus
2019-04-19 13:08:43 +08:00
@lihongjie0209 “套一个 DTO 的事情”,说得轻松,假如有上百种类型,每个类型平均 10 个字段好了,那就是上千个,一个个手工适配?本来不需要干这种活的,就因为后端不肯先约定接口,就要做无谓的工作。
lihongjie0209
2019-04-19 13:14:00 +08:00
@reus 那用户端的和后台管理的对于 事务 X 的定义是一样的吗?

接口:

/api/doX


前端用户执行之后需要发送短信通知


后台管理执行之后不需要


一个接口如何实现这两个功能?
lihongjie0209
2019-04-19 13:14:55 +08:00
@reus 代码生成了解一下, 本来把数据库的结构暴露给前端就是一个很 sb 的事情
alakey1989
2019-04-19 13:24:57 +08:00
@Cbdy 可爱
Chingim
2019-04-19 13:27:22 +08:00
@lihongjie0209 你太理想了,接口字段名称 /类型和数据库耦合是常见的(虽然很不合理)

曾经沟通过接口字段的语义化,被“数据库里就是这么存的“搪塞过去了


@rockagen 接口是对外的服务,应该隐藏所有内部的复杂性不是吗?如果因为技术不可行,那在产品评审阶段就砍掉需求了。如果有调研的需要,那这部分前后端都可以暂停开发这部分功能。其余部分的接口还是可以先协商的吧?
kulove
2019-04-19 13:28:27 +08:00
开发完再给接口定义,不然难免会有改动且会有考虑不周的地方。
应该是后端对照产品原型开发,同时 UI 设计,基本 UI 图给到前端的时候后端接口也开发完了。
Chingim
2019-04-19 13:32:28 +08:00
@kulove 那如果开发完发现对需求的理解有偏差呢,那岂不是推倒重来。开发前协商接口,其实就是统一了对需求的理解,双方都有照亮认知盲区的机会
lihongjie0209
2019-04-19 13:34:07 +08:00
@Chingim 字段名称和我说的数据库结构是两回事

数据库结构是你的表结构是怎么设计的

如果把表结构对于的实体类直接返回给前端, 那么前端拿到的数据会有很多冗余,并且嵌套层级非常深


我一般的做法就是按照 UI 图单独定义一个 Response 类,返回一个扁平的对象,这样做的好处
1. 网络传输的数据少
2. 客户端只依赖于 Response, 不依赖于我的数据库结构
3. 前端写起来简单一点
reus
2019-04-19 13:34:08 +08:00
@lihongjie0209 你这个接口的逻辑,可以用一句话概括:doX,然后根据条件判断是否需要发通知。一句话能概括,那当然能一个接口实现,加个条件判断而已啊。前端有的用户想发短信,有的不想发,你也拆两种接口?有的用户想发短信,有的用户想发邮件,你也拆两种接口?这是一个功能,不是两个功能。

我觉得你根本就没有理解,我说的是接口的参数和返回,从来没有说“数据库的结构”,接口字段和数据库字段,不是必须对应的。代码生成有什么用?你前端用了 gender,结果后端接口用了 sex,代码生成怎么直到这两个字段是对应的?还不是要一个个对。
kulove
2019-04-19 13:36:08 +08:00
@Chingim 肯定是前后端都开会过了产品需求再开发,开发过程中发现逻辑 bug 及时反馈。
lihongjie0209
2019-04-19 13:36:17 +08:00
@reus
那安卓用户要推送消息并且同步记录到数据分析平台怎么实现?
你这个接口的职责有多少?
依赖关系有多复杂?
单一职责原则忘记了?
reus
2019-04-19 13:38:10 +08:00
@lihongjie0209 所谓的“给接口定义”,就是你把 Response 类的定义写出来之后,就给前端看,让他知道这个对象长什么样,就这么简单,后面你再实现。这样前端后端就可以达到题主说的“并行开发”。
kulove
2019-04-19 13:38:23 +08:00
事实上,开发完成后给接口文档并不怎么会产生偏差,如果经常有很大偏差,要么是默契度不够,磨合一段时间就好了,要么就是太菜。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556593

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX