V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
revalue
V2EX  ›  程序员

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

  •  1
     
  •   revalue · 2020-08-06 11:44:48 +08:00 · 2311 次点击
    这是一个创建于 1561 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    PainAndLove
        1
    PainAndLove  
       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:27: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  
       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   ·   实用小工具   ·   5976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 02:31 · PVG 10:31 · LAX 18:31 · JFK 21:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.