快速的背景:我的编程在PHP,我有一个领域模型与一个独立的数据访问层(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(tag)
  • createPopularList()

b) 创建一个大的方法,该方法可以做的一切:-createList(searchString,排序依据,filterByCategoryObject=null,filterByUserObject=null)

我很喜欢这个想法的(a)因为我的道接口更加简单并且不太可能需要更改(如:加入另一个参数的时候我突然需要通过在一个 日期 比较反对)很难当你拥有的东西一样的搜索关键词你想要能够结合与其他参数;例如:搜索类别清单、搜索受欢迎的清单、搜索标签清单等等。(a)是种什么我已经开始。

我有一个调情的重构,(b)但是我可以看到我的方法得到很大,非常复杂的相当快,很多的"如果"和"选择"s来处理不同的情况下,当建筑该SQL,以及大量的参数,纳入方法。但至少这一切都在一个地方。你可以结合起来的东西;例如:一个用户组,标记等等,匹配的关键词等等。

有帮助吗?

解决方案

你可以做一个私人的方法,所有公共方法的呼叫。即

private function _createList ( searchString, orderBy, ... )
{
    ...
}

public function createList()
{
    return $this->_createList('...', 'id');
}

public function createCategoryList()
{
    return $this->_createList('...', 'category_id');
}

那样如果你_createList功能需要更改以后你只需要重组公共方法在这个岛而不是所有类使用此道。

其他提示

我不认为这是严格的一种或情况。备选案文a是一个很好的易用的界面对你的道要让我认为你应该继续。我选项b,真的似乎是执行具体的逻辑。因此,如果大方法适合你的目的,我会说以用它来执行实际的处理逻辑,同时暴露出口作为在备选案文a。

这就是说,如果大方法变得过于复杂和复杂的和代码重复使用实际上是增加你的代码复杂性和降低应用程序的维护,那么你可能希望进行重构,以保持单独的SQL发言对每个界面的方法,但是有帮助的方法执行共同的逻辑分析的结果。

方法的选项B几乎被保证减少代码的再利用,并增加的复杂性和维护时间。

就个人而言,(和根据代码完整的)方法应当做的一件事情做好,而不是试图强加的一切。避免具有重构在未来,这样做明智的第一次。

编程的基础:这是很好的做法来打破你的代码成部分或功能。

我会去的选项(a);你会需要保持和调试的代码。当你这样做有一个错误,你将非常高兴的是,你已经拆了你的代码进入各种方法。

此外,编写的方法名称可以帮助你明白你正在做什么。

比较:

选项(a)

$obj->AddNewList( /* params */ );
$obj->UpdateList( /* params */ );

和这个:

备选办法(b)

$obj->parse( /* first set of params */ );
$obj->parse( /* second set of params */ );

这样可以节省时间作为人类从左到右。这就是为什么功能和方法的名称是总是找到在左边。

如果任一性能不是一个主要问题,或团体改变充分缓慢地使查询缓存是有用的你可以写过滤功能,并通过这些。如果你是循环的团体,并有一个可选阵列的筛选方法的循环将成为:

for(group in group) {
    cont = true
    for(f in functions) {
        if ! f(group) {cont = false; continue;}
    }
    if(cont) Continue
    add group to list
}

这会让你改变的过滤params没有改变环,只是写或改变一个功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top