gpt4 book ai didi

oop - 如何在 SQL 查询和应用程序逻辑 (ColdFusion 8) 之间集中业务规则?

转载 作者:行者123 更新时间:2023-12-02 00:13:30 25 4
gpt4 key购买 nike

我一直在缓慢但肯定地重构我客户的一个网站,以改进整体业务逻辑并避免重复代码。我一直从事的主要领域之一是基本购物车应用程序中的产品:

  1. 项目搜索,对数据库使用 SQL 查询
  2. 产品详情模板
  3. 查看购物车
  4. 结帐(输入地址、确认订单、提交)

围绕产品有很多业务规则,例如:

  • 哪些产品是可见的
  • 某些用户可以查看哪些产品
  • 哪些产品可以订购
  • 可以订购每种产品的格式
  • 等等

多年来,所有这些规则在整个网站上都是重复的 - 一些在 SQL 查询中,一些在应用程序逻辑中,一些在两者中 - 并且它们在某些页面上的实现方式不同。事实上,某些规则并未在某些页面上实现(并非设计使然)。

也创建了新的子应用程序,它们具有不同的规则。

因此,无论在何处显示产品,我都实现了“产品”类的使用,它包含应用程序逻辑中的所有业务规则(即 Product.isViewable()、Product.isOrderable() 等。 ).

这允许通过扩展 Product 类,在每个具有该应用程序特定规则的子应用程序中使用 Product 数据。

我目前遇到的唯一问题是 Item Search 页面,它查询数据库并包含许多“旧”业务规则,结合使用 ColdFusion 应用程序逻辑(if/else 等)和 SQL 条件。下面是 SQL 查询的片段:

            WHERE   (
LTRIM(RTRIM(UCASE(STATUS))) = 'ACTIVE'
OR UCASE(VIEWABLE_IF_RETIRED_FLAG) = 'Y'
)
<cfif SESSION.User.getSecurityLevel() LT 5>
AND (
UCASE(ORDERABLE_FLAG) = 'Y'
OR UCASE(ELECTRONIC_ORDERABLE_FLAG) = 'O'
OR UCASE(ELECTRONIC_ORDERABLE_FLAG) = 'V'
)
</cfif>

这些相同的规则在 Product 类中实现:

    function isVisibleIfRetired() {
return getVisibleIfRetiredFlag() == "Y";
}

function isActive() {
return getStatus() == "ACTIVE";
}

function isDigitalViewable() {
return UCase(getIsProductOrderableFlag()) == "Y"
&& (
UCase(getElectronicOrderableStatus()) == "V"
|| UCase(getElectronicOrderableStatus()) == "O"
);
}

这让我抓狂,因为它本质上仍然是重复代码,如果业务规则发生变化,这两部分都需要管理。

有些地方我只显示几个项目(例如“类似项目”小部件,以及“查看购物车”),我可以简单地从数据库中选择产品 key ,然后循环这些值来创建 Product 实例并使用类中的业务规则来确定是否/如何显示产品。

但是,项目搜索查询最多可以返回 2000 条记录,我无法 [实际上] 循环超过 2000 条记录来创建 2000 个实例来根据业务规则确定显示。

有什么想法吗?

最佳答案

想一想:如果您要创建一个规则界面会怎样。 IE 一组描述规则的 CFC。如果它们都实现了相同的接口(interface)(明确地或通过鸭子类型),那么您可以装饰您的数据访问对象和其他类,例如您的 Product 类。

这些规则的 API 可能类似于(伪代码):

component name="product is visible"{

function ruleAsSqlFragment(){
// return a chunk of SQL here that you can drop right into your query and would cause the query to be filtered as you wish.
return "LTRIM(RTRIM(UCASE(STATUS))) = 'ACTIVE'
OR UCASE(VIEWABLE_IF_RETIRED_FLAG) = 'Y'";
}

function validateRule(object){
// this function might accept an object, validate it according to its rules and return true or false
return object.isActive() or object.getViewableIfRetired()
}

}

然后您可以制作一组这些规则来装饰您的对象:

rules = [isVisibleRule,isSomethingElseRule,etc];

在您的对象中,您可以简单地遍历数组并调用适当的函数来评估规则或生成正确的 SQL 片段。仅当函数或 SQL 语法计算结果为真时才满足规则。

总的来说,我不确定使用传统的 SQL 方法是否可以完全避免重复的业务逻辑。毕竟它们都是(SQL 和 CF)不同的语言。

我想另一种选择是定义一种领域特定语言 (DSL) 并使用它来定义您的规则。然后编写一个组件,可以将这些规则转换为 SQL 或根据对象对其进行评估。然后找到一种方法,以正确的方式将 DSL 中定义的特定规则关联到您的组件中,并根据需要对其进行评估。

另一个挑战是您的数据库看起来并没有完全反射(reflect)您的对象模型,这很典型。如果是这种情况,我很确定您只需要尽可能地尝试隔离此逻辑。

关于oop - 如何在 SQL 查询和应用程序逻辑 (ColdFusion 8) 之间集中业务规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com