比如一开始只有 一般
重要
紧急
这三种 level,但后续随着业务发展,可能会插入一个 普通
等级,变成 一般
普通
重要
紧急
。
这种有序的标志位字段怎样设计才可以保证后续代码尽量小的改动?
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 |
2
18258226728 2019-07-31 15:44:59 +08:00
枚举吧,枚举里面加个 level 属性的数字等级,也可以不加,加个静态的排序方法,数据保存就用枚举名字,排序之和这个方法有关,要增加修改就这里改改就好
|
3
Morriaty OP @mcfog @18258226728 不等距的话,提升、降低等级又会变得复杂了
class Event: level = 100 def level_up(self, step): self.level += 100 * step def level_down(self, step): self.level -= 100 * step |
4
limuyan44 2019-07-31 16:11:34 +08:00
为什么升降级一定要通过加减法呢?
|
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 |
6
laravel 2019-07-31 16:16:48 +08:00
sql : level tinyint default 0,level∈自然数,先来的占领前排数字
|
7
Morriaty OP @limuyan44 不是一定要加减法,而是希望有个统一的升降级方法,而不是每插入一个等级,就得改写这个升降级方法进行适配
|
8
Morriaty OP |
9
18258226728 2019-07-31 16:40:28 +08:00
@qwerthhusn 学到个新函数哈
|
10
SuperMild 2019-07-31 16:48:12 +08:00
能不能这样,数据库里直接用字符串,然后类似 2 楼那样处理。
|
11
limuyan44 2019-07-31 16:56:22 +08:00
@Morriaty 你这个升降级方案需要的就是初始化好的排序后的数组 /链表 查找下一位,以后插入等级随便取一个中间的数字就好了。这种标志位字段不会有多少个的,功能实现就行,不会有什么其他太大区别,其实我更建议用有序链表,含义上可能要更加清晰一点 if node.value=val: return node.next/pre。
|
12
pagxir 2019-07-31 17:00:10 +08:00 via Android
@Morriaty 你这种可以写成 if info[level].priority < info["重要“].priority:
else |
13
mcfog 2019-07-31 17:01:31 +08:00
@Morriaty 等级到底是 100 200 300 还是 100 150 200 300 属于元数据啊,比如你说优先级的场景一般不允许 runtime 加减,那么直接 define 在代码里面就行了,如果允许 runtime 配置的话,你总有一个配置表里面是 100:普通 200:重要这样的数据,总之升降级读元数据,确定上一个 /下一个等级对应的数值就行
你要坚持等距,那么有插入等级就一定要洗数据,代码尽量小改动是好的,但更优先级肯定是避免洗数据要高的多。如果要插入新等级不洗老数据,那么一定就要支持不等距,最后问题就变成了怎么预留间距和插入的时候确定新的数值了 如果你觉得洗数据无所谓的话,还要什么设计呢?怎么写代码方便怎么来,每次有变化就洗数据就好了 |
14
whitev2 2019-07-31 17:03:27 +08:00
写成配置文件啊,要加 level 就改配置文件,程序重新读配置
|
15
SpiderShrimp 2019-07-31 17:05:12 +08:00
升降级用排序后的索引来做就可以了
|
16
akira 2019-07-31 17:09:58 +08:00
没有什么是加一层解决不了的。
之前是 状态 -》权值 修改成 状态 -》字符串标识 -》权值 代码里面,封装一个获取对应权值的函数,或者权值大小比较的函数应该就差不多了。 |
17
Vegetable 2019-07-31 17:11:09 +08:00
参照 loglevel
|
18
jifengg 2019-08-02 12:13:17 +08:00 via Android
level 就做 level 的事(显示,逻辑计算),给它加一个 order 属性,解决排序,且这个 order 是随时可以变的
|