ก่อนอื่นให้สร้าง API ใหม่นั่นคือสิ่งที่คุณต้องการให้พฤติกรรม API ใหม่ของคุณเป็น หากเกิดขึ้นว่า API ใหม่นี้มีชื่อเหมือนกับ OLDER API ฉันจะผนวกชื่อ _NEW ต่อท้ายชื่อ API ใหม่
int DoSomethingInterestingAPI ();
กลายเป็น:
int DoSomethingInterestingAPI_NEW (int takes_more_arguments); int DoSomethingInterestingAPI_OLD (); int DoSomethingInterestingAPI () {DoSomethingInterestingAPI_NEW (Anything_default_mimics_the_old_API); ตกลง - ในขั้นตอนนี้ - การทดสอบการถดถอยทั้งหมดของคุณผ่านบัตรผ่าน - ใช้ชื่อ DoSomethingInterestingAPI ()
ถัดไปอ่านรหัสของคุณและเปลี่ยนการโทรทั้งหมดเป็น DoSomethingInterestingAPI () เป็นตัวแปรที่เหมาะสมของ DoSomethingInterestingAPI_NEW () ซึ่งรวมถึงการอัปเดต / เขียนใหม่ส่วนใดของการทดสอบการถดถอยของคุณจะต้องเปลี่ยนเพื่อใช้ API ใหม่
ถัดไปทำเครื่องหมาย DoSomethingInterestingAPI_OLD () เป็น [[คัดค้าน ()]] เก็บ API ที่เลิกใช้ไว้นานเท่าที่คุณต้องการ (จนกว่าคุณจะได้รับการอัปเดตรหัสทั้งหมดอย่างปลอดภัยที่อาจต้องพึ่งพา)
ด้วยวิธีนี้ความล้มเหลวใด ๆ ในการทดสอบการถดถอยของคุณก็คือบั๊กในการทดสอบการถดถอยหรือระบุข้อบกพร่องในรหัสของคุณ - ตามที่คุณต้องการ ขั้นตอนการแก้ไขขั้นตอนนี้โดยการสร้าง API ของ _NEW และ _OLD อย่างชัดเจนจะช่วยให้คุณมีบิตของรหัสใหม่และเก่าที่อยู่ร่วมกันชั่วขณะหนึ่ง
นี่เป็นตัวอย่างที่ดี (ยาก) ของแนวทางนี้ในทางปฏิบัติ ฉันมีฟังก์ชัน BitSubstring () - ที่ฉันใช้วิธีการที่มีพารามิเตอร์ที่สามเป็น COUNT บิตใน substring เพื่อให้สอดคล้องกับ API และรูปแบบอื่น ๆ ใน C ++ ฉันต้องการเปลี่ยนเป็นเริ่มต้น / สิ้นสุดเป็นอาร์กิวเมนต์ของฟังก์ชัน
https://github.com/SophistSolutions/Stroika/commit/003dd8707405c43e735ca71116c773b108c217c0
ฉันสร้างฟังก์ชัน BitSubstring_NEW ด้วย API ใหม่และอัปเดตโค้ดทั้งหมดของฉันเพื่อใช้งานนั้น (ไม่ต้องเรียกอีกต่อไปเป็น BitSubString) แต่ฉันออกจากการใช้งานสำหรับการเปิดตัวหลายครั้ง (เดือน) - และทำเครื่องหมายว่าเลิกใช้แล้ว - เพื่อให้ทุกคนสามารถเปลี่ยนเป็น BitSubString_NEW (และในเวลานั้นเปลี่ยนอาร์กิวเมนต์จากการนับเป็นรูปแบบเริ่มต้น / สิ้นสุด)
จากนั้น - เมื่อการเปลี่ยนแปลงดังกล่าวเสร็จสมบูรณ์ฉันได้กระทำการลบ BitSubString () อีกครั้งและเปลี่ยนชื่อ BitSubString_NEW-> BitSubString () (และเลิกใช้ชื่อ BitSubString_NEW)