ตัวอย่าง
ฉันเจอรหัสเสาหินที่ทำ "ทุกอย่าง" ในที่เดียว - โหลดข้อมูลจากฐานข้อมูลแสดงมาร์กอัพ HTML ทำหน้าที่เป็นเราเตอร์ / คอนโทรลเลอร์ / การกระทำ ฉันเริ่มใช้การย้ายรหัสฐานข้อมูล SRP ไปยังไฟล์ของตัวเองโดยให้การตั้งชื่อที่ดีขึ้นสำหรับสิ่งต่าง ๆ และมันก็ดูดี แต่แล้วฉันก็เริ่มสงสัยว่าทำไมฉันถึงทำแบบนี้
ทำไมต้องรีแฟคเตอร์ จุดประสงค์คืออะไร? มันไร้ประโยชน์หรือเปล่า? ประโยชน์คืออะไร โปรดทราบว่าฉันส่วนใหญ่ออกจากไฟล์เสาหินตามที่เป็นอยู่ แต่ refactored เฉพาะส่วนเล็ก ๆ ที่เกี่ยวข้องกับพื้นที่ที่ฉันต้องทำงานบางอย่าง
รหัสเดิม:
เพื่อเป็นตัวอย่างที่เป็นรูปธรรมฉันได้พบข้อมูลโค้ดนี้ - มันโหลดข้อมูลจำเพาะของผลิตภัณฑ์โดยใช้รหัสผลิตภัณฑ์ที่รู้จักหรือโดยรหัสรุ่นที่ผู้ใช้เลือก:
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:
เนื่องจากฉันทำงานบางอย่างที่ต้องให้ฉันเปลี่ยนสิ่งต่าง ๆ ในส่วนเฉพาะของรหัสนี้ฉันจึงเปลี่ยนเป็นรูปแบบพื้นที่เก็บข้อมูลและอัปเกรดให้ใช้สิ่งอำนวยความสะดวก 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();
}
}
ฉันควรทำสิ่งนี้หรือไม่
มองย้อนกลับไปที่การเปลี่ยนแปลงรหัสยังอยู่ที่นั่นรหัสที่มีฟังก์ชั่นเดียวกัน แต่ในไฟล์ต่าง ๆ ชื่อต่างสถานที่โดยใช้สไตล์เชิงวัตถุมากกว่ากระบวนงาน ที่จริงแล้วมันเป็นเรื่องตลกที่จะทราบว่ารหัส refactored ดูเหมือนป่องมากขึ้นแม้ว่าจะมีฟังก์ชั่นเดียวกันมาก
ฉันคาดหวังคำตอบบางอย่างที่พูดว่า "ถ้าคุณไม่ทราบสาเหตุที่คุณรับการสร้างใหม่อย่าทำอย่างนั้น" และบางทีฉันอาจเห็นด้วย เหตุผลของฉันคือการปรับปรุงคุณภาพของรหัสเมื่อเวลาผ่านไป (และความหวังของฉันคือฉันจะทำเช่นนั้นโดยทำตาม SRP และหลักการอื่น ๆ )
เหตุผลเหล่านั้นดีพอหรือฉันเสียเวลากับ "การจัดเรียงรหัสใหม่" ด้วยวิธีนี้หรือไม่ การรีฟอร์เมอร์โดยรวมนี้รู้สึกเหมือนใช้น้ำที่ไหลบ่าตรงไปตรงมา - ต้องใช้เวลาและจะกลายเป็น "แยก" มากขึ้นเท่าที่ SRP ดำเนินไป แต่แม้จะมีความตั้งใจที่ดีของฉันก็ตาม ดังนั้นการโต้วาทีหากเป็นการดีที่สุดที่จะปล่อยให้รหัสเป็นมาก่อนและไม่ refactor
ทำไมฉันถึง refactor ตั้งแต่แรก?
ในกรณีของฉันฉันกำลังเพิ่มฟังก์ชั่นใหม่สำหรับสายผลิตภัณฑ์ใหม่ดังนั้นฉันต้องทำตามโครงสร้างรหัสที่มีอยู่สำหรับสายผลิตภัณฑ์ที่คล้ายกันหรือเขียนเอง
select *
จะกลายเป็น "แนวปฏิบัติที่ดีที่สุด"
Select * from ..
สามารถถือเป็นรูปแบบการต่อต้าน ดูstackoverflow.com/q/3639861/31326