Beispiel
Ich bin auf monolithischen Code gestoßen, der "alles" an einem Ort erledigt - Daten aus der Datenbank laden, HTML-Markup anzeigen und als Router / Controller / Aktion fungieren. Ich begann SRP anzuwenden, um Datenbankcode in eine eigene Datei zu verschieben, um bessere Namen für die Dinge zu erhalten, und alles sah gut aus, aber dann begann ich Zweifel zu haben, warum ich das tue.
Warum umgestalten? Was ist der Zweck? Ist es nutzlos Was ist der vorteil Beachten Sie, dass ich die monolithische Datei größtenteils so belassen habe, wie sie ist, aber nur den kleineren Teil überarbeitet habe, der für den Bereich relevant war, in dem ich etwas arbeiten musste.
Originalcode:
Um ein konkretes Beispiel zu geben, bin ich auf dieses Code-Snippet gestoßen - es lädt Produktspezifikationen entweder über eine bekannte Produkt-ID oder über eine vom Benutzer ausgewählte Versions-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 */
Refactoring:
Da ich einige Arbeiten erledige, bei denen ich Änderungen an diesem bestimmten Teil des Codes vornehmen muss, habe ich das Repository-Muster geändert und es aktualisiert, um objektorientierte MySQL-Funktionen zu verwenden:
//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();
}
}
Soll ich das machen
Rückblickend auf die Änderungen ist der Code immer noch vorhanden, Code mit derselben Funktionalität, aber in unterschiedlichen Dateien, unterschiedlichen Namen und Orten, wobei eher ein objektorientierter Stil als ein prozeduraler verwendet wird. Eigentlich ist es lustig zu bemerken, dass der überarbeitete Code trotz der gleichen Funktionalität viel aufgeblähter aussieht.
Ich sehe einige Antworten mit den Worten "Wenn Sie nicht wissen, warum Sie umgestalten, tun Sie es nicht", und vielleicht stimme ich Ihnen zu. Meine Gründe sind, die Qualität des Codes im Laufe der Zeit zu verbessern (und ich hoffe, dass ich dies tun werde, indem ich SRP und andere Prinzipien befolge).
Sind das gute Gründe oder verschwende ich meine Zeit damit, Code auf diese Weise neu zu ordnen? Um ehrlich zu sein, fühlt sich das Umgestalten insgesamt ein bisschen wie das Treten von Wasser an - es braucht Zeit und wird in Bezug auf SRP "getrennter", aber trotz meiner guten Absichten habe ich nicht das Gefühl, dass ich erstaunliche Verbesserungen mache. Daher wird überlegt, ob es am besten ist, den Code wie zuvor zu belassen und nicht umzugestalten.
Warum habe ich überhaupt umgestaltet?
In meinem Fall füge ich einer neuen Produktlinie neue Funktionen hinzu, sodass ich entweder der vorhandenen Codestruktur für ähnliche Produktlinien folgen oder meine eigene schreiben muss.
select *
wird dies zu einer "Best Practice".
Select * from ..
ein Anti-Muster betrachtet werden kann. Siehe stackoverflow.com/q/3639861/31326