บ่อยครั้งแพทช์ / ผู้เปลี่ยนแปลงที่ "ซับซ้อน" นั้นเป็นคนที่ทำสิ่งต่าง ๆ มากมายในคราวเดียว มีรหัสใหม่รหัสที่ถูกลบรหัส refactored รหัสย้ายการทดสอบขยาย; มันทำให้ยากที่จะเห็นภาพรวม
เบาะแสที่พบบ่อยคือแพทช์มีขนาดใหญ่ แต่คำอธิบายนั้นเล็กมาก: "ใช้ $ FOO"
วิธีที่เหมาะสมในการจัดการแพทช์นี้คือการขอให้มันถูกแบ่งออกเป็นชุดชิ้นส่วนขนาดเล็กที่มีอยู่ในตัวเอง เช่นเดียวกับหลักการความรับผิดชอบเดี่ยวกล่าวว่าฟังก์ชั่นควรทำเพียงสิ่งเดียวแพทช์ควรมุ่งเน้นที่สิ่งเดียวเช่นกัน
ตัวอย่างเช่นแพทช์แรกอาจมีการปรับโครงสร้างเชิงกลอย่างหมดจดที่ไม่มีการเปลี่ยนแปลงการทำงานและจากนั้นแพทช์สุดท้ายสามารถมุ่งเน้นไปที่การใช้งานจริงและการทดสอบของ $ FOO ด้วยการรบกวนน้อยลงและฝูงนกแดง
สำหรับฟังก์ชันการทำงานที่ต้องใช้รหัสใหม่จำนวนมากรหัสใหม่มักจะสามารถนำมาใช้ในชิ้นทดสอบที่ไม่เปลี่ยนพฤติกรรมของผลิตภัณฑ์จนกว่าแพทช์สุดท้ายในชุดจริงเรียกรหัสใหม่ (พลิกธง)
สำหรับการทำแบบนี้ฉันมักจะพูดว่ามันเป็นปัญหาของฉันแล้วขอความช่วยเหลือจากผู้เขียน: "ฉันมีปัญหาในการติดตามทุกสิ่งที่เกิดขึ้นที่นี่คุณช่วยแบ่งแพทช์นี้ออกเป็นขั้นตอนเล็ก ๆ ด้วยกัน?" บางครั้งจำเป็นต้องให้คำแนะนำเฉพาะสำหรับขั้นตอนเล็ก ๆ
ดังนั้น patch ขนาดใหญ่เช่น "Implement $ FOO" จะกลายเป็นชุดข้อมูลแก้ไขดังนี้:
- แนะนำ Frobnicate รุ่นใหม่ที่ใช้ตัววนซ้ำคู่หนึ่งเพราะฉันจะต้องเรียกมันด้วยลำดับอื่นนอกเหนือจากเวกเตอร์เพื่อใช้ $ FOO
- สลับผู้โทรที่มีอยู่ทั้งหมดของ Frobnicate ให้ใช้เวอร์ชั่นใหม่
- ลบ Frobnicate เก่า
- Frobnicate กำลังทำมากเกินไป แยกขั้นตอน refrumple เป็นวิธีการของตนเองและเพิ่มการทดสอบสำหรับสิ่งนั้น
- แนะนำ Zerzify พร้อมการทดสอบ ยังไม่ได้ใช้ แต่ฉันจะต้องใช้ $ FOO
- ดำเนินการ $ FOO ในแง่ของ Zerzify และ Frobnicate ใหม่
โปรดทราบว่าขั้นตอนที่ 1-5 ไม่มีการเปลี่ยนแปลงการทำงานกับผลิตภัณฑ์ พวกเขาตรวจสอบได้เล็กน้อยรวมถึงการทำให้แน่ใจว่าคุณมีการทดสอบที่ถูกต้องทั้งหมด แม้ว่าขั้นตอนที่ 6 จะยังคง "ซับซ้อน" อย่างน้อยก็จะเน้นไปที่ $ FOO และบันทึกจะช่วยให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับวิธีการใช้ $ FOO (และทำไม Frobnicate จึงเปลี่ยน)