V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
revalue
V2EX  ›  程序员

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

  •  1
     
  •   revalue · Aug 6, 2020 · 3014 views
    This topic created in 2097 days ago, the information mentioned may be changed or developed.
    magic number 是术语来的。比如用 1 代表键盘,用 2 代表鼠标,用 3 代表显示器。这一系列数据。

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

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

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

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

    (最好是 js 语言的,其他语言可能有更强大的原生数据结构来支持。)
    Supplement 1  ·  Aug 6, 2020

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

    楼主保持原来的观点,对于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 replies    2020-08-06 17:27:56 +08:00
    Lanayaaa
        1
    Lanayaaa  
       Aug 6, 2020
    ts enum 应该就可以满足了
    revalue
        2
    revalue  
    OP
       Aug 6, 2020
    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
       Aug 6, 2020
    如果“不直接使用数值 123”,这是不可能的。目标还是不让数值单独出现。

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

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

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

    比发明个库实现你这些乱七八糟的功能容易很多
    KuroNekoFan
        13
    KuroNekoFan  
       Aug 6, 2020
    enum 不会给出静态错误,如果希望更 robust 的限制,可以用 union type
    DDounx
        14
    DDounx  
       Aug 6, 2020
    如果不多的话两个哈希表也挺方便的吧(
    sivacohan
        15
    sivacohan  
    PRO
       Aug 6, 2020 via iPhone
    为啥我觉得你这个需求是 enum+i18n
    revalue
        16
    revalue  
    OP
       Aug 6, 2020
    @sivacohan 实际上是不需要英文的。一开始有英文,是为了让"keyboard"取代 1 出现在代码中
    wingoo
        17
    wingoo  
       Aug 6, 2020
    配置中心??
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   827 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 22:40 · PVG 06:40 · LAX 15:40 · JFK 18:40
    ♥ Do have faith in what you're doing.