Contoh
Saya menemukan kode monolitik yang melakukan "segalanya" di satu tempat - memuat data dari basis data, menunjukkan markup HTML, bertindak sebagai router / controller / action. Saya mulai menerapkan kode database bergerak SRP ke file sendiri, memberikan penamaan yang lebih baik untuk hal-hal, dan semuanya terlihat bagus, tapi kemudian saya mulai ragu mengapa saya melakukan ini.
Mengapa refactor? Apa tujuannya? Apakah itu tidak berguna? Apa manfaatnya? Perhatikan bahwa saya kebanyakan meninggalkan file monolitik seperti apa adanya, tetapi hanya me-refacted bagian yang lebih kecil yang relevan dengan area di mana saya perlu melakukan beberapa pekerjaan.
Kode asli:
Untuk memberikan contoh nyata, saya menemukan potongan kode ini - ia memuat spesifikasi produk baik oleh id produk yang dikenal, atau oleh id versi yang dipilih pengguna:
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:
Karena saya sedang melakukan pekerjaan yang mengharuskan saya untuk mengubah hal-hal di bagian kode ini, saya mengubahnya untuk menggunakan pola repositori dan memutakhirkannya untuk menggunakan fasilitas MySQL berorientasi objek:
//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();
}
}
Haruskah saya melakukan ini?
Melihat kembali perubahan, kodenya masih ada, kode dengan fungsi yang sama, tetapi dalam file yang berbeda, nama yang berbeda, tempat, menggunakan gaya berorientasi objek yang lebih daripada prosedural. Sebenarnya itu lucu untuk dicatat bahwa kode refactored terlihat jauh lebih besar meskipun memiliki fungsi yang sama.
Saya memperkirakan beberapa jawaban mengatakan "jika Anda tidak tahu alasan mengapa Anda menolak, jangan lakukan itu", dan mungkin saya mungkin setuju. Alasan saya adalah untuk meningkatkan kualitas kode dari waktu ke waktu (dan harapan saya adalah bahwa saya akan melakukannya dengan mengikuti SRP dan prinsip-prinsip lain).
Apakah itu alasan yang cukup baik atau saya membuang-buang waktu saya pada "menata ulang kode sekitar" dengan cara ini? Secara keseluruhan, refactoring ini terasa seperti menginjak air dengan jujur - ini membutuhkan waktu dan menjadi lebih "terpisah" sejauh SRP berjalan tetapi meskipun ada niat baik saya, saya tidak merasa seperti saya melakukan perbaikan yang luar biasa. Karenanya, berdebat apakah yang terbaik untuk meninggalkan kode seperti sebelumnya dan bukan refactor.
Mengapa saya refactor sejak awal?
Dalam kasus saya, saya menambahkan fungsionalitas baru untuk lini produk baru, jadi saya harus mengikuti struktur kode yang ada untuk lini produk serupa, atau menulis sendiri.
select *
menjadi "praktik terbaik."
Select * from ..
dapat dianggap sebagai anti-pola. Lihat stackoverflow.com/q/3639861/31326