วิธีการ "เขียนการทดสอบ + การปรับปรุงซ้ำจนผ่าน" มีลักษณะต่อต้านวิศวกรรมอย่างไม่น่าเชื่อ
ดูเหมือนว่าคุณมีความเข้าใจผิดเกี่ยวกับการปรับโครงสร้างและ TDD
การปรับโครงสร้างโค้ดเป็นกระบวนการในการเปลี่ยนซอร์สโค้ดของโปรแกรมคอมพิวเตอร์โดยไม่แก้ไขพฤติกรรมการทำงานภายนอกเพื่อปรับปรุงคุณลักษณะที่ไม่สามารถใช้งานได้บางส่วนของซอฟต์แวร์
ดังนั้นคุณไม่สามารถrefactorรหัสจนกว่าจะผ่าน
และ TDD โดยเฉพาะการทดสอบหน่วย (ซึ่งฉันพิจารณาการปรับปรุงหลักเนื่องจากการทดสอบอื่น ๆ ดูเหมือนจะเป็นไปได้สำหรับฉัน) ไม่ได้เกี่ยวกับการออกแบบส่วนประกอบใหม่จนกว่าจะใช้งานได้ มันเกี่ยวกับการออกแบบส่วนประกอบและทำงานเกี่ยวกับการใช้งานจนกว่าส่วนประกอบจะทำงานตามที่ออกแบบไว้
นอกจากนี้ยังเป็นสิ่งสำคัญที่จะเข้าใจจริงๆว่าหน่วยการทดสอบเกี่ยวกับการทดสอบหน่วย เนื่องจากมีแนวโน้มที่จะเขียนสิ่งต่าง ๆ มากมายตั้งแต่เริ่มต้นสิ่งสำคัญคือการทดสอบหน่วยงานดังกล่าว วิศวกรโยธารู้อยู่แล้วว่าสเป็คของยูนิตที่เขาใช้ (วัสดุต่าง ๆ ) และสามารถคาดหวังให้พวกเขาทำงานได้ สิ่งเหล่านี้เป็นสองสิ่งที่ไม่สามารถนำไปใช้กับวิศวกรซอฟต์แวร์ได้และเป็นวิศวกรรมเชิงวิชาชีพในการทดสอบหน่วยก่อนใช้งานเพราะมันหมายถึงการใช้ส่วนประกอบที่มีคุณภาพและผ่านการทดสอบ
หากวิศวกรโยธามีความคิดที่จะใช้เนื้อเยื่อเส้นใยใหม่เพื่อทำหลังคาคลุมสนามกีฬาคุณจะคาดหวังให้เขาทดสอบมันเป็นหน่วยคือกำหนดข้อกำหนดที่ต้องการ (เช่นน้ำหนักความสามารถในการซึมผ่านความเสถียร ฯลฯ ) และ หลังจากนั้นทดสอบและปรับแต่งจนกว่าจะพบพวกเขา
นั่นคือเหตุผลที่ TDD ทำงาน เพราะถ้าคุณสร้างซอฟต์แวร์ของหน่วยที่ทดสอบแล้วโอกาสจะดีกว่ามากเมื่อคุณเสียบมันเข้าด้วยกันและถ้าคุณไม่สามารถคาดหวังว่าปัญหาจะอยู่ในรหัสกาวของคุณสมมติว่าการทดสอบของคุณมีความครอบคลุมที่ดี
แก้ไข:การเปลี่ยนโครงสร้าง
หมายถึง: ไม่มีการเปลี่ยนแปลงในการทำงาน จุดหนึ่งของการเขียนการทดสอบหน่วยคือการทำให้มั่นใจว่าการปรับโครงสร้างจะไม่ทำลายรหัส ดังนั้น TDD จึงมีวัตถุประสงค์เพื่อรับรองว่าการปรับโครงสร้างจะไม่มีผลข้างเคียง
ความละเอียดไม่ได้เป็นเรื่องของมุมมองเพราะอย่างที่ฉันพูดหน่วยทดสอบหน่วยทดสอบและไม่ระบบโดยที่เม็ดถูกกำหนดอย่างแน่นอน
TDD สนับสนุนสถาปัตยกรรมที่ดี มันต้องการให้คุณกำหนดและใช้ข้อมูลจำเพาะสำหรับหน่วยทั้งหมดของคุณบังคับให้คุณออกแบบก่อนนำไปใช้ซึ่งค่อนข้างตรงกันข้ามกับสิ่งที่คุณคิด TDD สั่งการสร้างหน่วยที่สามารถทดสอบได้ทีละชิ้นและจะถูกแยกออกอย่างสมบูรณ์
TDD ไม่ได้หมายความว่าฉันจะทดสอบซอฟต์แวร์ที่สปาเก็ตตี้โค้ดและกวนพาสต้าจนกว่าจะผ่าน
ในทางตรงกันข้ามกับวิศวกรรมโยธาในวิศวกรรมซอฟต์แวร์โครงการมักจะวิวัฒนาการอย่างต่อเนื่อง ในงานวิศวกรรมโยธาคุณมีข้อกำหนดในการสร้างสะพานในตำแหน่ง A ที่สามารถบรรทุก x ตันและกว้างพอสำหรับยานพาหนะ n ต่อชั่วโมง
ในด้านวิศวกรรมซอฟต์แวร์ลูกค้าโดยทั่วไปสามารถตัดสินใจได้ทุกจุด (อาจเป็นหลังจากเสร็จสิ้น) เขาต้องการสะพานเพิ่มเป็นสองเท่าและเขาต้องการเชื่อมต่อกับมอเตอร์เวย์ที่ใกล้ที่สุดและต้องการให้มันเป็นสะพานยกเพราะ บริษัท ของเขา เมื่อเร็ว ๆ นี้เริ่มใช้เรือใบ
วิศวกรซอฟต์แวร์มีหน้าที่เปลี่ยนแปลงการออกแบบ ไม่ใช่เพราะการออกแบบของพวกเขามีข้อบกพร่อง แต่เป็นเพราะวิธีการทำงาน หากซอฟต์แวร์ได้รับการออกแบบมาอย่างดีสามารถออกแบบใหม่ได้ในระดับสูงโดยไม่ต้องเขียนส่วนประกอบระดับต่ำทั้งหมด
TDD เป็นเรื่องเกี่ยวกับการสร้างซอฟต์แวร์ด้วยส่วนประกอบที่ผ่านการทดสอบแยกต่างหากอย่างสูง ดำเนินการอย่างดีจะช่วยให้คุณตอบสนองต่อการเปลี่ยนแปลงข้อกำหนดได้อย่างรวดเร็วและปลอดภัยกว่าโดยไม่ต้องทำ
TDD เพิ่มข้อกำหนดให้กับกระบวนการพัฒนา แต่มันไม่ได้ห้ามวิธีการประกันคุณภาพอื่น ๆ ได้รับแล้ว TDD ไม่ได้ให้ความปลอดภัยเช่นเดียวกับการตรวจสอบอย่างเป็นทางการ แต่จากนั้นอีกครั้งการตรวจสอบอย่างเป็นทางการมีราคาแพงมากและเป็นไปไม่ได้ที่จะใช้ในระดับระบบ และยังถ้าคุณต้องการคุณสามารถรวมทั้งสอง
TDD ยังครอบคลุมการทดสอบอื่น ๆ นอกเหนือจากการทดสอบหน่วยซึ่งดำเนินการในระดับระบบ ฉันพบว่าง่ายต่อการอธิบาย แต่ยากที่จะดำเนินการและวัดยาก นอกจากนี้พวกเขามีเหตุผลมาก ในขณะที่ฉันเห็นความจำเป็นของพวกเขาจริงๆฉันไม่เห็นคุณค่าของพวกเขาเป็นความคิด
ในท้ายที่สุดไม่มีเครื่องมือใดแก้ปัญหาได้จริง เครื่องมือทำให้การแก้ปัญหาง่ายขึ้นเท่านั้น คุณสามารถถาม: สิ่วจะช่วยฉันด้วยสถาปัตยกรรมที่ยอดเยี่ยมได้อย่างไร ถ้าคุณวางแผนที่จะทำกำแพงตรงอิฐช่วยคุณได้ และใช่ได้รับถ้าคุณมอบเครื่องมือให้กับคนงี่เง่าเขาอาจจะตบมันด้วยเท้าของเขาในที่สุด แต่นั่นไม่ใช่ความผิดของสิ่วเท่าที่มันไม่ใช่ข้อบกพร่องของ TDD ที่ให้ความปลอดภัยกับมือใหม่ ใครไม่เขียนบททดสอบที่ดี
ดังนั้นที่บรรทัดล่างเราสามารถพูดได้ว่า TDD ทำงานได้ดีกว่าไม่มี TDD