【问题标题】:Recfactoring duplication of codes without adding complexity?在不增加复杂性的情况下重构代码重复?
【发布时间】:2015-06-11 04:49:32
【问题描述】:

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

这里有两个例子:

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

谢谢!

【问题讨论】:

  • 看起来这样更主观?

标签: refactoring dry code-complexity


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢伙计,我太专注于眼前的问题,忘了退后一步。使用单独的类来缩小任务范围是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多