ความแตกต่างระหว่างการออกแบบตามสัญญาและการเขียนโปรแกรมป้องกัน


26

การออกแบบโดยสัญญา (DbC) เป็นวิธีการตั้งโปรแกรมป้องกันหรือไม่

เป็นวิธีหนึ่งในการเขียนโปรแกรมที่ดีกว่าในบางกรณีมากกว่าวิธีอื่นหรือไม่

คำตอบ:


30

การออกแบบโดยสัญญาและการตั้งโปรแกรมการป้องกันนั้นมีความแตกต่างกันใน DbC คุณกำหนดสัญญาระหว่างผู้ทำงานร่วมกันและโปรแกรมของคุณภายใต้สมมติฐานที่ว่าผู้ทำงานร่วมกันปฏิบัติตามสัญญาของพวกเขา ในการตั้งโปรแกรมป้องกันคุณตั้งโปรแกรมภายใต้สมมติฐานที่ว่าผู้ทำงานร่วมกันของคุณละเมิดสัญญาของพวกเขา

รูทีนสแควร์รูทจริงที่เขียนในสไตล์ DbC จะระบุไว้ในสัญญาว่าคุณไม่ได้รับอนุญาตให้ส่งผ่านจำนวนลบและเพียงแค่คิดว่ามันไม่สามารถพบจำนวนลบได้ รูทีนสแควร์รูทจริงที่เขียนป้องกันจะถือว่ามันถูกส่งผ่านจำนวนลบและใช้ความระมัดระวังที่เหมาะสม

หมายเหตุ: เป็นไปได้แน่นอนว่าใน DbC บุคคลอื่นจะตรวจสอบสัญญา ในหอไอเฟลระบบสัญญาจะตรวจสอบจำนวนลบ ณ รันไทม์และโยนข้อยกเว้นที่เหมาะสม ใน Spec # ผู้ทดสอบทฤษฎีบทจะตรวจสอบจำนวนลบในเวลารวบรวมและล้มเหลวในการสร้างหากไม่สามารถพิสูจน์ได้ว่ารูทีนจะไม่ถูกส่งผ่านจำนวนลบ ความแตกต่างคือโปรแกรมเมอร์ไม่ได้ทำการตรวจสอบนี้


7

การออกแบบโดยสัญญา (DbC) เป็นวิธีการตั้งโปรแกรมป้องกันหรือไม่

ใช่.

"การตั้งโปรแกรมป้องกัน" มักจะเป็นข้อแก้ตัวให้เสียเวลา มันมักจะเสียเวลาตรวจสอบสิ่งที่จะทำให้เกิดข้อยกเว้นสามัญ แทนที่จะเป็นข้อยกเว้นจะมีการเขียนคำสั่ง IF พิเศษแทนคำสั่งจัดการข้อยกเว้น

กำหนดสัญญาและทำกับมัน

เมื่อมีคนละเมิดสัญญาโปรแกรมจะ - ในช่วงเวลาปกติของเหตุการณ์ - ทำลายและเพิ่มข้อยกเว้นตามปกติซึ่งสามารถจัดการได้ตามปกติ

"การตั้งโปรแกรมการป้องกัน" และ "การป้องกันข้อผิดพลาด" สามารถแสดงเพื่อเพิ่มข้อผิดพลาด (เพราะการตรวจสอบการป้องกันข้อผิดพลาดนั้นผิดพลาดเอง) แทนที่จะป้องกันข้อผิดพลาด

การจัดการข้อยกเว้นสามารถปิดบันทึกและจัดการข้อยกเว้นได้ดีกว่า "การตั้งโปรแกรมป้องกัน"


6
การตั้งโปรแกรมการป้องกันเป็น moe มากกว่าเพียงแค่คำสั่ง ซึ่งรวมถึงการตรวจสอบโค้ดการวิเคราะห์แบบคงที่การตรวจสอบความปลอดภัยแนวทางการเข้ารหัสที่ปลอดภัยและอื่น ๆ นอกจากนี้การใช้ข้อยกเว้นและการจัดการข้อยกเว้น (ซึ่งตรงข้ามกับการปล่อยให้โปรแกรมขัดข้องและเบิร์น) ถือเป็นเทคนิคการตั้งโปรแกรมป้องกัน
Thomas Owens

2
@ThomasOwens: ดูเหมือนว่า "การพัฒนาซอฟต์แวร์ที่ดี" ฉันเคยเห็นการตั้งโปรแกรมการป้องกันที่ใช้เป็นข้ออ้างในการเขียนคำสั่ง IF จำนวนมาก (หรือการยืนยัน) ที่ล้มเหลวก่อนยกข้อยกเว้นตามปกติ ฉันจะไม่เรียกรายการความคิดที่ดีของคุณว่า "Defensive Programming" ฉันจะเรียกรายการความคิดที่ดีของคุณว่า "การเขียนโปรแกรม" ด้วยวิธีนี้เราสามารถแยกการสูญเสียเวลาจากรายการอัจฉริยะทั้งหมดที่คุณมี
S.Lott

2
ฉันชอบเรียกว่า "ความคิดที่ดีเมื่อเขียนโค้ด" ด้วยตัวเอง แต่เมื่อฉันถูกสอนเกี่ยวกับการเขียนโปรแกรมเชิงป้องกันฉันได้รับการสอนว่ามันอ้างถึงเทคนิคใด ๆ และทั้งหมดโดยมีจุดประสงค์เพื่อให้มั่นใจในความปลอดภัยความปลอดภัยและความน่าเชื่อถือของระบบ . อาจเป็นคำจำกัดความที่กว้างเกินไปหรืออาจเป็นคำจำกัดความที่ผิด แต่เป็นสิ่งที่ฉันได้รับการสอน ฉันเคยเห็นผู้คนเรียกว่าคำแถลงและคำยืนยัน "การตั้งโปรแกรมการป้องกัน" แต่ตามคำจำกัดความที่ฉันสอนฉันจะไม่เรียกมันว่า (ยกเว้นในกรณีที่คุณไม่จำเป็นต้องมีตัวเลือกที่ดีกว่าเช่นข้อยกเว้น)
Thomas Owens

@ThomasOwens: "อาจจะเป็นคำจำกัดความที่กว้างเกินไป" ตกลง. ดูเหมือนรายการตรวจสอบที่ดีของความคิดที่ดี
S.Lott

2
-1: ฉันไม่เห็นว่า DbC เป็นวิธีการตั้งโปรแกรมป้องกันอย่างไรโดยทั่วไปพวกเขาตรงกันข้าม ฉันสงสัยว่าเป็นเรื่องปกติที่จะทำการเขียนโปรแกรมป้องกันเพื่อเสียเวลา และ 'สามารถแสดงเพื่อเพิ่มข้อผิดพลาด' จำเป็นต้องมีการอ้างอิงเนื่องจากมันไม่ชัดเจนเลย
ทำเครื่องหมาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.