ฉันได้ยินคนพูดว่าควรทดสอบหน่วย (เช่น nUnit, jUnit, xUnit)
(เช่นการทดสอบหน่วยควรมี "รหัสชื้น" ไม่ใช่ "รหัสแห้ง")
พวกเขากำลังพูดเกี่ยวกับอะไร?
ฉันได้ยินคนพูดว่าควรทดสอบหน่วย (เช่น nUnit, jUnit, xUnit)
(เช่นการทดสอบหน่วยควรมี "รหัสชื้น" ไม่ใช่ "รหัสแห้ง")
พวกเขากำลังพูดเกี่ยวกับอะไร?
คำตอบ:
ชื้นและแห้งไม่ได้ขัดแย้งค่อนข้างจะสมดุลสองด้านที่แตกต่างกันของรหัสของการบำรุงรักษา รหัสที่รักษาได้ (รหัสที่เปลี่ยนแปลงได้ง่าย) คือเป้าหมายสูงสุดที่นี่
ในการบำรุงรักษารหัสคุณต้องเข้าใจรหัสก่อน เพื่อให้เข้าใจคุณต้องอ่าน พิจารณาสักครู่ว่าคุณใช้เวลาอ่านโค้ดนานแค่ไหน มันเป็นจำนวนมาก. DAMP เพิ่มการบำรุงรักษาโดยการลดเวลาที่จำเป็นในการอ่านและทำความเข้าใจรหัส
การลบการทำซ้ำช่วยให้มั่นใจได้ว่าทุกแนวคิดในระบบมีการแสดงที่มีสิทธิ์เพียงหนึ่งเดียวในรหัส การเปลี่ยนแนวคิดทางธุรกิจเพียงอย่างเดียวส่งผลให้โค้ดมีการเปลี่ยนแปลงเพียงครั้งเดียว DRY เพิ่มการบำรุงรักษาโดยแยกการเปลี่ยนแปลง (ความเสี่ยง) ไปยังส่วนต่าง ๆ ของระบบที่ต้องเปลี่ยนเท่านั้น
การทดสอบมักจะมีการทำซ้ำโดยเนื้อแท้เพราะพวกเขากำลังทดสอบสิ่งเดียวกันซ้ำแล้วซ้ำอีกเฉพาะกับค่าอินพุตหรือรหัสการตั้งค่าที่แตกต่างกันเล็กน้อย อย่างไรก็ตามแตกต่างจากรหัสการผลิตการทำซ้ำนี้มักจะแยกเฉพาะกับสถานการณ์ในการทดสอบ / ไฟล์เดียว ด้วยเหตุนี้การทำสำเนาจึงมีน้อยและชัดเจนซึ่งหมายความว่ามีความเสี่ยงน้อยกว่าโครงการซ้ำกว่าประเภทอื่น ๆ
นอกจากนี้การลบการทำสำเนาชนิดนี้จะลดความสามารถในการอ่านของการทดสอบ รายละเอียดที่เคยทำซ้ำในการทดสอบแต่ละครั้งจะถูกซ่อนไว้ในวิธีการหรือคลาสใหม่ เพื่อให้ได้ภาพเต็มของการทดสอบคุณต้องนำชิ้นส่วนเหล่านี้กลับมารวมกัน
ดังนั้นเนื่องจากการทำสำเนารหัสทดสอบมักมีความเสี่ยงน้อยกว่าและส่งเสริมความสามารถในการอ่านจึงง่ายที่จะดูว่ามันถือว่าเป็นที่ยอมรับได้อย่างไร
ตามหลักการให้ใช้ DRY ในรหัสการผลิตโปรดปราน DAMP ในรหัสทดสอบ ในขณะที่ทั้งสองมีความสำคัญเท่าเทียมกันด้วยภูมิปัญญาเล็กน้อยคุณสามารถทิปยอดเงินในความโปรดปรานของคุณ
DAMP - วลีที่สื่อความหมายและมีความหมาย
ค่า "DAMP not DRY" สามารถอ่านได้มากกว่าการใช้รหัสซ้ำ แนวคิดของ DAMP ไม่ใช่ DRY ในกรณีทดสอบคือการทดสอบควรเข้าใจง่ายถึงแม้ว่านั่นหมายความว่าบางครั้งกรณีทดสอบมีรหัสซ้ำ
ดูเพิ่มเติมรหัสซ้ำกันได้ดีกว่าในการทดสอบหน่วยหรือไม่ สำหรับการอภิปรายเกี่ยวกับข้อดีของมุมมองนี้
อาจมีการประกาศใช้โดยเจย์ฟิลด์ในเรื่องภาษาเฉพาะโดเมน
"DRY" คือ "อย่าทำซ้ำตัวเอง"
นี่เป็นคำที่ใช้บอกให้คนเขียนโค้ดที่สามารถนำมาใช้ซ้ำได้เพื่อที่คุณจะได้ไม่ต้องเขียนโค้ดที่คล้ายกันซ้ำแล้วซ้ำอีก
"DAMP" คือ "วลีที่สื่อความหมายและมีความหมาย"
คำนี้มีวัตถุประสงค์เพื่อบอกให้คุณเขียนโค้ดซึ่งสามารถเข้าใจได้ง่ายโดยคนที่กำลังดูอยู่ หากคุณปฏิบัติตามหลักการนี้คุณจะมีชื่อตัวแปรและฟังก์ชั่นที่ยาวและละเอียดเป็นต้น
Damp = 'วลีเชิงพรรณนาและสื่อความหมาย' - การทดสอบหน่วยของคุณควรจะเป็น 'อ่าน':
จากบทความ:
DAMP ย่อมาจาก“ วลีที่สื่อความหมายและมีความหมาย” และเป็นสิ่งที่ตรงกันข้ามกับ DRY ไม่ใช่ในแง่ที่ว่า“ ทุกสิ่งควรมีลักษณะเหมือนกองขยะและเป็นไปไม่ได้ที่จะอ่าน” ในการอ่านนั้นสำคัญกว่าการหลีกเลี่ยงรหัสซ้ำซ้อน
สิ่งนี้หมายความว่าอย่างไรและจะใช้ที่ไหน?
ส่วนใหญ่จะใช้ DAMP เมื่อเขียนรหัสทดสอบ รหัสทดสอบควรเข้าใจได้ง่ายจนถึงจุดที่มีความซ้ำซ้อนบางอย่างเป็นที่ยอมรับ
DAMP ย่อมาจาก“ วลีที่สื่อความหมายและมีความหมาย” และเป็นสิ่งที่ตรงกันข้ามกับ DRY ไม่ใช่ในแง่ที่ว่า“ ทุกสิ่งควรมีลักษณะเหมือนกองขยะและเป็นไปไม่ได้ที่จะอ่าน” ในการอ่านนั้นสำคัญกว่าการหลีกเลี่ยงรหัสซ้ำซ้อน
มีหลายคำตอบอยู่ที่นี่แล้ว แต่ฉันต้องการเพิ่มอีกเพราะฉันไม่คิดว่าพวกเขาจำเป็นต้องอธิบายให้ดีเท่าที่จะทำได้
แนวคิดของ DRY (อย่าทำซ้ำตัวเอง) คือในรหัสแอปพลิเคชันของคุณคุณต้องการหลีกเลี่ยงรหัสซ้ำซ้อนหรือ reptetive หากคุณมีบางสิ่งที่รหัสของคุณต้องทำหลาย ๆ ครั้งคุณควรมีฟังก์ชั่นหรือคลาสแทนรหัสซ้ำที่คล้ายกันในหลาย ๆ ที่
นี่เป็นแนวคิดการเขียนโปรแกรมที่รู้จักกันค่อนข้างดี
DAMP (วลีที่สื่อความหมายและวลีที่มีค่าน้อย) สำหรับการทดสอบหน่วยของคุณ แนวคิดนี้คือชื่อวิธีการทดสอบหน่วยของคุณควรมีความยาวและอธิบายได้อย่างมีประสิทธิภาพประโยคสั้น ๆ ที่อธิบายสิ่งที่คุณกำลังทดสอบ
เช่น: testWhenIAddOneAndOneIShouldGetTwo() { .... }
เมื่อคุณอ่านชื่อเมธอด DAMP เช่นนี้คุณควรเข้าใจอย่างถ่องแท้ว่าผู้เขียนแบบทดสอบพยายามทำอะไรโดยไม่ต้องอ่านโค้ดทดสอบ (แม้ว่ารหัสทดสอบจะสามารถทำตามแนวคิดนี้ได้เช่นเดียวกันกับชื่อตัวแปรที่ใช้คำ ฯลฯ )
สิ่งนี้เป็นไปได้เนื่องจากวิธีการทดสอบหน่วยมีอินพุตเฉพาะและเอาต์พุตที่คาดหวังดังนั้นหลักการ DAMP ทำงานได้ดีสำหรับพวกเขา วิธีการในรหัสแอปพลิเคชันหลักของคุณไม่น่าจะมีความเฉพาะเจาะจงมากพอที่จะรับประกันชื่อเช่นนี้โดยเฉพาะถ้าคุณเขียนด้วยหลักการ DRY ในใจ
DAMP และ DRY ไม่ได้ขัดแย้งกัน - พวกเขาครอบคลุมด้านต่าง ๆ ของวิธีการเขียนโค้ดของคุณ - แต่โดยทั่วไปแล้วพวกเขาไม่ได้ใช้ร่วมกันเพราะวิธีการที่เขียนด้วยหลักการ DRY ในใจจะเป็นวัตถุประสงค์ทั่วไปและไม่น่าจะเหมาะสม ถึงชื่อเมธอดที่เจาะจงมาก โดยทั่วไปตามที่อธิบายไว้ข้างต้นรหัสแอปพลิเคชันของคุณควรเป็น DRY และรหัสทดสอบหน่วยของคุณ DAMP
ฉันหวังว่าจะช่วยอธิบายได้ดีขึ้นเล็กน้อย
ฉันเห็นด้วยกับคริสเอ็ดเวิร์ดในการที่คุณจะต้องสร้างความสมดุลระหว่างทั้งสอง อีกสิ่งหนึ่งที่ควรทราบก็คือหากในความพยายามที่จะลบการทำซ้ำคุณจะต้องเพิ่มโครงสร้างเพิ่มเติมจำนวนมากในรหัสทดสอบหน่วยของคุณ (เช่นเมื่อนำ DRY ไปยังจุดสูงสุด) คุณจะเสี่ยงต่อการแนะนำบั๊กในนั้น ในสถานการณ์เช่นนี้คุณจะต้องทดสอบหน่วยการทดสอบหน่วยของคุณหรือปล่อยให้บิตของโครงสร้างยังไม่ได้ทดสอบ
ฉันไม่ต้องการทำซ้ำความพยายามที่นี่ แต่คุณสามารถทดสอบที่ DAMP แต่ได้ประโยชน์จาก DRY ในทางกลับกันการทดสอบ DRY จะไม่ตอบสนองการทดสอบ DAMP ในบางกรณี
ฉัน blogged เกี่ยวกับ DRY vs DAMP ซึ่งรวมถึงตัวอย่าง
ทั้งสองวิธีไม่ควรเป็นทางออกเดียวของคุณบางครั้ง DAMP ก็ overkill บางครั้งก็เป็นการเพิ่มที่ดีมาก
ตามกฎทั่วไปคุณควรใช้กฎสามข้อ หากคุณพบการทำซ้ำเป็นครั้งที่สามอาจจะมีมูลค่าการมองเข้าไปในการเขียนชื้นทดสอบสไตล์ แต่แม้แล้วทำซ้ำไม่ได้ทั้งหมดจะไม่ดี ประเด็นบริบท