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

2019-07-31 15:38:18 +08:00
 Morriaty

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

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

1976 次点击
所在节点    程序员
18 条回复
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
2019-07-31 15:44:59 +08:00
枚举吧,枚举里面加个 level 属性的数字等级,也可以不加,加个静态的排序方法,数据保存就用枚举名字,排序之和这个方法有关,要增加修改就这里改改就好
Morriaty
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
2019-07-31 16:11:34 +08:00
为什么升降级一定要通过加减法呢?
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
2019-07-31 16:16:48 +08:00
sql : level tinyint default 0,level∈自然数,先来的占领前排数字
Morriaty
2019-07-31 16:34:12 +08:00
@limuyan44 不是一定要加减法,而是希望有个统一的升降级方法,而不是每插入一个等级,就得改写这个升降级方法进行适配
Morriaty
2019-07-31 16:39:19 +08:00
@laravel 先来的先占,那就无序了啊,怎么适配以下逻辑呢

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

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

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

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

代码里面,封装一个获取对应权值的函数,或者权值大小比较的函数应该就差不多了。
Vegetable
2019-07-31 17:11:09 +08:00
参照 loglevel
jifengg
2019-08-02 12:13:17 +08:00
level 就做 level 的事(显示,逻辑计算),给它加一个 order 属性,解决排序,且这个 order 是随时可以变的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/587894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX