需求里充斥着大量条件判断,有什么好的设计模式,便于后期维护的? 之前记得重构那本书里面是每个判断写成一个类

2021-04-01 22:31:11 +08:00
 yagamil

需求里面这样的,这些变量是由用户填写的,所以也不能根据自己的想法吧冗余的合并了,而且用户自己填错没有执行到判断,这个是用户自身问题,也不做提示。

不同的字母代表不同的值,当然可以设置为一样的
T1 分钟内涨幅≥A1 且 起始涨幅> B1 则买入后 S1 分钟卖出,
T2 分钟内涨幅≥A2 且 起始涨幅< B2 则买入后 S2 分钟卖出,
T3 分钟内跌幅≥A3 且 起始涨幅> B3 则买入后 S3 分钟卖出,
T4 分钟内跌幅≥A4 且 起始涨幅< B4 则买入后 S4 分钟卖出,

T5 分钟内 C5≤涨幅< A5,且 起始涨幅< D5,则买入后 S5 分钟卖出
T6 分钟内 C6≤涨幅< A6,且 起始涨幅> D6,则买入后 S6 分钟卖出
T7 分钟内 C7≤跌幅< A7,且 起始涨幅> D7,则买入后 S7 分钟卖出
T8 分钟内 C8≤跌幅< A8,且 起始涨幅< D8,则买入后 S8 分钟卖出
6112 次点击
所在节点    Python
35 条回复
yagamil
2021-04-02 08:43:52 +08:00
@turan12
@akira
@billlee
@cmdOptionKana 谢谢大家。
最后觉得就类的方式,每个决策做成一个类,主要为了后期维护方便

```
class BaseStrategy():
def __init__(self,
strategy_number=None,
monitor_time=None,
monitor_raise_min=None,
monitor_raise_max=None,
start_raise=None,
sell_time=None,
):
self.monitor_time = monitor_time,
self.monitor_raise_min = monitor_raise_min,
self.monitor_raise_max = monitor_raise_max,
self.start_raise = start_raise,
self.sell_time = sell_time,
self.strategy_number = strategy_number

def valid(self):
return True if self.monitor_time else False

def match_time(self, current):
return True if current >= self.monitor_time else False

def get_sell_time(self):
return self.sell_time

def start_raise_condition(self, v_value):
if self.strategy_number % 2 == 0:
return True if self.v_value < self.self.start_raise else False
else:
return True if self.v_value > self.self.start_raise else False

def meet(self, current, interval_raise_val, start_raise_val):
if self.valid() and self.match_time(current) and self.interval_raise(interval_raise_val) and self.start_raise_condition(start_raise_val):
return self.get_sell_time()
else:
return None



class StrategyCondition1(BaseStrategy):

def interval_raise(self, v_value):
return True if self.v_value >= self.self.monitor_raise_max else False


class StrategyCondition2(BaseStrategy):

def interval_raise(self, v_value):
return True if self.monitor_raise_min <= self.v_value < self.self.monitor_raise_max else False
```
shyrock
2021-04-02 08:59:09 +08:00
规则引擎就是适配这种需求的。
如果你的规则希望直接由业务人员定义,而且需要灵活变更规则,那么规则引擎比内置的设计模式要合适。
zhuweiyou
2021-04-02 09:55:22 +08:00
更倾向于做 parser
guyeu
2021-04-02 10:18:18 +08:00
万事不决 DSL
annielong
2021-04-02 12:16:30 +08:00
那就是一个设计器,最后根据条件生成判断,
matrix67
2021-04-02 12:29:27 +08:00
pancl
2021-04-02 12:39:09 +08:00
写表
shm7
2021-04-02 13:07:10 +08:00
规则本身很规范的话,批量处理规则就成为了肯能
1more
2021-04-02 13:14:29 +08:00
规则引擎或者 groovy 脚本引擎,后期维护事实和规则就行
cubecube
2021-04-02 15:05:33 +08:00
不要用责任链,除了增加别人的阅读障碍,没有任何明显提升。代码块抽成函数调用,好好取函数名即可。
我就旗帜鲜明的喜欢 if else
no1xsyzy
2021-04-02 15:51:22 +08:00
JetBrains MPS ?

我看到了什么?
> return True if self.v_value < self.self.start_raise else False
LeeReamond
2021-04-02 16:41:19 +08:00
@matrix67 他是 python,所以实际不是表驱动,更像是 mapdriven,哪个快不好说,大概率更慢
matrix67
2021-04-03 15:18:05 +08:00
@LeeReamond #32 这种逻辑一般不会是瓶颈吧。。。
LeeReamond
2021-04-03 17:43:14 +08:00
@matrix67 因为 python 本身慢,再加上没有 switchcase,这种逻辑比原生可能慢个几百倍。有重复运算的部分很容易瓶颈,确实需要找优化方案
tisswb
2021-04-08 16:11:41 +08:00
@LeeReamond 他来了他来了 他跟着 python3.10 走来了,match case 了解一下

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

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

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

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

© 2021 V2EX