ข้ามไปยังเนื้อหา

บทนำและหลักการ

code แทบไม่เคยมาถึงมือเราในสภาพสะอาดเรียบร้อย ส่วนใหญ่โตขึ้นมาใต้เส้นตาย โดนแปะแก้โดยคนที่ย้ายงานไปแล้ว และสะสมทางลัดจนไม่มีใครกล้าแตะ Refactoring คือวินัยที่ดึงรูปทรงของ code แบบนั้นกลับมาให้อ่านออกและแก้ไหว — โดยไม่ เปลี่ยนสิ่งที่ผู้ใช้ได้รับ

โมดูลแรกนี้ว่าด้วยแนวคิดที่อยู่เบื้องหลังการลงมือ ส่วนที่เหลือของคอร์สเป็นแคตตาล็อกท่าเฉพาะ แต่ท่าที่ไม่มีหลักการรองรับก็เป็นแค่การแก้แบบเสี่ยงดวง จบบทเรียนทั้งห้านี้แล้วคุณจะบอกได้แม่น ๆ ว่า refactoring คืออะไร อธิบายได้ว่าคุ้มกับเวลาที่เสียไปตรงไหน และทำตามจังหวะที่คุ้มกันคุณไว้ระหว่างลงมือ

Refactoring ปรับปรุงโครงสร้าง ภายใน ของ code โดยไม่เปลี่ยน behavior ภายนอก

ทุกอย่างในคอร์สนี้แขวนอยู่กับประโยคเดียวนั้น ถ้าคุณเปลี่ยนสิ่งที่โปรแกรมทำ — แก้บั๊ก เพิ่มฟีเจอร์ เปลี่ยน output — นั่นก็เป็นงานที่มีคุณค่า แต่ไม่ใช่ refactoring การแยกสองกิจกรรมนี้ออกจากกันนี่แหละที่ทำให้ทั้งคู่ปลอดภัย

Refactoring ไม่ใช่การเขียนใหม่ยกแผงแบบฮีโร่ แต่เป็น loop แน่น ๆ ของก้าวเล็กจิ๋วที่ย้อนกลับได้ และทุกก้าวต้องผ่านการยืนยันก่อนจะไปก้าวถัดไป คุณดมกลิ่น smell เจอ เปลี่ยนเล็ก ๆ หนึ่งครั้งโดยรักษา behavior ไว้ รัน test แล้ว commit ถ้า test แดงก็ undo แล้วลองก้าวที่เล็กลงกว่าเดิม จากนั้นวนใหม่

flowchart LR
  A["Spot a smell"] --> B["Make one<br/>small change"]
  B --> C["Run the tests"]
  C -->|green| D["Commit"]
  C -->|red| E["Undo,<br/>try smaller"]
  E --> B
  D --> A
loop ของ refactoring: ดมกลิ่น ก้าวเล็ก ๆ ทดสอบ commit ทำซ้ำ

loop นี้คือจังหวะหัวใจของทุกเรื่องที่ตามมา การ refactoring ก้อนใหญ่ที่ดูน่ากลัว จริง ๆ ก็แค่ก้าวเล็ก ๆ ที่ปลอดภัยหลายร้อยก้าวต่อกันเป็นสาย

บทเรียนสิ่งที่คุณจะได้ติดตัวไป
refactoring คืออะไร?นิยามที่แม่นยำซึ่งรักษา behavior ไว้ และกฎ “สองหมวก”
ทำไมและเมื่อไหร่ผลตอบแทน technical debt กฎลูกเสือ และเมื่อไหร่ที่ ไม่ ควร refactor
ก้าวเล็ก ๆ และ testloop แบบละเอียด และเหตุผลที่ตาข่ายจาก test ทำให้ loop นี้ได้ผล
การอ่าน code smellตัวกระตุ้นที่บอกคุณว่า จะ refactor อะไร และควรหยิบท่าไหนมาใช้

เรียนจบโมดูลนี้แล้วก็พร้อมลุยแคตตาล็อกภาคปฏิบัติ เริ่มที่ Composing Methods

ประเภท Code Smellตัวอย่างที่พบบ่อยโมดูลที่จัดการ
Function ยาวและซับซ้อนLong Method, Duplicated Code, Magic NumberComposing Methods
Feature อยู่ผิดที่Feature Envy, Large Class, Data ClumpsMoving Features
ข้อมูลไม่มีขอบเขตPrimitive Obsession, Mutable Data, Global DataOrganizing Data
API เรียกใช้ยากLong Parameter List, Flag Argument, Misleading NameSimplifying APIs
เงื่อนไขอ่านยากComplex Conditional, Nested If, Null CheckSimplifying Conditionals
Hierarchy ไม่ตรงความจริงRefused Bequest, Speculative GeneralityGeneralization & Inheritance
อะไรคือคุณสมบัติที่นิยามว่าอะไรเป็น refactoring?
จังหวะหัวใจของ refactoring ที่อธิบายในโมดูลนี้คืออะไร?
ถ้า refactoring ทำให้ test กลายเป็นสีแดง ควรทำอย่างไร?