代码之家  ›  专栏  ›  技术社区  ›  Darius Kucinskas

读取存储在XML文件中的业务规则的优雅方式

  •  2
  • Darius Kucinskas  · 技术社区  · 15 年前

    我必须阅读XML文件中存储的业务规则(我使用的是VC++/MFC/MSXML)。XML由规则组成。每个规则都有一组条件和操作。对于这样的系统,什么是优雅的OOP设计?如果您需要这样一个系统的设计者,您会使用什么设计模式?

    更新:

    xml示例:

    
       <rules>
          <!--  rule no. 1 -->
          <rule name="rule no. 1">
             <conditions>
                <condition name="condition no. 1" type="ATTR_EMPTY">
                   <parameters>
                      <parameter name="attribute_name">ttt</parameter>
                      <parameter name="workflow_id">3</parameter>
                      <parameter name="workflow_state_id">5</parameter>
                   </parameters>
                </condition>
                <condition name="condition no. 2" type="ATTR_EMPTY">
                   <parameters>
                      <parameter name="attribute_name">ttt</parameter>
                      <parameter name="enviroment_id">3</parameter>
                   </parameters>
                </condition>
             </conditions>
             <actions>
                <action name="action no. 1" type="ATTR_CLEAR">
                   <parameters>
                      <parameter name="attribute_name">ttt</parameter>
                   </parameters>
                </action>
             </actions>
          </rule>
       </rules>
    
    7 回复  |  直到 15 年前
        1
  •  1
  •   Tim Matthews    15 年前

    编辑:

    好吧,投反对票,所以这不是你想要的答案。

    您可能会得到一个oo设计,但您需要发布一个xml片段或详细的规范。

        2
  •  1
  •   Assaf Lavie    15 年前

    您打算如何在内存中建模这些规则?

    在内存中表示这些规则的一种方法是使用更高级的编程语言(例如python)。用执行调用C++对象的等效流将XML规则转换为Python代码。事实上,我过去这样做是为了实现一个规则系统。我使用JavaScript作为规则的序列化格式(在JS中比在XML中更容易定义规则,可读性也更高),也作为实际执行的代码(我使用SpiderMonkey来执行C++<->JS)。但是,你可以在任何具有C++绑定的流行脚本语言中进行。

        3
  •  1
  •   anon anon    15 年前

    很难从这样一个简短的描述中分辨出来,但我会让每个规则都成为一个管理自己的条件和动作的对象。这些规则将由工厂根据XML创建,并存储在某种字典中。

        4
  •  1
  •   Robert Gould    15 年前

    我会考虑两种设计,一种是一次性评估器(你的应用程序运行一次规则与数据,然后退出),在这种情况下,我会使用 XML SAX 具有处理数据的回调的解析器

    另一个是DOM解析器,它使用一个由条件(检查)类和动作类组成的规则类在内存中缓存规则。

        5
  •  1
  •   Bambax    15 年前

    规则部分看起来有点像Schematron:

    http://www.schematron.com/elements.html

    这是一种用XML和ISO标准编写的XML验证语言。

    假设(正在验证的)源数据也是XML格式的,一种方法是将规则集转换为Schematron(这在XSLT中并不难),然后使用Schematron“基础结构”(即样式表)根据Schematron文件验证内容。

    这将生成一个结果XML文件,显示哪些规则得到满足,哪些没有得到满足;然后,您可以执行与每个已验证规则关联的“操作”(转换?)。

        6
  •  1
  •   McGovernTheory    15 年前

        7
  •  0
  •   cuteCAT    15 年前

    用XML编写业务规则很麻烦。此外,C++还不是XML处理的好语言。

    您的应用程序可以通过活动脚本公开其属性,并在VBScript/JScript中编写规则。通过这种方式,您可以在运行时评估规则。

    如果定义规则需要XML,我将用Java、JavaScript或XSLT等高级语言分别编写处理器。在后台运行处理器,并在C++应用程序中获取返回值。