有没大佬实现过一个管理 magic number 和其周边功能的库? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
revalue
V2EX    程序员

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

  •  1
     
  •   revalue 2020-08-06 11:44:48 +08:00 2716 次点击
    这是一个创建于 1900 天前的主题,其中的信息可能已经有所发展或是发生改变。
    magic number 是术语来的。比如用 1 代表键盘,用 2 代表鼠标,用 3 代表显示器。这一系列数据。

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

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

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

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

    (最好是 js 语言的,其他语言可能有更强大的原生数据结构来支持。)
    第 1 条附言    2020-08-06 16:52:40 +08:00

    问题已经解决。打算推荐给队友使用。

    楼主保持原来的观点,对于js语言:

    [1] 需要 2 组数据结构结合起来用,或者

    [2] 实现一组数据仓库类似于数据库,可以选择退化为单纯用标识符表示数值。

    楼主是偏向于方案 [2] 的,所以想问下有没有人已实现的。毕竟 [1] 的玩法太多,相关代码比较分散,不够“一把梭”。

    typescript的enum不是这么用的,至于其局限性,楼主已经在下面回复了。

    @otakustay 大佬发的链接是其他语言下的,启发我的思路是其他语言的enum的实现更加完整一点,可能已经有人用js模拟实现,所以在github上找"enum"话题的库,找到了。

    我不知道国外的这批大佬出于什么需求,扩大的我的见识,如果有人能解释一下就更好了,写的这个js库恰好满足我的“基本需求”:https://github.com/adrai/enum


    // 不单独出现数字,即magic number: const myEnum = new Enum({ displayer:3, keyboard: 1, mouse:2 }) // 提供一个按声明时的key顺序的遍历的iterable(返回的是array,保证次序) myEnum.enums.forEach(() => {}) // 按"标识符"查,只不过得到的是EnumItem类型,要取一下value属性: myEnum['键盘'].value // 1 myEnum.get('键盘').value // 1 // 按数字反查,只不过得到的是EnumItem类型,要取一下key属性:(这里数字是模拟出来的,理性情况不要单独出现) myEnum.get(1).key // '键盘' 

    这个库的缺点:计算和内存开销比较大,因为不是做成定制化的,所以数据全都创建好了。但是好像也没有更好性能的写法了。

    17 条回复    2020-08-06 17:27:56 +08:00
    Lanayaaa
        1
    Lanayaaa  
       2020-08-06 11:52:57 +08:00
    ts enum 应该就可以满足了
    revalue
        2
    revalue  
    OP
       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
        3
    revalue  
    OP
       2020-08-06 12:23:09 +08:00
    如果“不直接使用数值 123”,这是不可能的。目标还是不让数值单独出现。

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

    看不懂的话,你们的大型 web 能有多大。
    Mohanson
        5
    Mohanson  
       2020-08-06 12:2:36 +08:00   1
    对 magic number 你是不是有什么误解.
    loading
        6
    loading  
       2020-08-06 12:36:21 +08:00 via Android
    @Mohanson 我觉得他只是为了能在文中有个逼格高的英语随便找的一个字符串。
    lix7
        7
    lix7  
       2020-08-06 12:51:25 +08:00
    magic number...这词儿不容易歧义吧
    otakustay
        8
    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
        9
    revalue  
    OP
       2020-08-06 13:30:58 +08:00
    @Mohanson
    @loading
    @lix7 magic number 这词儿本身就有多义。是不同领域都用这个词所导致的。再加上本来就是舶来词,不适合用中文。所以帖子开头说明了一下指代。
    revalue
        10
    revalue  
    OP
       2020-08-06 13:52:04 +08:00
    @loading
    @otakustay 因为能用的数据结构有限。我直接得出结论需要 2 组数据结构结合起来用,或者实现一组数据仓库,像查 sql 一样查。
    而数据仓库这种思路,估计是已有库实现了,注意一下用 1 去查的时候取而代之用一个“标识符”去查就行了。

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

    比发明个库实现你这些乱七八糟的功能容易很多
    KuroNekoFan
        13
    KuroNekoFan  
       2020-08-06 14:14:04 +08:00
    enum 不会给出静态错误,如果希望更 robust 的限制,可以用 union type
    DDounx
        14
    DDounx  
       2020-08-06 14:17:03 +08:00
    如果不多的话两个哈希表也挺方便的吧(
    sivacohan
        15
    sivacohan  
    PRO
       2020-08-06 17:03:28 +08:00 via iPhone
    为啥我觉得你这个需求是 enum+i18n
    revalue
        16
    revalue  
    OP
       2020-08-06 17:08:34 +08:00
    @sivacohan 实际上是不需要英文的。一开始有英文,是为了让"keyboard"取代 1 出现在代码中
    wingoo
        17
    wingoo  
       2020-08-06 17:27:56 +08:00
    配置中心??
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2514 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 04:19 PVG 12:19 LAX 21:19 JFK 00:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86