我一直在缓慢但肯定地重构我客户的一个网站,以改进整体业务逻辑并避免重复代码。我一直从事的主要领域之一是基本购物车应用程序中的产品:
- 项目搜索,对数据库使用 SQL 查询
- 产品详细信息模板
- 查看购物车
- 结帐(输入地址,确认订单,提交)
围绕产品有许多业务规则,例如:
- 哪些产品是可见的
- 某些用户可以查看哪些产品
- 哪些产品可以订购
- 可以订购每种产品的格式
- 等等
多年来,所有这些规则都在整个网站中重复出现——一些在 SQL 查询中,一些在应用程序逻辑中,一些在两者中——并且它们在某些页面上的实现方式是不同的。事实上,一些规则并没有在某些页面上实施(不是设计使然)。
还创建了新的子应用程序,它们具有不同的规则。
因此,无论在何处显示产品,我都实现了“产品”类的使用,该类包含应用程序逻辑中的所有业务规则(即 Product.isViewable()、Product.isOrderable() 等)。
这允许通过扩展 Product 类在每个具有该应用程序特定规则的子应用程序中使用产品数据。
我目前唯一的问题是项目搜索页面,它查询数据库并包含许多“旧”业务规则,使用 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"
);
}
这让我发疯,因为它本质上仍然是重复的代码,如果业务规则发生变化,这两个部分都需要管理。
在某些地方我只显示几个项目(例如“类似项目”小部件以及“查看购物车”),我可以简单地从数据库中选择产品密钥,然后遍历这些值以创建产品实例并使用类中的业务规则来确定是否/如何显示产品。
但是,项目搜索查询最多可以返回 2000 条记录,并且我不能 [实际上] 循环超过 2000 条记录,创建 2000 个实例来根据业务规则确定显示。
有任何想法吗?