例
我遇到了在一个地方完成所有工作的整体代码-从数据库加载数据,显示HTML标记,充当路由器/控制器/动作。我开始应用SRP将数据库代码移动到其自己的文件中,从而为事物提供了更好的命名,而且看起来都不错,但是随后我开始怀疑为什么要这样做。
为什么要重构?什么目的?它没用吗?有什么好处?请注意,我基本上保留了整体文件,但只重构了与需要进行某些工作的区域相关的较小部分。
原始代码:
举一个具体的例子,我遇到了以下代码片段-它通过已知的产品ID或用户选择的版本ID加载产品规格:
if ($verid)
$sql1 = "SELECT * FROM product_spec WHERE id = " . clean_input($verid);
else
$sql1 = "SELECT * FROM product_spec WHERE product_id = " . clean_input($productid) ;
$result1 = query($sql1);
$row1 = fetch_array($result1);
/* html markup follows */
重构:
由于我正在做一些工作,要求我在代码的此特定部分中进行更改,因此我将其更改为使用存储库模式,并将其升级为使用面向对象的MySQL工具:
//some implementation details omitted
$this->repository = new SpecRepository($mysql);
if ($verid)
$row1 = $this->repository->getSpecByVersion($verid);
else
$row1 = $this->repository->getSpecByProductId($productid);
/* html markup follows to be refactored or left alone till another time*/
//added new class:
class SpecRepository extends MySqlRepository
{
function getSpecByVersion(int $verid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE id = ?
", $verid)->getSingleArray();
}
function getSpecByProductId(int $productid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE product_id = ?
", $productid)->getSingleArray();
}
}
我应该这样做吗?
回顾这些变化,代码仍然存在,代码具有相同的功能,但是在不同的文件,不同的名称,位置,使用的是更多面向对象的样式,而不是过程式的。实际上,有趣的是,尽管重构的代码具有相同的功能,但看起来却显得肿得多。
我预见到一些答案,说“如果您不知道重构的原因,那就不要这样做”,也许我会同意。我的理由是随着时间的推移提高代码质量(我希望我会遵循SRP和其他原则来这样做)。
这些理由足够好吗?还是我浪费时间在这种“重新排列代码”上?总体而言,这听起来有点像踩水-花费时间,并且就SRP而言,它变得更加“分离”,但是尽管我有良好的意愿,但我感觉自己并没有做出令人惊奇的改进。因此,讨论是否最好像以前那样保留代码而不进行重构。
我为什么要重构?
就我而言,我正在为新产品线添加新功能,因此我必须遵循类似产品线的现有代码结构,或者编写自己的代码。
select *
将成为“最佳实践”。
Select * from ..
可以认为是反模式。参见stackoverflow.com/q/3639861/31326