大家前后端规范是怎么制定的呢?

2018-04-11 09:08:03 +08:00
 wojfsdj

比如使用 JSON 格式,那么怎么有效的表示空数据呢? 空字符串是返回 null, 还是"" ,数字是返回 null,还是 0 呢,集合是[],还是 null?

其他方面还有哪些是需要前后端一些协商规范的呢?希望大家指点一二

12034 次点击
所在节点    程序员
68 条回复
BearD01001
2018-04-11 10:02:54 +08:00
@v2410117 我一般遇到这种情况都会直接在群里怼后端,文档定义不规范开发成品不规范,接口对接起来烦的一批!🙂
BearD01001
2018-04-11 10:04:43 +08:00
@v2410117 不过我们公司接口定义文档是由需求人员写的,群里吼出来!让需求跟接口开发内撕去!
janus77
2018-04-11 10:09:10 +08:00
通过与测试撕逼的经验总结,不能靠规范,要靠自己
我认为「你不能判断下吗」暴露的其实是撒手不管的无责任感
v2410117
2018-04-11 10:16:46 +08:00
@BearD01001 自家的文档还是很规范,专人负责,后端也不会这样搞,关键是之前弄的都是些外包,要的是速度,后端也啥都不管,文档乱写,你怼他,他就觉得“你自己加个 if 判断一下不就完事了”,感觉这事根本就不是后端的事,就是我们前台偷懒不想搞才叫他弄似的,后端都是大佬,觉得我们就是画界面的(个例,不范围攻击,我只表达我遇到的个人情况,勿喷)
stach
2018-04-11 10:18:22 +08:00
我是后端,我的原则是:
数据库表的设计,除了 datetime 可以为 null,都采用默认值,不允许为 null ;
联表查询的时候,确实没有数据,那就是 null ;
在使用 id 的时候,因为 id 从 0 开始,如果要用一个数字表示全部,就用 -1 或者 null 来表示。

总结来说:数据库尽量不要有 null 的出现,程序中或者应用场景需要就特别定义和处理它。
mhycy
2018-04-11 10:21:35 +08:00
看来楼上各位没碰上连 HTTP 请求参数在内都是拼接出来的后端程序员。。
还强制要求按顺序拼回去验证(然而拼接并没有按规范转义)
bhaltair
2018-04-11 10:27:15 +08:00
空值返回''
netlxl
2018-04-11 10:28:11 +08:00
@gbc123456 再定义个序列化规范:要么序列化所有字段,要么都不序列化 null,举手就能解决掉签名的问题,你非要搞这么容易出错的方案。
@v2410117 如果前端不参与接口定义,就是这种结果。前后端分离开发,最合理的接口设计方式时,需求出需求层面数据模型->后端出设计层面数据模型->前端透彻理解需求层面数据模型并了解设计层面数据模型->前端定义接口->后端找刺->回归定义->前后端同时开发->前后端单独单元测试(前端先用测试桩模拟接口)->继承测试。两个重点:前端定义接口;前端也要了解后台的数据模型。
@BearD01001 建议你去看看阿里 java 开发规范。为了解耦、主动防御、减少重复判断,是否为 null 的判断,应该是消费方 /调用方处理,而不是生产方 /被调用方处理。这个规范不限于接口定义,而是内部编码也要遵守的。
netlxl
2018-04-11 10:30:26 +08:00
@stach 你应该没用过 Hibernate 或者的 ORM 框架,说实话,我最讨厌的就是后端还跟数据库耦合。
stach
2018-04-11 10:33:14 +08:00
@netlxl 没有用过 java 的 ORM,用过很多其他语言的,老兄有什么好的设计直接说,说的太抽象,看不懂。
zjp
2018-04-11 10:33:28 +08:00
@stach 数据库中不推荐使用 null 是因为对 null 值的优化有限吧。
代码层面没有这个问题,还是按着语义来选择 null 或者空字符串。对于集合,Efficient Java 推荐用空集合而不是 null
stach
2018-04-11 10:34:00 +08:00
@netlxl 你直接说每种字段类型怎么定义就可以了,这个和 ORM 没有任何关系。
stach
2018-04-11 10:36:49 +08:00
@zjp null 本身就是个不稳定状态,容易出状况,对于可能出现 null 的都要判断的。
ChefIsAwesome
2018-04-11 10:37:31 +08:00
既然后端会验证,会报错,那么前端还要验证提交的数据吗?
前端需要做个列表页,后端会只把 id 全取出来,再让前端一个一个取详情吗?
不是谁干的活多谁干的活少的问题,也不是怎么设计,能让你代码结构不那么恶心的问题。技术是拿来做产品的,产品是拿来服务用户的。牺牲用户体验的东西都是瞎搞。
stach
2018-04-11 10:37:35 +08:00
@zjp 比如 golang 里面的类型都会强制默认值,我是很喜欢的。
stach
2018-04-11 10:39:57 +08:00
@ChefIsAwesome 该做验证的不能省事,前后端都得做。
列表页你说的这种,我都是把数据加工好给前端的。
jinzhe
2018-04-11 10:54:35 +08:00
作为前端超不喜欢后端给 null,这样渲染的时候还要一个个判断。
v2410117
2018-04-11 10:54:43 +08:00
@netlxl 感谢,学习了!
netlxl
2018-04-11 11:00:16 +08:00
@stach 要说理论都很抽象,我就举个 Java Hibernate 的例子吧。
Java 对象:
class Entity{
Integer intValue = null;
Integer intValueHasDefault = 2;
String stringValue = null;
Decimal decimalValue = null;
Boolean isSuccess = false;
Boolean isHasError = true;
}
默认映射方式下的数据库表:
create table entity(
int_value int default null,
int_value_has_default int default 2,
string_value varchar(255) default null,
decimal_value number default null,
is_success bit/tinyint default 0,
is_has_error bit/tinyint default 1,
)

java 对象这边,默认值是否是 null,完全取决于业务的需要,不用考虑数据库。查询更新数据操作的都是 Java 对象,不是 SQL 语句。
数据库这边,如果 DBA 确定性能上不适合用 null,那么修改数据库和映射关系。

上面这种设计方式,必须要完整 ORM (本例中是 Hibernate )的支持,在国内还不是主流。国内用得多的是半 ORM ( MyBatis ),还没有解开业务开发和数据库开发。
netlxl
2018-04-11 11:04:26 +08:00
@jinzhe 渲染时候的 null 判断应该交给前端框架处理。

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

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

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

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

© 2021 V2EX