代码之家  ›  专栏  ›  技术社区  ›  Sisiutl

如何向应用程序添加可编程性

  •  7
  • Sisiutl  · 技术社区  · 16 年前

    我正在写一个应用程序,它的核心是一个规则引擎。用户希望能够定义自定义规则。其中一些将是相当简单的代数表达式,许多将涉及一些if-then分支逻辑,而有些甚至更复杂。我的选择是什么?

    我的用户非常聪明,精通T-SQL和Excel命令,并且通常熟悉编程结构,但他们不是“程序员”。 本身 .

    我考虑过使用vba/vsta;以某种方式与Excel进行交互;集成某种脚本语言(ruby?珀尔?TCL?)或者滚自己的。

    在所有可能的世界中,我将为他们提供一个具有颜色编码和类似智能感知的交互式帮助的编辑器,一个用于测试和试验的即时执行模式,以及一个单步调试程序。他们还需要能够保存、检索、编辑和执行他们的规则。燃烧速度并不重要。

    我的环境是windows/.net 3.5/c#

    有什么想法吗?

    13 回复  |  直到 16 年前
        1
  •  5
  •   Noufal Ibrahim    16 年前

    我不是Windows用户,所以我的答案不会 确切地 适合你的情况。我建议在应用程序中嵌入一个完整的脚本语言解释器。公开一些原语(即您希望公开的规则引擎部分),然后提供完整的解释器。我知道TCL、python和 Guile 设计成以这种方式嵌入。我个人推荐python,因为scheme(guile)有点深奥,而tcl似乎正在逐渐失势。

        2
  •  3
  •   Tad Donaghe    16 年前

    任何这样的实现都充满了风险。我将从尽可能小的一组定制开始,然后逐步从那里构建您的能力。

    不要试图一次将各种扩展性编程到其中,除非您已经有了很多这样做的技能。一次选择一个简单的能力-运行标准的SQL查询和返回记录集或其他。

        3
  •  2
  •   Giovanni Galbo    16 年前

    由于.NET是您的平台,嵌入Ironpython可能对您有用。事实上,Ironpython一本书的作者在一个产品中使用了Ironpython,这个产品看起来(表面上)与你正在做的有很多相似之处。我想它叫做分解器一号。

    编辑

    打电话 Resolver One

    这是他的链接 book .

        4
  •  2
  •   JasonTrue    16 年前

    这不是你想要的全部,但我会根据你的需要调查boo。在boo中构建一个对业务人员来说相对可读的DSL是相对容易的,这有很大的好处,即使他们不是直接编码规则的人。

    oren eini在boo中构建特定于领域的语言非常好,并且刚刚以最终形式出现。规则引擎是他研究的DSL的示例实现之一。boo是一种完全构建的、静态类型的、类似于python的.net语言,它有一个小而强大的社区,并且由于具有可扩展的编译器管道和一个非常好的语义智能宏系统,使得修改语言以适应特定的需要比几乎所有其他选择都容易。

    boo的好处在于,大多数DSL都是建立在一个提供所需“语言”的公共基类上的,但与编写硬编码规则的代码没有太大区别。您可以使语言看起来完全像您想要的那样,但不必担心手工解析或编写控制流命令或您期望语言具有的所有内容。

    有一些缺点:它不像python或ruby,文档大多是boo的源代码,而且社区很小。但如果你能“以身作则”,你就可以走得很远。适用于您的愿望清单的主要警告是代码完成;代码完成对于一些vs插件和sharpdevelop的支持有限,但是当您构建DSL时,几乎没有什么支持。

        5
  •  0
  •   deamon    16 年前

    不要发明自己的脚本语言!为一个系统学习一种新语言是不好的。我会尝试使用相对容易学习和理解的python。

        6
  •  0
  •   Andrej KirejeÅ­    16 年前

    Windows内置了Windows脚本主机引擎,有两个用于vbscript和jscript的解释程序。你可以很容易地使用它们。只需查看msdn以获取适当的COM接口。

        7
  •  0
  •   Pierre-Alain Vigeant    16 年前

    从经验上讲,因为我们的主要软件有一个脚本功能。

    我们使用 Actipro SyntaxEditor 作为我们的脚本设计师。我们最初的要求是“用户应该能够为字段编写公式”。该公式将用于验证字段的内容。“

    从那以后,我们用 Dynamic Linq . 用户可以编写公式,同时还可以添加数学函数和自定义函数。我们当时不需要更多,但现在看到了使用动态LINQ的局限性。

    如果我们要制作一个新版本的脚本引擎,我们现在将期待使用新的支持dlr的语言: IronPython IronRuby

        8
  •  0
  •   PhiLho    16 年前

    Lua可能是一个很好的解决方案。我真正想知道的是,将规则引擎与允许用户编写自己规则的脚本语言集成在一起有多复杂。

    一个好的方法是将所有内容(规则引擎也是)嵌入到脚本解释器中,否则最终会编写大量代码,将用户写入脚本的内容与程序中使用的相关规则连接起来。

    然而,设计这样的可编程性需要非常注意您的语言应该能够做什么,从一个小的实用程序核心开始,然后扩展它;或者您可以在开始整个实现之前真正计划很多,但是根据我的经验(目前为止我写得像3-4个口译员),更好的方法是在开发它的同时适应它。当然,有了用户的反馈:这是必要的,因为你可以假设他们有多好,但我不指望。

        9
  •  0
  •   PhiLho    16 年前

    对于一个诚实的上帝规则引擎,你可以考虑使用 Clips . clips是一个开源专家系统,可以嵌入到自己的应用程序中。

    如果您想要真正的脚本编写,有很多工具可以添加到使用Lua、Tcl、Rexx等语言的应用程序中。

    无论您做什么,都应该仔细检查许可证。将他人的代码嵌入到您的代码中,常常会影响到您如何授权生成的程序。

        10
  •  0
  •   Stephen    16 年前

    我们目前使用Mozilla的Spidermonkey在我们的Web应用程序中做这件事。它是一个JavaScript引擎,因此您可以创建自己的函数和对象,这些函数和对象与应用程序中的实际业务逻辑相对应。spidermonkey是一个Perl模块,它提供接口,但我相信有更多的语言可以使用它。

        11
  •  0
  •   Rodney    16 年前

    如果清楚地理解了结构和规则,那么我将模拟包含在Lucene(Java和.NET)中的查询接口。基本上,您的规则成为查询类型,您可以和/或它们以与Lucene相同的方式组合在一起。

    最后,您可以创建一个允许您的用户完成这项工作的界面。关键部分将是查询类型和关联的元数据,它们可以作为要在其上执行操作的项。

    例如,假设您的规则引擎是一个电子商务引擎,并且您允许您的用户定义规则,如果他们将某个特定产品添加到他们的购物篮中,这些规则将以折扣奖励客户。

    他们将选择一种与产品编号匹配的ProductQuery类型,然后成功完成ProductQuery将导致自动应用一个折扣路径。

    希望这有帮助。

        12
  •  0
  •   sdcoder    16 年前

    正如其他人所说,Lua是一种将脚本语言嵌入到应用程序中的快速而简单的方法。我们公司的产品有一个宏特性,我曾简单地考虑过将完整的脚本支持嵌入其中的想法。但最终我们认为训练会是一场噩梦。

    不管怎样,这是一个很好的介绍嵌入式Lua在C如果您选择的路线: http://blog.apterainc.com/software/embedding-lua-and-c/

        13
  •  0
  •   iChaib    16 年前

    不要使用嵌入式科学语言,而是考虑编程 图形语言 或者工具,如果您可以识别所有可能的规则并将它们映射到认可代码,那么您可以向最终用户提供 添加行为的简单方法 &以可视方式对其工作流执行操作(amp;A)。

    提供基于用户界面的规则引擎对于非编程人员来说更容易学习和方便。你可以一直 添加嵌入的脚本语言 ,自定义先前存在的操作,后者。

    此外,它是ETL中使用的常用工具,例如,为了创建业务规则