【发布时间】:2010-11-27 02:07:10
【问题描述】:
快速背景:我正在使用 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) 创造许多专注的创作方法,例如:
- createList()
- createCategoryList(categoryObject)
- createUsersList (userObject)
- createTagList(标签)
- createPopularList ()
或
b) 创建一个可以做所有事情的 BIG 方法: - createList (searchString, orderBy, filterByCategoryObject=null, filterByUserObject=null)
我非常喜欢 (a) 的想法,因为我的 DAO 接口更简单,不太可能需要更改(例如:当我突然需要传入一个 date 进行比较时添加另一个参数) 当您有诸如搜索关键字之类的东西希望能够与其他参数结合时,困难就来了;例如:搜索类别列表、搜索热门列表、搜索标签列表等... (a) 是我开始使用的。
我对重构 (b) 有过兴趣,但我可以看到我的方法很快变得非常庞大和复杂,在构建SQL,以及许多输入该方法的参数。但至少这一切都在一个地方。你可以把东西结合起来;例如:一个用户的组,用 blah 标记,匹配关键字 blah。
【问题讨论】: