2015-05-15 163 views
0

我在写一些使用很多规则的系统。现在是我组织它们并使其高效的时候了。主要要求是 - 商业友好,易于理解,易于查找,易于维护,可测试。Python中的规则引擎

这个问题不是关于如何创建规则引擎。我不写一个。我的目标是想方设法在一个地方维护很多规则。并让它变得容易。我需要一些专业建议如何去做,采取什么方法。以下是我已经证明我正在从事这项工作的例子,而不是简单地要求某人去做我的工作。

到目前为止,我有3种方法:

1)阵列类型

item=context.GetNextItem() 
if ['banana','apple','orange'].Contains(item): EatRaw(item) 
if ['banana','apple','potato'].Contains(item): BakeAndEat(item) 
if ['meat','egg','potato','fish'].Contains(item): FryAndEat(item) 
if ['pasta','egg','potato'].Contains(item): BoilAndEat(item) 

2)每个项目分隔的文件:

item=context.GetNextItem() 
execfile(str(item)+'.py') 

#banana.py: 
EatRaw(item) 
BakeAndEat(item) 

#potato.py:  
BakeAndEat(item) 
FryAndEat(item) 
BoilAndEat(item) 

3) 存储数据库

item=context.GetNextItem() 
SQL = "SELECT rule FROM rules where item='"+str(item)+"';" 
for row in cursor.execute(SQL): 
    eval(row.rule+"(str("+item+"))") 

表规则

banana,EatRaw 
banana,BakeAndEat 
potato,BakeAndEat 
potato,FryAndEat 
potato,BoilAndEat 

3.A)数据文件

文件RULES.txt

banana,EatRaw 
banana,BakeAndEat 
potato,BakeAndEat 
potato,FryAndEat 
potato,BoilAndEat 

该文件可能是视为一个用户界面。

每种方法都有自己的缺点和优点,但说实话,我对任何方面都不满意。文件越来越庞大,难以搜索,维护和理解。任何其他方法或建议是受欢迎的。

+1

谢谢。这不是代码问题,它是方法问题。 – Alex

+2

@larsks:Code Review对于“更高级别的体系结构和软件系统设计”的问题显然不是*,我相信这个问题是关于。 –

+0

@ Qantas94Heavy:然而,这里也不是,只有更多。这是我的最好建议。 – larsks

回答

2

让我们放大这一说法:

主要要求是 - 商业友好,易于理解

但是,您的方法至今都容易程序员理解,但不特别容易让的商业用户了解。

您即将从错误的方向这个问题,你开始用“的数据结构是良好的人体工程学”,而不是用“企业如何将用户查看或修改‘规则’”

开始好几轮的UI设计。一旦你有了这些,把它放在潜在的用户面前(如果有的话),那么实现将自然地遵循,无论哪个模型或支持生成的UI工作和使用的方式。

编辑:

一个“UI”不一定是看中了单个页面的JavaScript应用程序,它可以对获得由cron作业每天阅读一个特定的网络中共享的文本文件,这仍然是一个“用户接口”。以兼顾业务用户需求和可用预算的方式进行设计。

+0

我完全同意。如果它是销售系统,那么我会这样做。然而,当它用于内部使用时,创建用户界面是矫枉过正的。我很乐意这样做,但我不确定企业会为此付出代价。没有太多“程序员”功能的清晰易懂的代码就足够了。再一次,我完全同意用户界面或DCL或真正的规则引擎会更好......但是,实际上,我不是写规则引擎,而是我们自己的系统只有很多规则 – Alex