快速背景:我正在用 PHP 编程,我有一个域模型,它有一个单独的数据访问层(DAO 类),负责从数据库中获取数据并创建域类。
假设我有一个 DAO 类负责创建group和groupList对象。您可以将群组想象为社交网络的一个组成部分;尽管对于这个问题,它们是什么并不重要。
我需要能够要求 DAO根据各种不同的标准为我制作各种groupList对象:
- 最近添加的组
- 最受欢迎的团体
- 被管理员标识为“精选”的群组
- 用特定标签标记的组
- 与某个关键字匹配的组
- 特定类别中的组
- 某个人创建的群组
- 在某一天创建的组
其中一些我现在实际上并不需要,但我可以想象在项目完成之前我会需要它们。现在我从一个不错的简单 DAO 方法开始:createList。这很好用。您可以将伪代码视为:
find out how many groups
create SQL query to fetch group details
loop through results
{
create group object
add to group list object
}
随着我的应用程序的进展,我创建了一个新方法createFeaturedList。这很好用。但它实际上与createList非常相似,只是查询略有不同。大约 150 行代码的其余大部分是相同的。
那么...对于我需要的所有略有不同的情况,我该怎么办?大多数时候,我真的只是想根据某些标准对列表进行过滤和排序。问题是——我应该:
a)创建许多专注的创作方法,例如:
- 创建列表()
- 创建类别列表(类别对象)
- 创建用户列表(用户对象)
- 创建标签列表(标签)
- 创建流行列表()
或者
b)创建一个可以做所有事情的 BIG 方法: - createList ( searchString, orderBy, filterByCategoryObject=null, filterByUserObject=null )
我非常喜欢(a)的想法,因为我的 DAO 接口更简单,不太可能需要更改(例如:当我突然需要传递一个日期来比较时添加另一个参数)当你有搜索之类的东西时,困难就来了您希望能够与其他参数组合的关键字;例如:搜索类别列表、搜索热门列表、搜索标签列表等... (a) 是我开始使用的。
我对重构 (b) 进行了调情,但我可以看到我的方法变得非常大而且非常复杂,而且在构建 SQL 时有很多“if”和“select”来处理不同的情况,并且输入该方法的许多参数。但至少这一切都在一个地方。你可以把东西结合起来;例如:一个用户的组,用 blah 标记,匹配关键字 blah。