对特定时间跨度有效的业务规则 - 如何以有序的方式进行管理

时间:2011-06-30 17:49:17

标签: oop design-patterns business-rules ooad

我刚刚开始为政府机构工作,我遇到了一个有趣的问题:业务规则取决于立法机关,因此他们必须尊重立法机关活跃的确切时间段。

举个例子,如果一个主题在某个特定日期申请了补贴,那么他必须根据该特定日期的血管有效标准进行评估。同样的补贴,适用于某些日后申请的人有不同的标准。 我想知道是否有一种已知的模式来有序地处理这些依赖于时间的规则。目前,代码中散布着类似于:

的表达式

if application.date >”July 17th, 2008”

管理此问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:7)

这看起来像Chain of Responsibility的情况。你们每个立法机构都有处理程序。您首先将应用程序传递给最新的处理程序。如果它太旧了,它会把它传递给前立法机关的处理程序。

答案 1 :(得分:5)

您可以使用一些模式。例如,使用您可以在对象上创建的temporal property pattern,其中包含在某个特定时间点处于活动状态的业务规则。此外,使用specification pattern您可以创建基于特定日期生效的业务规则。您可以将effective date范围与每个策略相关联,以便可以决定是否应用给定策略。本书Analysis Patterns包含许多可适用于您的方案的模式。

编辑: 我的意思是链接到temporal object模式而不是temporal属性。这可能会对实现数据库映射有所启发。

答案 2 :(得分:1)

如果规则很复杂,您可能需要(business) rules engine。我不知道您的平台有哪些实现,但对于Java,典型的选择是Drools及其Expert subproject。它定义了用于定义规则的特定于域的语言。请注意,它可能具有非Java用户的接口。

否则,您可以尝试Strategy pattern之类的内容 - 您有一个包含两种方法appliesTo(date)handle(data)的策略列表。您迭代列表,如果策略适用于日期 - 让它处理数据。

答案 3 :(得分:0)

在架构层面,有两种方法来解决这个问题。

第一个是在对数据应用业务逻辑之前将数据ETL到仓库。我更喜欢这种方法。

有时候,这是不可能的 - 即,在将数据写入OLTP(用于填充数据仓库的源)之前,业务逻辑应用于数据,因此您别无选择。在这种情况下,此问题通常称为 快速变化的维度 问题。 (我的假设是你的问题中提到的数据存储在维度表而不是事实表中。)

网上有很多关于这个主题的commentary。在这些来源中,我推荐Ralph Kimball的任何文章(免费)或书籍(非免费)。

调和迅速变化的维度的最佳方式几乎肯定是事实具体的;仍然,也许最常见的技术是c *创建一个新的维度表*,它存储应用于新业务逻辑的数据。换句话说,您将在DW模式中为每个业务规则提供单独的维度表。