V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Morriaty
V2EX  ›  程序员

有序的标志位字段(level)要怎么设计比较好?

  •  
  •   Morriaty · 2019-07-31 15:38:18 +08:00 · 1980 次点击
    这是一个创建于 1974 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如一开始只有 一般 重要 紧急 这三种 level,但后续随着业务发展,可能会插入一个 普通 等级,变成 一般 普通 重要 紧急

    这种有序的标志位字段怎样设计才可以保证后续代码尽量小的改动?

    18 条回复    2019-08-02 12:13:17 +08:00
    mcfog
        1
    mcfog  
       2019-07-31 15:42:08 +08:00
    普通做法:
    100 200 300
    插入后 100 150 200 300

    文艺做法:
    128 256 384
    插入后
    128 192 256 384

    2b 做法:
    0.25 0.5 0.75
    插入后
    0.25 0.375 0.5 0.75
    18258226728
        2
    18258226728  
       2019-07-31 15:44:59 +08:00
    枚举吧,枚举里面加个 level 属性的数字等级,也可以不加,加个静态的排序方法,数据保存就用枚举名字,排序之和这个方法有关,要增加修改就这里改改就好
    Morriaty
        3
    Morriaty  
    OP
       2019-07-31 16:02:14 +08:00
    @mcfog @18258226728 不等距的话,提升、降低等级又会变得复杂了

    class Event:
    level = 100

    def level_up(self, step):
    self.level += 100 * step

    def level_down(self, step):
    self.level -= 100 * step
    limuyan44
        4
    limuyan44  
       2019-07-31 16:11:34 +08:00
    为什么升降级一定要通过加减法呢?
    qwerthhusn
        5
    qwerthhusn  
       2019-07-31 16:16:26 +08:00
    fatal warn info debug trace

    red orange yellow blue

    MySQL 还有个自定义的 FIELD()函数可以执行自定义的顺序 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field
    laravel
        6
    laravel  
       2019-07-31 16:16:48 +08:00
    sql : level tinyint default 0,level∈自然数,先来的占领前排数字
    Morriaty
        7
    Morriaty  
    OP
       2019-07-31 16:34:12 +08:00
    @limuyan44 不是一定要加减法,而是希望有个统一的升降级方法,而不是每插入一个等级,就得改写这个升降级方法进行适配
    Morriaty
        8
    Morriaty  
    OP
       2019-07-31 16:39:19 +08:00
    @laravel 先来的先占,那就无序了啊,怎么适配以下逻辑呢

    ```
    if level < 重要:
    do_something()
    else:
    do_nothing()
    ```
    18258226728
        9
    18258226728  
       2019-07-31 16:40:28 +08:00
    @qwerthhusn 学到个新函数哈
    SuperMild
        10
    SuperMild  
       2019-07-31 16:48:12 +08:00
    能不能这样,数据库里直接用字符串,然后类似 2 楼那样处理。
    limuyan44
        11
    limuyan44  
       2019-07-31 16:56:22 +08:00
    @Morriaty 你这个升降级方案需要的就是初始化好的排序后的数组 /链表 查找下一位,以后插入等级随便取一个中间的数字就好了。这种标志位字段不会有多少个的,功能实现就行,不会有什么其他太大区别,其实我更建议用有序链表,含义上可能要更加清晰一点 if node.value=val: return node.next/pre。
    pagxir
        12
    pagxir  
       2019-07-31 17:00:10 +08:00 via Android
    @Morriaty 你这种可以写成 if info[level].priority < info["重要“].priority:
    else
    mcfog
        13
    mcfog  
       2019-07-31 17:01:31 +08:00
    @Morriaty 等级到底是 100 200 300 还是 100 150 200 300 属于元数据啊,比如你说优先级的场景一般不允许 runtime 加减,那么直接 define 在代码里面就行了,如果允许 runtime 配置的话,你总有一个配置表里面是 100:普通 200:重要这样的数据,总之升降级读元数据,确定上一个 /下一个等级对应的数值就行

    你要坚持等距,那么有插入等级就一定要洗数据,代码尽量小改动是好的,但更优先级肯定是避免洗数据要高的多。如果要插入新等级不洗老数据,那么一定就要支持不等距,最后问题就变成了怎么预留间距和插入的时候确定新的数值了

    如果你觉得洗数据无所谓的话,还要什么设计呢?怎么写代码方便怎么来,每次有变化就洗数据就好了
    whitev2
        14
    whitev2  
       2019-07-31 17:03:27 +08:00
    写成配置文件啊,要加 level 就改配置文件,程序重新读配置
    SpiderShrimp
        15
    SpiderShrimp  
       2019-07-31 17:05:12 +08:00
    升降级用排序后的索引来做就可以了
    akira
        16
    akira  
       2019-07-31 17:09:58 +08:00
    没有什么是加一层解决不了的。

    之前是 状态 -》权值
    修改成 状态 -》字符串标识 -》权值

    代码里面,封装一个获取对应权值的函数,或者权值大小比较的函数应该就差不多了。
    Vegetable
        17
    Vegetable  
       2019-07-31 17:11:09 +08:00
    参照 loglevel
    jifengg
        18
    jifengg  
       2019-08-02 12:13:17 +08:00 via Android
    level 就做 level 的事(显示,逻辑计算),给它加一个 order 属性,解决排序,且这个 order 是随时可以变的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3145 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:37 · PVG 08:37 · LAX 16:37 · JFK 19:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.