• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Morriaty
V2EX  ›  程序员

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

  •  
  •   Morriaty · Jul 31, 2019 · 2495 views
    This topic created in 2487 days ago, the information mentioned may be changed or developed.

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

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

    18 replies    2019-08-02 12:13:17 +08:00
    mcfog
        1
    mcfog  
       Jul 31, 2019
    普通做法:
    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  
       Jul 31, 2019
    枚举吧,枚举里面加个 level 属性的数字等级,也可以不加,加个静态的排序方法,数据保存就用枚举名字,排序之和这个方法有关,要增加修改就这里改改就好
    Morriaty
        3
    Morriaty  
    OP
       Jul 31, 2019
    @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  
       Jul 31, 2019
    为什么升降级一定要通过加减法呢?
    qwerthhusn
        5
    qwerthhusn  
       Jul 31, 2019
    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  
       Jul 31, 2019
    sql : level tinyint default 0,level∈自然数,先来的占领前排数字
    Morriaty
        7
    Morriaty  
    OP
       Jul 31, 2019
    @limuyan44 不是一定要加减法,而是希望有个统一的升降级方法,而不是每插入一个等级,就得改写这个升降级方法进行适配
    Morriaty
        8
    Morriaty  
    OP
       Jul 31, 2019
    @laravel 先来的先占,那就无序了啊,怎么适配以下逻辑呢

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

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

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

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

    代码里面,封装一个获取对应权值的函数,或者权值大小比较的函数应该就差不多了。
    Vegetable
        17
    Vegetable  
       Jul 31, 2019
    参照 loglevel
    jifengg
        18
    jifengg  
       Aug 2, 2019 via Android
    level 就做 level 的事(显示,逻辑计算),给它加一个 order 属性,解决排序,且这个 order 是随时可以变的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4101 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 10:12 · PVG 18:12 · LAX 03:12 · JFK 06:12
    ♥ Do have faith in what you're doing.