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

2021 年 4 月 1 日
 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 分钟卖出
7617 次点击
所在节点    Python
35 条回复
yagamil
2021 年 4 月 2 日
@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 年 4 月 2 日
规则引擎就是适配这种需求的。
如果你的规则希望直接由业务人员定义,而且需要灵活变更规则,那么规则引擎比内置的设计模式要合适。
zhuweiyou
2021 年 4 月 2 日
更倾向于做 parser
guyeu
2021 年 4 月 2 日
万事不决 DSL
annielong
2021 年 4 月 2 日
那就是一个设计器,最后根据条件生成判断,
matrix67
2021 年 4 月 2 日
pancl
2021 年 4 月 2 日
写表
shm7
2021 年 4 月 2 日
规则本身很规范的话,批量处理规则就成为了肯能
1more
2021 年 4 月 2 日
规则引擎或者 groovy 脚本引擎,后期维护事实和规则就行
cubecube
2021 年 4 月 2 日
不要用责任链,除了增加别人的阅读障碍,没有任何明显提升。代码块抽成函数调用,好好取函数名即可。
我就旗帜鲜明的喜欢 if else
no1xsyzy
2021 年 4 月 2 日
JetBrains MPS ?

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

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

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

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

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

© 2021 V2EX