业务里有判断一个数是否在一个区间需求, 要求可以动态配置,
要是写成(-∞, -600]∪[600, +∞)
这样,
对用户(理解集合的意义)会直白很多,
并且在数据库里保存一个 char 类型的字段就可以通用.
问: 有没有类似的轮子,最好技术栈是python
.
1
rrfeng 2020-04-27 13:45:07 +08:00
没学过的很难理解吧?不要高估你的用户。
建议直观一点: 小于 xx 或者 大于 xx |
2
RRRoger OP @rrfeng #1 原文:“没学过的很难理解吧?不要高估你的用户。建议直观一点:小于 xx 或者 大于 xx”
====== 回复:小于大于要用到好几个字段, 并且不灵活,这只是一个配置, 所以改动的不多, 用户都是本科以上 |
3
RRRoger OP 实在不行, 就自己撸一个简陋版的
|
4
airfling 2020-04-27 13:54:06 +08:00
这个其实几段代码就可以代码,不知道 python 有没有 java 中的继承。
~~~ public enum IntervalType implements ValueObject<IntervalType> { /** * 默认,最原始支持的模式 */ DEFAULT("默认", 2, new Default()), /** * 等值 */ EQ("=a", 1, new Equal()), /** * 不等于 */ NOT_EQ("!=a", 1, new NotEqual()), /** * 大于 */ GT(">a", 1, new GraterThan()), /** * 小于 */ LT("<a", 1, new LessThan()), /** * 大于等于 */ GT_EQ(">=a", 1, new GraterThanAndEqual()), /** * 小于等于 */ LT_EQ("<=a", 1, new LessThanAndEqual()), /** * 范围 */ BETWEEN("∈[a,b]", 2, new Between()), /** * 左开范围 */ LEFT_BETWEEN("∈(a,b]", 2, new LeftOpenBetween()), /** * 右开范围 */ RIGHT_BETWEEN("∈[a,b)", 2, new RightOpenBetween()), /** * 双开范围 */ OPEN_BETWEEN("∈(a,b)", 2, new OpenBetween()); private String value; private Interval interval; private int valueNumber; /** * 此方法在页面调用 * * @return number */ @SuppressWarnings("unused") public int getValueNumber() { return valueNumber; } public String getValue() { return value; } /** * 获取转换后的区间 * * @param alertType 报警类型 * @param values 相关阈值 * @return 区间 */ public String getInterval(int alertType, String... values) { return this.interval.convert(alertType, values); } /** * 与{@link #getInterval 相反的一个方法} * * @param interval 区间 * @return 报警相关的阈值 */ public String[] resolveInterval(String interval) { if (this.interval instanceof Default) { return PattenUtils.reverseResolve(interval); } return PattenUtils.regexNumber(interval); } IntervalType(String value, int valueNumber, Interval interval) { this.value = value; this.valueNumber = valueNumber; this.interval = interval; } @Override public boolean sameValueAs(final IntervalType other) { return this.equals(other); } public class GraterThan implements Interval { @Override public String convert(int alertType, String... number) { return "(" + number[0] + ",∞)"; } } ~~~ |
5
lithbitren 2020-04-27 13:56:41 +08:00
如果仅限于数字和正负无穷的话,其他表达式直接插 f-string 也可以接受,实现起来似乎并不难,不过估计应该是有人做过,唯一吐槽的就是数学符号在 idle 里打起来麻烦,改成其他约定符号加上运算符重载,理论上应该可以做到直接用表达式完成判断。
|
6
littleshy 2020-04-27 13:57:28 +08:00
|
7
Vegetable 2020-04-27 13:58:24 +08:00
是你觉得直白还是用户觉得直白了?你不觉得键鼠输入表达式很麻烦吗?
前端应该是一个表单输入条件,先选择运算符,<=,再输入值-600,然后单击新增规则,选择运算符>=,输入值 600 |
8
RRRoger OP @Vegetable #7 原文:“是你觉得直白还是用户觉得直白了?你不觉得键鼠输入表达式很麻烦吗?前端应该是一个表单输入条件,先选择运算符,<=,再输入值-600,然后单击新增规则,选择运算符>=,输入值 600”
====== 回复:这个方案是我暂定方案, 我觉得这样会灵活, 而且用户也很容易看懂, 这只是一个配置项 |
10
princelai 2020-04-27 14:30:41 +08:00
我印象中 postgreSQL 可以干这个事情
|
11
fkdog 2020-04-27 15:21:25 +08:00
需求很怪。
但是这种自己区间转不等式的自己不能编码解决吗? |
12
daozhihun 2020-04-27 17:33:40 +08:00
我觉得不要用这样的东西去表示,用户好不好理解不说,主要输入也很麻烦。
先不说无穷大,并集符号等问题,用户输入错了是个麻烦事,你怎么提示他少了个括号或者开闭区间的上下界写反了? 向上面说的橹个>=之类的表单更合适 |
13
stevenkang 2020-04-27 17:39:31 +08:00
感觉这样容易弄出线上 bug,一会儿这里没输入对,一会儿那里没输入对。
|
14
zhuangzhuang1988 2020-04-27 17:45:19 +08:00
RPLY
|
15
Licia 2020-04-28 09:29:00 +08:00
∪这种符号输入很麻烦吧,比如我就只会复制
|
16
siweipancc 2020-04-28 12:17:02 +08:00 via iPhone
参考一下 guava?
|