枚举类型是从 0 开始还是从 1 开始

讨论 未结 88 60
cnoder
cnoder 会员 2022年7月22日 07:26 发表
<p>起因:那天听到前端 leader 在阴阳怪气我设计的枚举不是从 0 开始,跟旁边的人说什么“但凡学过 java 。。。。。也应该知道。。。”云云</p> <p>我(我是后端)也没和他辩解</p> <p>我说下我的理由吧</p> <ol> <li>如果用 int 来代表 true/false ,我会设计为 0/1</li> <li>如果是几种状态值,我会选择从 1 开始,避免选择 0 。因为某些弱类型语言在判断 0 的时候会自动做类型转换,而且我们目前业务上使用的后端语言也是 lua ,数组索引是从 1 开始的。</li> </ol> <p>所以我在跟前端定义参数的时候 选择 1 、2 、3 来表示样式 123 。</p> <p>我这理由充分嘛?</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
88个回复
  • coderluan
    2022年7月22日 07:26
    不充分,完全不能解释为啥你不和他辩解。
    0 0
  • villivateur
    2022年7月22日 07:26
    如果单论语言设计的话,我所了解的 enum 都是默认从 0 开始的
    0 0
  • timethinker
    2022年7月22日 07:26
    前后端统一就行(意味着有一个文档来进行维护,类似字典),至于值是什么在编写代码的时候无关紧要,值只有在传输或者存储的时候才会被用到。不同语言的对于枚举这个东西定义还不一样,不过逻辑上来讲枚举通常意义下就是一个有限的集合,这个集合里面定义的每一个枚举单位都是独一无二的,这样就可以借助语言的特性来进行一些约束性的操作。
    0 0
  • IceBay
    2022年7月22日 07:26
    但凡写过项目,就知道从几开始关他屁事
    0 0
  • lanlanye
    2022年7月22日 07:26
    我记得 Uber 的 Golang 风格里提到过建议从 1 开始,理由和你说的一样
    0 0
  • wowawesome
    2022年7月22日 07:26
    直接叼他,从几开始关你屁事,看劳资的接口文档用就行了。
    0 0
  • Lin0936
    2022年7月22日 07:26
    下次给他从 999 开始倒着来
    0 0
  • menc
    2022年7月22日 07:26
    scala 的 tuple 类型下标就是从 1 开始的,你可以回一个阴阳怪气,“但凡学过 scala ,也应该知道....”
    0 0
  • menc
    2022年7月22日 07:56
    从这里可以看到 array 下标的起始值 0 和 1 五五开,你 leader 还是太 naive
    0 0
  • sadfQED2
    2022年7月22日 07:56
    我一般也喜欢从 1 开始,因为 0 是默认值,用 0 当枚举偶尔出错忘了赋值的时候都不容易发现
    0 0
  • HOU
    2022年7月22日 07:56
    叼他完了,你的设计没错,管的真宽
    0 0
  • marcong95
    2022年7月22日 07:56
    #10 然而你给的链接里 Scale 的下标是 0 开始的,这就十分有趣了
    0 0
  • dqzcwxb
    2022年7月22日 07:56
    现在你可以把大家提供的资料甩他脸上,美其名曰"技术分享"
    0 0
  • libook
    2022年7月22日 07:56
    既然 Lua 默认从 1 开始,你就把 Lua 的文档丢给他,说“但凡多了解几门语言也应该知道不一定都从 0 开始。” 不管从几开始,这个是涉及到前后端协商标准的问题,后端不需要为前端考虑太多,前端也不需要为后端考虑太多,严格按照约定的标准自己管好自己就好了,否则就容易好心当成驴肝肺。 一个人对一个事物越是不了解,就越会使用过往经验和思维定式去揣测,吐槽者此举无疑暴漏了自己的无知,就像那个认为火箭应该用水洗煤的民科一样。
    0 0
  • xz410236056
    2022年7月22日 07:56
    用 swift ,告诉他,枚举是可以没有初始值的,既不是 0 也不是 1
    0 0
  • ysc3839
    2022年7月22日 07:56
    我会用 0 来表示一些特殊值,比如说是读取配置文件,把字符串转成枚举的话,我会把 0 设为 Unknown ,字符串错误的话就是 Unknown 。
    0 0
  • RainCats
    2022年7月22日 07:56
    枚举的索引确实是从 0 开始的,但自己定的 code 值看各人风格了,现在我吸取教训一般都是一开始定义时就 10 、20 、30 这样递增。。
    0 0
  • wangtian2020
    2022年7月22日 08:26
    我有交付的一个项目,枚举值是“↑ ↓ ← →”
    0 0
  • IGJacklove
    2022年7月22日 08:26
    他就是想怼你而已,从几开始根本不重要。你别陷入吃几碗粉的局。
    0 0
  • sardina
    2022年7月22日 08:26
    go 是因为 int 默认为 0 所以建议 1 开始
    0 0
  • lisongeee
    2022年7月22日 08:26
    可以从 1000 开始,这样 toString(10).length 是相等的,好对齐
    0 0
  • xz410236056
    2022年7月22日 08:26
    #22 go 所谓的枚举不是用 iota 做初始值的吗?
    0 0
  • nekoneko
    2022年7月22日 08:26
    我一般 0 禁用 1 启用 -1 删除, 其他枚举从 1 开始, 从 0 开始感觉怪怪的
    0 0
  • hopingtop
    2022年7月22日 08:26
    Golang 里面 用 iota 枚举, 但是我喜欢用 X = iota + 1 来设置枚举值,经验之谈,可以避免很多问题。杠就是你对
    0 0
  • weiwenhao
    2022年7月22日 08:26
    typedef enum { FOO = 1, BAR, CAR } t; c 语言里面某些情况也是默认 0 , 所以推荐从 1 开始
    0 0
  • kera0a
    2022年7月22日 08:26
    要不是今年行情不好, 我就劝你离职了。 枚举值从几开始都能斗起来,工作氛围是多差啊
    0 0
  • MuXia
    2022年7月22日 08:26
    #20 看了一圈下来,还是你这个离谱
    0 0
  • pastor
    2022年7月22日 09:28
    枚举本来就不是啥好玩意,明码标价各个值才方便阅读、日志。 同意的请点赞给我加分!
    0 0
  • Huelse
    2022年7月22日 09:28
    我也喜欢从 1 开始,0 的隐含意义太多,文档就算是约定了也还要自查一遍才能理清
    0 0
  • itechnology
    2022年7月22日 09:28
    讲道理,枚举从几开始关他什么事情,就这点事情他也要阴阳怪气,我建议你赶紧离职或者换个项目组
    0 0
  • NGXDLK
    2022年7月22日 09:28
    枚举从 0 还是 1 开始也能拿出来说?我还从 100 开始呢,这 leader 怕不是傻屌大学毕业的
    0 0
  • IvanLi127
    2022年7月22日 09:28
    我认为枚举类型内部的表示方式不应该暴露给外部,交互的时候应该用字面值传递,而不是用整数。
    0 0
  • BeautifulSoap
    2022年7月22日 10:26
    都用枚举了还在乎起始值?直接给他来个 99 起,专治不服
    0 0
  • catsoul
    2022年7月22日 10:26
    雀食,枚举就别跟其他的混了,直接 100 起跳
    0 0
  • Building
    2022年7月22日 10:26
    枚举值和属性值绑定,随便 枚举值和属性值无关,还是随便 但我喜欢有默认值的时候在 0 位放默认值,没有默认值用 none
    0 0
  • stevefan1999
    2022年7月22日 10:26
    不要爭論這個問題 lua 壬震怒(我不是) 實際上 lua 是沒有定義索引方向 但社羣定義是 1 開始 0 開始還是 1 開始 蘊含了 offset 與 absolute positon 黨派之爭 我個人讀算法時是支持 1 開始的 但實際上用還是最好得 0
    0 0
  • potatowish
    2022年7月22日 10:26
    不要和前端、客户端讨论后端的问题,和一个外行讨论技术问题就是浪费时间。
    0 0
  • JaguarJack
    2022年7月22日 11:26
    你的理由是对的,前端的确有这种情况
    0 0
  • wktrf
    2022年7月22日 11:26
    作为前端我也喜欢用 1 开始,0 很容易疏忽导致判断出现问题
    0 0
  • lucays
    2022年7月22日 11:26
    作为写 python 的,除非枚举就俩,否则肯定从 1 开始
    0 0
  • mmdsun
    2022年7月22日 11:56
    有设计文档说应该从 1 开始不过有争论。有个例子:Mysql 的枚举是从 1 开始的,0 会报错。 文档写: (✔) 0 ,保留字 1 ,状态 1 2 ,状态 2 文档: ( X ) 1 ,状态 1 2 ,状态 2
    0 0
  • buxudashi
    2022年7月22日 11:56
    1 就是 1.而 0 就不一定了。有时 false,null,空字符串,empty(),什么乱七八糟的相通。 所以你是对的。
    0 0
  • elevioux
    2022年7月22日 12:26
    php 开发,从 1 开始,理由一样
    0 0
  • xiubin
    2022年7月22日 12:26
    从 0 开始,0 是无业务意义或者默认的一档,比如 0 可以是:unknow 、none 、default 、normal 。 iOS 开发( OC 语言)一般无法识别 nil 0 null 的区别
    0 0
  • mengzhuo
    2022年7月22日 12:26
    枚举的话,0 一般是非法(就是防止协议解析失败)
    0 0
  • byzod
    2022年7月22日 12:26
    标准答案:关你卵事,我从 114514 开始
    0 0
  • FrankHB
    2022年7月22日 12:56
    下标的问题,只能说历史丈育太多,典都不知道,还用得着举例了: Lua ?算哪根葱……况且 Lua 用户自己很多就不满意: 再有争议可能还是数学丈育更多,分不清基数和序数。 至于枚举……谁告诉你枚举就非得有从几开始的问题? 还是 C 枚举当整数,于是随便什么语言都需要关心编码? ( Swift:?) 而且咋不学 C 把 char 也整成整数类型呢? 太臭了,要肛掉。
    0 0
  • icyalala
    2022年7月22日 12:56
    如果是 enum 关联到整数,那我还是倾向从 0 开始,0 就是一个默认值。 lua 那个设计 table 就是从 1 开始的,所以 enum 从 1 开始也算符合他们的习惯。 其他不少语言 enum 可以不关联到整数,那就不用争了。
    0 0
  • beichenhpy
    2022年7月22日 13:56
    想从多少就多少呗,写清楚不就行了。。咋还有这种领导。。
    0 0
  • bojackhorseman
    2022年7月22日 13:56
    别的不知道,反正我们的 go 后端用 1 表示有,2 表示没有
    0 0
  • banricho
    2022年7月22日 14:26
    为啥要让前端知道数字 接口里看到不是字符串而是一堆数字搭配文档的,是我也要阴阳怪气
    0 0
  • ikaros
    2022年7月22日 14:26
    有些语言从 0 开始会有问题(golang), 所以从 1 开始准没错
    0 0
  • Helsing
    2022年7月22日 15:26
    习惯确实是从 0 开始,你从 1 开始的理由没有说服力
    0 0
  • aMR
    2022年7月22日 16:26
    当然是互相妥协一下从 0.5 开始 ε=ε=ε=┏(゜ロ゜;)┛ 实际项目中,可以在枚举值最前面加入一个 Invalid\Undefined 的默认枚举值,既满足了从 0 开始,又可以防止有人没初始化搞出奇怪结果
    0 0
  • iseki
    2022年7月22日 16:26
    哈,通讯时只要不是紧凑的二进制协议,我倾向于用字符串当枚举值~人类可读,易调试,看见就知道啥意思不用查表
    0 0
  • Aloento
    2022年7月22日 18:56
    枚举从多少开始这不就是看心情的事情吗(
    0 0
  • Chingim
    2022年7月23日 00:26
    枚举值本来就是无序的有限的状态集合,哪有什么“从哪开始”的说法 抛开具体语言,枚举值不仅仅只能用数字表示,难道用字符表示枚举,还得从 A 开始吗?
    0 0
  • zed1018
    2022年7月23日 00:56
    使用数字作为枚举值 × 使用单词作为枚举值 √ 我可不想看着字段脑子里还要加载翻译器 (逃
    0 0
  • xaplux
    2022年7月23日 00:56
    前几天我们前端也问我来着,说数据字典可以从 0 开始么,我说 0 有特殊含义,不可以,她也就没有再问,猜测数据字典一般用于下拉列表,从 0 开始前端方便处理吧
    0 0
  • ydpro
    2022年7月23日 01:25
    单纯想怼你就是了,下次枚举用雪花算法生成
    0 0
  • Lirika
    2022年7月23日 01:25
    我习惯从 0 开始 使用的时候可以声明一个数组$a=['a','b','c'] 然后用你返回的枚举就直接取出来 $a[枚举值]
    0 0
  • iColdCat
    2022年7月23日 02:55
    下次给他设计随机数 惯丫毛病
    0 0
  • skinny
    2022年7月23日 03:25
    除了可以组合状态的枚举类型,不是一般用有意义的字符串名字吗?前端拿到的、发送的也是字符串,这样比较容易理解吧
    0 0
  • brader
    2022年7月23日 03:25
    我就比较叼了,这东西都是随缘的,今天想从 0 开始就从 0 ,明天想从 1 开始就从 1
    0 0
  • brader
    2022年7月23日 03:25
    我有时候还是从-1 开始的,哈哈,完全看心情
    0 0
  • brader
    2022年7月23日 03:25
    枚举的键一般是没有什么展示意义的,只要保证唯一即可,对外用户展示的会有一个对应的中文名称。所以枚举值在英文或数字都可的场景下,后端一般会选择数字,是因为数据库存储 tinyint 更高效
    0 0
  • janus77
    2022年7月23日 04:25
    这没什么对错,没必要争啊,自己喜欢用什么就用什么
    0 0
  • lambdaq
    2022年7月23日 04:25
    你就说做一个异常占位的枚举为 0 。正常的都是 1 2 3 开始。
    0 0
  • MEIerer
    2022年7月23日 04:55
    充分个毛,不都是 0 开始你吗,那些弱类型语言别人写的时候自然会进行判断
    0 0
  • MEIerer
    2022年7月23日 04:55
    不过写好文档的话当我没说
    0 0
  • changnet
    2022年7月23日 05:25
    就我而言,枚举从 0 开始,但业务逻辑一般是从 1 开始,0 是一个特殊值或者预留的,之前经常看到业务逻辑直接从 0 开始的,后面再定义一个特殊值会非常麻烦,比如 enum Type { None = 0, // 未指定 FOO = 1 // 业务逻辑的定义 }
    0 0
  • WilliamYang
    2022年7月23日 05:25
    写 protobuf 时,一般枚举第一个都是 UNKNOWN ,除非 0 值是本身是有意义的,否则就从 1 开始。嗯,你领导是垃圾
    0 0
  • dingyaguang117
    2022年7月23日 06:25
    枚举还要考虑入库的场景呢, 如果 0 是有意义的, 未收集 /未指定 只能用 null 了。 对于静态类型语言是无尽的烦恼
    0 0
  • DoveAz
    2022年7月23日 06:25
    为了避免不必要的 bug ,最好从 0 开始 🐶
    0 0
  • wdhwg001
    2022年7月23日 06:25
    这里最佳实践是直接不给枚举的 0 值定义,并且任由它崩溃。 然后在文档里写明 0 值是 Invalid 的,但是代码里不需要把 0 值起名字为 Invalid ,而是直接从 1 开始,跳过 0 。 这样一来,那些没有赋值的枚举们就会直接崩溃,而代码也只需要在入口的地方处理掉这些 0 们,而不是每次写判断的时候脑子里都要带着这个 Invalid 。
    0 0
  • DeWjjj
    2022年7月23日 06:25
    默认 = 0 ,部分特定写 1 。 文档里面都有,给什么写什么。
    0 0