1

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

这里有两个例子:

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 个更简单的方法会更好?

谢谢!

4

1 回答 1

0

尝试使您的代码更加面向对象。这就是为什么 Data Mappers 或 Active Record 模式如此受欢迎的原因。否则,你的代码违反了单一职责原则,它试图做太多。

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

出于同样的原因,将代码分解为更多类是明智的,一个与单个对象一起使用,第二个与集合一起使用,在您的示例中,这将是 Article、Recipe、ArticleCollection、RecipeCollection 以及可能用于这两个组的接口.

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

于 2015-06-21T17:40:30.857 回答