有没大佬实现过一个管理 magic number 和其周边功能的库?

2020-08-06 11:44:48 +08:00
 revalue
magic number 是术语来的。比如用 1 代表键盘,用 2 代表鼠标,用 3 代表显示器。这一系列数据。

最近在搞一个大型的客户 Web 端,多人协作,一大堆需要用到 magic number 的地方。比如最普遍解决办法用{ displayer:3, keyboard: 1, mouse:2 }这样来处理这个问题,还是有不顺手的地方。

比如我想要按“声明时的 key 顺序遍历”,遍历出这些 312 和其所对应的中文文本(,这样直接扔给视图层遍历显示就可以了)。

再比如想用 1 来反查 "keyboard"相关数据 的:比如用 1 来查到一个中文文本“键盘”。

我觉得如果没看懂需求没关系,想问下有没有相关话题下已经实现的库?

(最好是 js 语言的,其他语言可能有更强大的原生数据结构来支持。)
2161 次点击
所在节点    程序员
17 条回复
PainAndLove
2020-08-06 11:52:57 +08:00
ts enum 应该就可以满足了
revalue
2020-08-06 12:19:36 +08:00
ts enum, 说实话我看过。它是 key: value 的。而我这个需求至少需要 [1, keyboard, '键盘'],在这里 keyboard 是没有信息量的,就是为了替代 1 来显示给程序员看的,另为了满足 js key value 语法。怎么从 1 查询到 '键盘'?这里用到 1 又出现 magic number 了。

所以,至少需要 enum 再加 1 个数据结构来配合。

而且我看了 ts enum 的实现,是基于 js object 的。js object 不保证 key 的遍历顺序按照声明时的顺序的吧。
@PainAndLove
revalue
2020-08-06 12:23:09 +08:00
如果“不直接使用数值 123”,这是不可能的。目标还是不让数值单独出现。

比如从 1 查询到 '键盘',获取 map[1],1 还是单独出现了,这样算是还有 magic number,是不合理的。
loading
2020-08-06 12:23:31 +08:00
一个很普遍的关系数据库的某个表
id,name,magic number,order number

看不懂的话,你们的大型 web 能有多大。
Mohanson
2020-08-06 12:27:36 +08:00
对 magic number 你是不是有什么误解.
loading
2020-08-06 12:36:21 +08:00
@Mohanson 我觉得他只是为了能在文中有个逼格高的英语随便找的一个字符串。
lix7
2020-08-06 12:51:25 +08:00
magic number...这词儿不容易歧义吧
otakustay
2020-08-06 12:52:56 +08:00
1. 数字( 1 )与标识符( keyboard )对应 - 这是 enum
2. 需要能获取到中文名称 - 这是 enum 的 localization https://stackoverflow.com/questions/17380900/enum-localization
3. 需要能遍历 - 这是反射 https://stackoverflow.com/questions/105372/how-to-enumerate-an-enum

其实它还是一个 enum,用 js 去实现这些功能就行
revalue
2020-08-06 13:30:58 +08:00
@Mohanson
@loading
@lix7 magic number 这词儿本身就有多义。是不同领域都用这个词所导致的。再加上本来就是舶来词,不适合用中文。所以帖子开头说明了一下指代。
revalue
2020-08-06 13:52:04 +08:00
@loading
@otakustay 因为能用的数据结构有限。我直接得出结论需要 2 组数据结构结合起来用,或者实现一组数据仓库,像查 sql 一样查。
而数据仓库这种思路,估计是已有库实现了,注意一下用 1 去查的时候取而代之用一个“标识符”去查就行了。

话说这可以算是“本地化”问题,但是如果在 js 中重写"1"的 toString 方法,令它返回"键盘"。也不能实现反查。
revalue
2020-08-06 14:06:40 +08:00
感谢感谢,不妨从 enum 作为切入点,不需要作为“数据库”搞太多高大上的功能。
在 github 上搜一下 enum 主题的。
楼主挖一个坑,之后楼主来点评一下这个库 https://github.com/adrai/enum
momocraft
2020-08-06 14:12:54 +08:00
数据定义成一个 ` { } [] ` ,查找的地方 Array#find 也可以,变换成一个 Map 也可以

比发明个库实现你这些乱七八糟的功能容易很多
KuroNekoFan
2020-08-06 14:14:04 +08:00
enum 不会给出静态错误,如果希望更 robust 的限制,可以用 union type
DDounx
2020-08-06 14:17:03 +08:00
如果不多的话两个哈希表也挺方便的吧(
sivacohan
2020-08-06 17:03:28 +08:00
为啥我觉得你这个需求是 enum+i18n
revalue
2020-08-06 17:08:34 +08:00
@sivacohan 实际上是不需要英文的。一开始有英文,是为了让"keyboard"取代 1 出现在代码中
wingoo
2020-08-06 17:27:56 +08:00
配置中心??

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

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

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

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

© 2021 V2EX