Misal
Tek bir yerde "her şeyi" yapan monolitik kodla karşılaştım - veritabanından veri yükleme, HTML işaretlemesi gösterme, yönlendirici / denetleyici / eylem gibi davranma. SRP hareketli veritabanı kodunu kendi dosyasına uygulamaya başladım, işler için daha iyi adlandırma sağladım ve hepsi iyi görünüyordu, ama sonra neden bunu yaptığım konusunda şüphelerim var.
Neden refactor? Amaç ne? Yararsız mı? Avantajı nedir? Monolitik dosyayı olduğu gibi bıraktığımı, ancak sadece biraz iş yapmam gereken alanla ilgili olan daha küçük kısmı yeniden düzenlediğimi unutmayın.
Orijinal kod:
Somut bir örnek vermek gerekirse, bu kod snippet'ine rastladım - ürün özelliklerini bilinen bir ürün kimliğiyle veya kullanıcı tarafından seçilen bir sürüm kimliğiyle yükler:
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 */
yeniden düzenleme:
Kodun bu özel kısmındaki şeyleri değiştirmemi gerektiren bazı işler yaptığım için, depo desenini kullanacak şekilde değiştirdim ve nesne yönelimli MySQL olanaklarını kullanacak şekilde yükselttim:
//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();
}
}
Bunu yapmalı mıyım?
Değişikliklere baktığımızda, kod hala orada, aynı işlevselliğe sahip kod, ancak farklı dosyalarda, farklı adlarda, yerlerde, yordam yerine daha nesne yönelimli bir stil kullanıyor. Aslında, yeniden düzenlenmiş kodun aynı işlevselliğe sahip olmasına rağmen çok daha şişkin göründüğünü belirtmek komik.
Bazı cevapları "Refactor'unuzun nedenini bilmiyorsanız, yapmayın" diyerek tahmin ediyorum ve belki de katılıyorum. Nedenlerim zaman içinde kod kalitesini artırmak (ve umarım bunu SRP ve diğer ilkeleri izleyerek yapacağım).
Bu yeterince iyi nedenler mi yoksa "kodumu yeniden düzenlemede" zamanımı bu şekilde mi harcıyorum? Genel olarak yeniden düzenleme, dürüst olmak için su arıtmak gibi geliyor - zaman alıyor ve SRP'nin gittiği kadar daha "ayrılıyor" ama iyi niyetime rağmen inanılmaz iyileştirmeler yapıyormuşum gibi hissetmiyorum. Bu nedenle, kodu eskisi gibi bırakmak en iyisi ise tartışmak.
İlk etapta neden yeniden düzenleme yaptım?
Benim durumumda, yeni bir ürün grubu için yeni işlevler ekliyorum, bu yüzden benzer ürün grupları için mevcut kod yapısını izlemem ya da kendiminkini yazmam gerekiyor.
select *
"en iyi uygulama" haline gelir.
Select * from ..
bir anti-desen olarak kabul edilebilir. Bkz. Stackoverflow.com/q/3639861/31326