[code smells]Extract Method แยกฟังก์ชันให้เป็นอิสระ
1 min readJul 22, 2019
ปัญหา
ในหนึ่งฟังก์ชันมีการทำงานหลายอย่างในตัว และไม่รู้ว่าฟังก์ชันมันทำงานอะไรกันแน่
[Golang]
func PrintOwing() {
PrintBanner()
// Print details.
fmt.Println("name: ", name)
fmt.Println("amount: ", GetOutstanding())
}
วิธีการ Extract Method
- สร้างฟังก์ชันใหม่และตั้งชื่อให้ชัดเจนว่ามันทำอะไร
- copy code ที่จะแยกมาจากฟังก์ชันหลักมาใส่ในฟังก์ชันที่สร้างมาใหม่ ลบ code ที่อยู่ฟังก์ชันเดิมออก แล้วเปลี่ยนเป็นการเรียกใช้ฟังก์ชันที่สร้างขึ้นมาใหม่แทน
หาตัวแปรที่ใช้ในส่วนที่ย้ายในฟังก์ชันหลัก จากนั้นก็ย้ายไปยังฟังก์ชันใหม่แทนเพื่อให้การทำงานของโปรแกรมยังเหมือนเดิม - ถ้ามีตัวแปรที่ใช้ทั้งในฟังก์ชันหลักและฟังก์ชันที่แยกออกไป ก็ให้ pass paramiters เข้าไปยังฟังก์ชันที่แยกออก
- ถ้ามีตัวแปรในฟังก์ชันที่แยกออกไปมีการเปลี่ยนแปลงค่า ให้ return ค่ากลับไปยังฟังก์ชันหลักด้วย เพื่อในการทำงานของฟังก์ชันยังเหมือนเดิม
[Golang]
func PrintOwing() {
PrintBanner()
printDetail(GetOutstanding())
}func printDetail(standing int){
fmt.Println("name: ", name)
fmt.Println("amount: ", standing)
}
สิ่งที่ได้จากการ refactor
- Code อ่านง่ายขึ้น และฟังก์ชันใหม่ที่แยกออกไปชื่อจะอธิบายการทำงานชันเจนขึ้น เช่น
createOrder()
,renderCustomerInfo()
- ลดการซำ้ของ Code ในโปรแกรมเพราะถ้ามีส่วนไหนที่ทำงานเหมือนกันก็เพียงแค่เรียกใช้ ฟังก์ชันที่สร้างขึ้นมาใหม่เลย
- Code จะไม่มี dependent กันและยังหาจุดผิดได้ง่ายอีกด้วย