【发布时间】:2015-06-05 09:46:59
【问题描述】:
我正在尝试找到一种设计模式(或maybe an algorithm),它可以帮助我以更简洁的方式编写这些规则。有什么建议吗?
def get_rules(user, value):
if 500 <= value < 5000 and not user.address:
return [REQUEST_ADDRESS]
if value >= 5000:
if not user.address and not user.phone:
return [REQUEST_ADDRESS, REQUEST_PHONE]
if user.address and not user.phone:
return [REQUEST_PHONE]
if not user.address and user.phone:
return [REQUEST_ADDRESS]
# Potentially ~20 more conditions here based on various attributes of user
return [STATES.REQUEST_NONE]
注意:我不是在寻找规则引擎,因为我不想通过在 python 中添加“业务友好”的 DSL 来使我的代码复杂化。 Python 本身就是一种编写这些规则的简单语言。
有趣的阅读:http://martinfowler.com/bliki/RulesEngine.html(但我仍然试图远离“框架”来为我做这件事)。
【问题讨论】:
-
我的错,更新了sn-p。
amount什么都不是,它只是value,它可以是一个变量,我需要根据它做出决定。 -
为什么不建立一个列表并将您需要请求的值添加到该列表中?这消除了很多情况。
-
当然,我会这样做的。但这不会减少 if-else 检查。
-
肯定会,因为你不需要检查'if a and not b, if not a and not b',而是'if not a, if not b,如果不是 c'。您将拥有
n案例,而不是所有这些案例组合。 -
我明白你的建议,这看起来更干净我希望有一个解决方案可能使用多态性来摆脱 if-else。可能是我想多了。
标签: python business-rules