在不增加复杂性的情况下重构代码重复



我有以下代码非常相似的简单方法,我喜欢提取出公共位,但如果它增加了方法的复杂性,则不会,有人可以给我一个例子甚至链接如何实现这一点吗?

下面是两个示例:

public function findRecipeById($id)  
{
   $query = "SELECT * FROM assets WHERE asset_type = 'recipe' AND asset_id = $id";
   ...fetch query data ...
}
public function findArticleById($id) 
{
   $query = "SELECT * FROM assets WHERE asset_type = 'article' AND asset_id = $id";
   ...fetch query data ...
}

如您所见,这两个只是一些非常简单的方法来说明我的问题,它们具有几乎相同的查询字符串,我能想到的唯一选择是将它们转换为以下方法:

public function findAssetById($assetType, $assetId)
{
   $query = "SELECT * FROM assets WHERE asset_type = '".$assetType."' AND asset_id = $id";
   ...fetch query data ...
}

所以我看到的问题是,我现在减少了代码的重复,将 2 个方法减少为 1 个,但同时我还通过引入更多参数创建了一个复杂度高于需要的方法。

这里没有说明的一些关键事项:

1)查询可能更大,并且

2)添加更多参数后,重构方法的复杂性可能会高得多。

我对专家的问题是,在这种情况下是否有更好的方法来减少代码重复而不会引入复杂性? 还是将其保留为 2 种更简单的方法更好?

谢谢!

尝试使你的代码更OOP。这就是数据映射器或活动记录模式如此受欢迎的原因。否则,您的代码违反了单一责任原则,它试图制作太多。

您的类应该处理文章或食谱,但不能同时处理两者。这是典型的错误,导致人们认为DB中的每个表都应该有一个表示它的类,但是您的对象不是DB表的再现,它们应该是简单对象或进程的表示。

出于同样的原因,明智的做法是将代码分解为更多的类,一个适用于单个对象,第二个适用于集合,在您的示例中,这将是文章,配方,文章集合,食谱集合以及这两个组的接口。

你可能想要创建一个基类,但前提是一种类型可能与应用中的某个位置的另一种类型进行多态切换。 不要只是为了删除代码重复,而是使用组合。

最新更新