YES ที่ดังก้องด้วย TDD (และมีข้อยกเว้นเล็กน้อย)
เป็นที่ถกเถียงกันอยู่ แต่ฉันก็เถียงว่าใครก็ตามที่ตอบว่า "ไม่" สำหรับคำถามนี้จะหายไปจากแนวคิดพื้นฐานของ TDD
สำหรับฉันคำตอบคือดังก้องใช่ถ้าคุณทำตาม TDD หากคุณไม่ได้ไม่ใช่คำตอบที่เป็นไปได้
DDD ใน TDD
TDD มักอ้างว่าให้ประโยชน์หลักแก่เจ้า
- ป้องกัน
- มั่นใจได้ว่ารหัสอาจมีการเปลี่ยนแปลงแต่ไม่ได้พฤติกรรมของมัน
- สิ่งนี้ช่วยให้มีการปฏิบัติที่สำคัญอย่างยิ่งต่อการปรับโครงสร้างใหม่
- คุณได้รับ TDD นี้หรือไม่
- ออกแบบ
- คุณระบุสิ่งที่สิ่งที่ควรจะทำอย่างไร, วิธีการที่ควรจะทำงานก่อนที่จะใช้มัน
- สิ่งนี้มักจะหมายถึงการตัดสินใจดำเนินการอย่างมีข้อมูลมากขึ้น
- เอกสาร
- ชุดทดสอบควรทำหน้าที่เป็นเอกสารข้อกำหนด (ข้อกำหนด)
- การใช้การทดสอบเพื่อวัตถุประสงค์ดังกล่าวหมายความว่าเอกสารและการใช้งานอยู่ในสภาพที่สอดคล้องกันเสมอ - การเปลี่ยนแปลงหนึ่งหมายถึงการเปลี่ยนแปลงอื่น ๆ เปรียบเทียบกับข้อกำหนดการออกแบบและการเก็บรักษาในเอกสารคำแยกต่างหาก
แยกความรับผิดชอบจากการปฏิบัติ
ในฐานะโปรแกรมเมอร์มันดึงดูดความสนใจอย่างมากที่จะคิดว่าคุณลักษณะเป็นสิ่งที่มีความสำคัญและได้รับและตั้งค่าเป็นค่าใช้จ่ายบางอย่าง
แต่คุณลักษณะเป็นรายละเอียดการใช้งานในขณะที่ setters และ getters เป็นส่วนต่อประสานสัญญาที่ทำให้โปรแกรมใช้งานได้จริง
มันสำคัญกว่าการสะกดว่าวัตถุควร:
อนุญาตให้ลูกค้าเปลี่ยนสถานะ
และ
อนุญาตให้ไคลเอนต์เพื่อสอบถามสถานะ
ดังนั้นวิธีการจัดเก็บสถานะนี้จริง ๆ (ซึ่งเป็นแอตทริบิวต์ที่พบมากที่สุด แต่ไม่ใช่วิธีเดียว)
การทดสอบเช่น
(The Painter class) should store the provided colour
เป็นสิ่งสำคัญสำหรับส่วนเอกสารของ TDD
ความจริงที่ว่าการใช้งานในที่สุดนั้นเป็นเรื่องเล็กน้อย (คุณลักษณะ) และไม่มีประโยชน์ในการป้องกันที่ควรทราบสำหรับคุณเมื่อคุณเขียนการทดสอบ
ขาดวิศวกรรมไปกลับ ...
หนึ่งในปัญหาสำคัญในโลกของการพัฒนาระบบคือการขาด วิศวกรรมไปกลับ1 - กระบวนการพัฒนาของระบบถูกแยกส่วนเป็นกระบวนการย่อยที่แยกจากกันซึ่งเป็นสิ่งประดิษฐ์ที่ (เอกสาร, รหัส) มักไม่สอดคล้องกัน
1 Brodie, Michael L. "John Mylopoulos: การเย็บเมล็ดของการสร้างแบบจำลองแนวคิด" การสร้างแบบจำลองแนวคิด: รากฐานและการประยุกต์ Springer Berlin Heidelberg, 2009. 1-9.
... และวิธีการแก้ปัญหาของ TDD
เป็นส่วนเอกสารของ TDD ที่ทำให้มั่นใจได้ว่าข้อกำหนดของระบบและรหัสของมันสอดคล้องกันเสมอ
ออกแบบก่อนใช้ในภายหลัง
ภายใน TDD เราเขียนการทดสอบการยอมรับที่ล้มเหลวก่อนจากนั้นเขียนโค้ดที่ให้พวกเขาผ่าน
ภายใน BDD ระดับสูงกว่าเราเขียนสถานการณ์ก่อนจากนั้นจึงทำให้มันผ่าน
เหตุใดคุณจึงควรยกเว้นผู้ตั้งค่าและผู้ทะเยอทะยาน?
ในทางทฤษฎีมันเป็นไปได้อย่างสมบูรณ์แบบใน TDD สำหรับคนคนหนึ่งที่จะเขียนการทดสอบและอีกคนหนึ่งที่จะใช้รหัสที่ทำให้มันผ่าน
ดังนั้นถามตัวเอง:
บุคคลที่เขียนแบบทดสอบสำหรับชั้นเรียนควรพูดถึงผู้ได้รับและผู้ตั้งตัว
เนื่องจาก getters และ setters เป็นส่วนต่อประสานสาธารณะกับคลาสคำตอบคือใช่แน่นอนหรือจะไม่มีวิธีตั้งค่าหรือสอบถามสถานะของวัตถุ
เห็นได้ชัดว่าถ้าคุณเขียนรหัสก่อนคำตอบอาจไม่ชัดเจน
ข้อยกเว้น
มีข้อยกเว้นบางประการที่ชัดเจนสำหรับกฎนี้ - ฟังก์ชั่นที่มีรายละเอียดการนำไปใช้งานที่ชัดเจนและไม่ได้เป็นส่วนหนึ่งของการออกแบบระบบอย่างชัดเจน
ตัวอย่างเช่นวิธีโลคอล 'B ()':
function A() {
// B() will be called here
function B() {
...
}
}
หรือฟังก์ชั่นส่วนตัวsquare()
ที่นี่:
class Something {
private:
square() {...}
public:
addAndSquare() {...}
substractAndSquare() {...}
}
หรือฟังก์ชั่นอื่น ๆ ที่ไม่ได้เป็นส่วนหนึ่งของส่วนpublic
ต่อประสานที่ต้องการการสะกดคำในการออกแบบส่วนประกอบของระบบ