V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gebishushu
V2EX  ›  问与答

比如数据库中的表里的字段, 0 代表男, 1 代表女,返回给前端!

  •  
  •   gebishushu · 2019-12-06 03:35:37 +08:00 · 5034 次点击
    这是一个创建于 1574 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如数据库中的表里的字段,0 代表男,1 代表女,返回给前端
    直接返回男和女好,还是直接返回 0 和 1 好
    我想着是返回男和女后期增加人妖 前端不需要匹配了,如果返回 0 和 1 的话,后期增加人妖为 2 的话,前端还需要加匹配,对嘛?
    38 条回复    2019-12-07 14:34:49 +08:00
    ayase252
        1
    ayase252  
       2019-12-06 03:52:42 +08:00 via iPhone
    0/1 也好男 /女也好,接口定下来就好。
    至于你的考虑,这个只是前端和后端的约定。前端不一定会直接显示从 API 中获取的值。
    luckyx
        2
    luckyx  
       2019-12-06 04:43:57 +08:00
    const gender = {
    '0': '男',
    '1': '女'
    }

    gender(item.gender)
    lihongming
        3
    lihongming  
       2019-12-06 04:45:08 +08:00 via iPhone   ❤️ 6
    相比于汉字,传数字给前端会有很多优势,比如:

    数据传输量更少( json 中汉字是三个字节而数字是一个字节)

    更容易国际化(具体显示什么文字由客户端决定)

    你传给客户端的可能不只是一条数据,而是个列表。客户端用数字进行过滤 /排序等操作的速度会比汉字更节约资源

    ……

    顺便歪个楼:我觉得应该 0 表示女,1 表示男,这样更符合某个群体的认知

    233 匿了……
    Pastsong
        4
    Pastsong  
       2019-12-06 04:58:47 +08:00   ❤️ 1
    整挺好的,万一你们以后扩展了 LGBTTQQIAAP,写汉字能写死
    gebishushu
        5
    gebishushu  
    OP
       2019-12-06 05:21:14 +08:00
    @ayase252
    @Pastsong
    @lihongming
    @luckyx

    感谢回复,谢谢你们!我豁然开朗
    manami
        6
    manami  
       2019-12-06 06:52:41 +08:00 via Android
    写个枚举类转换呀
    dangyuluo
        7
    dangyuluo  
       2019-12-06 06:56:08 +08:00
    返回阴 /阳


    @lihongming 真能匿了么?
    msg7086
        8
    msg7086  
       2019-12-06 07:35:07 +08:00
    Gender 是个枚举,当然是枚举类型了。
    kaiyiliu123
        9
    kaiyiliu123  
       2019-12-06 07:37:22 +08:00 via Android
    那后期是 4 种 0 1 0→1 1→0 哈哈
    happyz90
        10
    happyz90  
       2019-12-06 07:42:35 +08:00 via Android
    Facebook 有 56 种性别
    mayx
        11
    mayx  
       2019-12-06 07:50:17 +08:00 via Android
    直接返回文字容易被 xss
    opengps
        12
    opengps  
       2019-12-06 08:04:45 +08:00 via Android   ❤️ 1
    我觉得 0 应当是个默认值,不做实际业务赋值
    ebony0319
        13
    ebony0319  
       2019-12-06 08:09:19 +08:00 via Android
    @opengps 同意,一般前端不传,或者传 0 代表的是全部。
    lucifer9
        14
    lucifer9  
       2019-12-06 08:28:04 +08:00
    就怕以后这个必须用复选
    sunziren
        15
    sunziren  
       2019-12-06 08:42:53 +08:00   ❤️ 2
    谢邀,人在美国,刚下飞机。匿了。
    liuguangxuan
        16
    liuguangxuan  
       2019-12-06 08:44:26 +08:00 via Android
    大晚上的都不休息的吗?
    Chingim
        17
    Chingim  
       2019-12-06 09:06:09 +08:00 via Android
    @mayx 大佬能解释一下吗?想了解了解
    Chingim
        18
    Chingim  
       2019-12-06 09:37:08 +08:00 via Android
    推荐接口语义化,传 male 和 female,只在最后保存到数据库时做一下转化。
    1. 抓包时数据内容清晰,看到 0/1 你可以还要再想一下。便于调试和测试。
    2. 前后端的代码里使用的都是语义化的值,而不是一堆 01,代码可读性得以提高。

    至于增加的字节,有压缩不是事
    w292614191
        19
    w292614191  
       2019-12-06 09:48:42 +08:00
    @Chingim 强迫症吗?
    "看到 0/1 你可以还要再想一下"
    male / female 不用想一下吗?
    cyndihuifei
        20
    cyndihuifei  
       2019-12-06 10:02:04 +08:00
    @w292614191 male / female 0/1,哪个容易想?
    mayx
        21
    mayx  
       2019-12-06 10:10:46 +08:00 via Android
    @Chingim 假如后端由于某些原因存储了一个 html 标签,前端不假思索的插了进去,那么这个标签就会被执行,当然如果后端非常安全,保证数据不会被篡改,那么倒是也无所谓
    Chingim
        22
    Chingim  
       2019-12-06 10:12:41 +08:00 via Android
    @w292614191 Male 是 0 还是 female 是 0 ?如果是多个字段都是 01 呢,你能马上明白 0123 分别指的是什么吗?
    iCyMind
        23
    iCyMind  
       2019-12-06 10:17:47 +08:00
    @mayx 你说的这个和接口返回什么没什么关系, 和数据库怎么存有关系
    tgich
        24
    tgich  
       2019-12-06 10:18:38 +08:00
    怎么着都行,软件行业没有关于这方面的规定
    w292614191
        25
    w292614191  
       2019-12-06 10:57:39 +08:00
    @cyndihuifei
    @Chingim
    前端:
    {field:'sex'},
    难道你们前端都是 {1,0},{male,female}。
    不应该是键来表示这个字段的含义吗?而是通过值来表示??
    wc951
        26
    wc951  
       2019-12-06 11:22:31 +08:00 via Android
    你确定你的接口只给前端用?
    shintendo
        27
    shintendo  
       2019-12-06 11:31:24 +08:00   ❤️ 1
    以什么形式展示,应该是前端的事情。你返回个男女,乍看是方便前端直接用,如果后期改需求了,要求显示男生 /女生,先生 /小姐,♂/♀,西装小人图标 /裙子小人图标,蓝色头像背景 /粉色头像背景,怎么办?前端还得根据你传的“男”/“女”去做映射后才能用,那为什么不直接传 0/1 呢?
    wwcxjun
        28
    wwcxjun  
       2019-12-06 11:49:17 +08:00
    我是传 1/2 0 作为默认值 另外还会传 男 /女 至于怎么用 那就是前端的事了。
    Chingim
        29
    Chingim  
       2019-12-06 12:20:05 +08:00 via Android
    @w292614191 这跟展示无关。
    比如数据传输用

    {
    “gender”: 0,
    “role”: 2
    }

    抓包或者看日志,你能马上知道是这个是男还是女吗?代码里的逻辑写 if (gender === 0) ,可读性好吗?

    如果数据传输用

    {
    “gender”: “male”,
    “role”: “admin”
    }

    那是不是可以解决上面的问题?
    imn1
        30
    imn1  
       2019-12-06 13:13:33 +08:00
    0/1,性别不仅用在一种场合,多种场合,称呼不同都可能用到性别判断
    而且,后端返回,除非特定内容(如文章),最好不要用需要编码识别的方式,尽可能 ASCII 搞定
    lxml
        31
    lxml  
       2019-12-06 13:15:46 +08:00 via Android   ❤️ 2
    说 0/1 的都怎么想的……一点接口设计思维都没有,除了嵌入式等或者极致性能场合,一切都应该以可读性可维护性为基准。
    tuean
        32
    tuean  
       2019-12-06 16:24:42 +08:00
    个人经验 遇到这种情况一般会这么干
    {
    gender: 0/1
    genderValue: 男 /女
    }
    多加个展示字段,通过枚举变更后全部返回,爱用哪个用哪个
    heiybb
        33
    heiybb  
       2019-12-06 16:33:09 +08:00
    最近看到个 GenderAPI 根据名字判断性别(仅限英文名
    fanpei0121
        34
    fanpei0121  
       2019-12-06 17:33:41 +08:00
    返回 0 和 1,前后端都分离了,为什么前端不能自己决定展示什么,为什么后端还要负责考虑前端需要怎么显示?
    文档写清楚就行了,前后端互不干扰最好
    w292614191
        35
    w292614191  
       2019-12-06 22:36:01 +08:00
    @Chingim
    所以就变成了
    if (gender === 'male') ??
    有何区别?
    Chingim
        36
    Chingim  
       2019-12-07 08:42:35 +08:00 via Android   ❤️ 1
    @w292614191 如果你不认可代码可读性的重要性,那的确没啥区别,我也只是鸡同鸭讲
    techme
        37
    techme  
       2019-12-07 14:07:20 +08:00
    所以说人妖是需求变动的幕后黑手,哈哈
    EscYezi
        38
    EscYezi  
       2019-12-07 14:34:49 +08:00 via iPhone
    这个不得看前端想要哪种么……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3384 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:19 · PVG 19:19 · LAX 04:19 · JFK 07:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.