例
データベースからデータをロードし、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