เหตุใดจึงมีการสนับสนุนที่ จำกัด สำหรับ Design by Contract ในภาษาการเขียนโปรแกรมที่ทันสมัยที่สุด?


40

ฉันเพิ่งค้นพบการออกแบบตามสัญญา (DbC) และฉันพบว่ามันเป็นวิธีที่น่าสนใจอย่างยิ่งในการเขียนโค้ด เหนือสิ่งอื่นใดดูเหมือนว่าจะนำเสนอ:

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

ค่าใช้จ่ายในการเปรียบเทียบดูเหมือนจะค่อนข้างเล็ก:

  • พิมพ์ลายนิ้วมือพิเศษ เนื่องจากสัญญาต้องถูกสะกดออกมา
  • ใช้เวลาฝึกอบรมจำนวนหนึ่งเพื่อให้คุ้นเคยกับสัญญาการเขียน

ตอนนี้การทำความคุ้นเคยกับ Python เป็นหลักฉันตระหนักว่าในความเป็นจริงเป็นไปได้ที่จะเขียนเงื่อนไขเบื้องต้น (เพียงแค่โยนข้อยกเว้นสำหรับอินพุตที่ไม่เหมาะสม) และเป็นไปได้ที่จะใช้การยืนยันเพื่อทดสอบ postconditions อีกครั้ง แต่มันเป็นไปไม่ได้ที่จะจำลองคุณสมบัติบางอย่างเช่น 'เก่า' หรือ 'ผลลัพธ์' โดยไม่ต้องใช้เวทมนตร์พิเศษที่ในที่สุดจะได้รับการพิจารณาว่าไม่เป็น Pythonic (นอกจากนี้ยังมีห้องสมุดเพียงไม่กี่แห่งที่ให้การสนับสนุน แต่ท้ายที่สุดฉันได้รับความรู้สึกว่ามันผิดที่จะใช้พวกเขาเนื่องจากนักพัฒนาส่วนใหญ่ทำไม่ได้) ฉันคิดว่ามันเป็นปัญหาที่คล้ายกันสำหรับภาษาอื่น ๆ ทั้งหมด (ยกเว้นแน่นอน ไอเฟล)

สัญชาตญาณของฉันบอกฉันว่าการขาดการสนับสนุนต้องเป็นผลมาจากการปฏิเสธการฝึกฝน แต่การค้นหาทางออนไลน์นั้นไม่ประสบผลสำเร็จ ฉันสงสัยว่าบางคนสามารถอธิบายได้ว่าทำไมภาษาสมัยใหม่ส่วนใหญ่จึงให้การสนับสนุนเพียงเล็กน้อย DbC มีข้อบกพร่องหรือมีราคาแพงเกินไป? หรือเป็นเพียงล้าสมัยเนื่องจาก Extreme Programming และวิธีการอื่น ๆ ?


ฟังดูเหมือนวิธีที่ซับซ้อนเกินกว่าจะทำการเขียนโปรแกรมทดสอบโดยไม่ได้รับประโยชน์จากการทดสอบโปรแกรมของคุณ
Dan

3
@ ด่านไม่จริงฉันคิดว่ามันเป็นส่วนขยายของระบบประเภท เช่นฟังก์ชั่นไม่เพียง แต่ใช้อาร์กิวเมนต์จำนวนเต็ม แต่ต้องใช้จำนวนเต็มที่มีภาระผูกพันตามสัญญามากกว่าศูนย์
Carson63000

4
@Dan สัญญารหัสลดจำนวนการทดสอบที่คุณต้องทำอย่างมีนัยสำคัญ
Rei Miyasaka

24
@ ด่านฉันอยากบอกว่า TDD เป็นสัญญาของคนจนไม่ใช่ในทางกลับกัน
SK-logic

ในภาษาแบบไดนามิกคุณสามารถ "ตกแต่ง" วัตถุของคุณด้วยสัญญาตามธงเสริม ฉันมีตัวอย่างการนำไปใช้ซึ่งใช้ธงสิ่งแวดล้อมเป็นทางเลือกในการปะแก้วัตถุที่มีอยู่กับสัญญา ใช่การสนับสนุนไม่ใช่เนทิฟ แต่เพิ่มได้ง่าย เช่นเดียวกับการทดสอบสายรัดพวกเขาไม่ใช่คนพื้นเมือง แต่พวกเขาง่ายต่อการเพิ่ม / เขียน
Raynos

คำตอบ:


9

สามารถรองรับได้ในแทบทุกภาษาโปรแกรม

สิ่งที่คุณต้องการคือ "การยืนยัน"

รหัสเหล่านี้เขียนง่าย ๆ ว่า "ถ้า" คำสั่ง:

if (!assertion) then AssertionFailure();

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

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

คุณสามารถทำให้สิ่งเหล่านี้มีประสิทธิภาพมากขึ้นเล็กน้อยในภาษาส่วนใหญ่โดยการกำหนดค่าคงที่บูลีนเวลารวบรวม "การตรวจสอบ" และแก้ไขคำสั่งเล็กน้อย:

if (checking & !Assertion) then AssertionFailure();

หากคุณไม่ชอบไวยากรณ์คุณสามารถหันไปใช้เทคนิคการใช้ภาษาที่หลากหลายเช่นมาโคร

ภาษาสมัยใหม่บางภาษาให้ไวยากรณ์ที่ดีแก่คุณและนั่นคือสิ่งที่ฉันคิดว่าคุณหมายถึงโดย "การสนับสนุนภาษาสมัยใหม่" สนับสนุน แต่มันก็ค่อนข้างบาง

สิ่งที่แม้แต่ภาษาสมัยใหม่ส่วนใหญ่ไม่ได้ให้คุณก็คือการยืนยัน "ชั่วขณะ" (เหนือรัฐก่อนหน้าหรือถัดไปโดยพลการ [ผู้ดำเนินการชั่วคราว "ในที่สุด"] ซึ่งคุณต้องการหากคุณต้องการเขียนสัญญาที่น่าสนใจจริง ๆ คุณอยู่ที่นี่.


ปัญหาที่ฉันพบเมื่อมีการเข้าถึงการยืนยันเท่านั้นคือไม่มีวิธีที่มีประสิทธิภาพในการตรวจสอบคำสั่ง postconditions เนื่องจากคุณมักจะต้องเปรียบเทียบสถานะ postcondition กับสถานะ precondition (Eiffel เรียกสิ่งนี้ว่า 'เก่า' และผ่านไปยังรูทีน postcondition โดยอัตโนมัติ .) ใน Python ฟังก์ชั่นนี้อาจถูกสร้างขึ้นใหม่โดยใช้มัณฑนากร แต่มันสั้นมากเมื่อถึงเวลาปิดการยืนยัน
Ceasar Bautista

ไอเฟลในอดีตที่ผ่านมามีจำนวนเท่าไหร่ที่ประหยัด? เนื่องจากมันไม่สามารถรู้ได้ว่าส่วนใดที่คุณสามารถเข้าถึง / แก้ไขได้โดยไม่ต้องแก้ไขปัญหาการหยุดทำงาน (โดยการวิเคราะห์ฟังก์ชั่นของคุณ) ดังนั้นจึงต้องบันทึกสถานะของเครื่องทั้งหมดหรือเป็น hueristic เพียงบางส่วนที่ตื้นเท่านั้น ฉันสงสัยหลัง; และสิ่งเหล่านี้สามารถ "จำลอง" โดยการกำหนดสเกลาร์ง่าย ๆ ก่อนเงื่อนไข ฉันยินดีที่จะเรียนรู้การทำไอเฟลเป็นอย่างอื่น
Ira Baxter

7
... เพิ่งตรวจสอบการทำงานของไอเฟล "old <exp>" คือค่าของ <exp> ที่ทางเข้าฟังก์ชั่นดังนั้นมันจึงทำสำเนาตื้นที่ทางเข้าฟังก์ชั่นอย่างที่ฉันคาดไว้ คุณสามารถทำได้เช่นกัน ฉันจะยอมรับว่าการคอมไพเลอร์ใช้ไวยากรณ์สำหรับ pre / post / old สะดวกกว่าการทำทั้งหมดนี้ด้วยมือ แต่ประเด็นก็คือหนึ่งสามารถทำได้ด้วยมือและมันไม่ยากจริงๆ เรากลับไปที่โปรแกรมเมอร์ขี้เกียจ
Ira Baxter

@IraBaxter รหัสไม่ง่ายถ้าคุณสามารถแยกสัญญาออกจากตรรกะที่แท้จริง นอกจากนี้ถ้าคอมไพเลอร์สามารถบอกการทำสัญญาและรหัสออกจากกันก็สามารถลดความซ้ำซ้อนโดยมาก เช่นใน D คุณสามารถประกาศสัญญาในอินเทอร์เฟซหรือซูเปอร์คลาสและการยืนยันจะถูกนำไปใช้กับคลาสที่ใช้งาน / ขยายคลาสโดยไม่คำนึงถึงโค้ดในฟังก์ชันของพวกเขา เช่นด้วย python หรือ Java คุณต้องเรียกใช้ทั้งsuperวิธีและอาจทิ้งผลลัพธ์หากคุณต้องการตรวจสอบสัญญาโดยไม่ทำซ้ำ สิ่งนี้จะช่วยในการปรับใช้โค้ดที่เป็นไปตามมาตรฐานสะอาด
marstato

@marstato: ฉันเห็นด้วยแล้วว่าการสนับสนุนในภาษาเป็นสิ่งที่ดี
Ira Baxter

15

ดังที่คุณพูด Design by Contract เป็นคุณลักษณะใน Eiffel ซึ่งเป็นหนึ่งในภาษาการเขียนโปรแกรมที่ได้รับการยอมรับอย่างดีในชุมชน แต่ไม่เคยมีใครสนใจ

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

ฉันคิดว่าถ้าคุณไปที่นักพัฒนาโดยเฉลี่ยในวันนี้และพูดคุยเกี่ยวกับโพสต์เงื่อนไขพวกเขาจะพยักหน้าอย่างกระตือรือร้นและพูดว่า "ตกลงนั่นก็เหมือนกับการทดสอบหน่วย" และถ้าคุณพูดถึงพรีเงื่อนไขพวกเขาจะพูดว่า "ตกลงนั่นเหมือนกับการตรวจสอบความถูกต้องของพารามิเตอร์ซึ่งเราไม่ได้ทำเสมอไป แต่คุณรู้ไหมฉันเดาว่ามันโอเค ... " แล้วถ้าคุณพูดถึงค่าคงที่ พวกเขาจะเริ่มพูดว่า "Gee ค่าใช้จ่ายเท่านี้คือเท่าไหร่เราจะจับแมลงอีกกี่ตัว?" เป็นต้น

ดังนั้นฉันคิดว่ายังมีอีกหลายทางที่จะต้องไปก่อนที่ DbC จะได้รับการยอมรับอย่างกว้างขวาง


OTOH โปรแกรมเมอร์หลักเคยถูกใช้ในการเขียนคำยืนยันค่อนข้างนาน การไม่มีตัวประมวลผลล่วงหน้าที่สามารถใช้งานได้ในภาษากระแสหลักที่ทันสมัยทำให้การฝึกฝนนี้ไม่มีประสิทธิภาพ แต่ก็ยังคงเป็นเรื่องปกติสำหรับ C และ C ++ ตอนนี้กำลังกลับมาอีกครั้งกับ Microsoft Code Contracts (จาก AFAIK ซึ่งเป็น bytecode rewriting สำหรับการสร้างรีลีส)
SK-logic

8

สัญชาตญาณของฉันบอกฉันว่าการขาดการสนับสนุนต้องเป็นผลมาจากการปฏิเสธการฝึกฝน ...

เท็จ

มันเป็นแบบฝึกหัดการออกแบบ มันสามารถเป็นตัวเป็นตนอย่างชัดเจนในรหัส (สไตล์ไอเฟล) หรือโดยนัยในรหัส (ภาษาส่วนใหญ่) หรือในการทดสอบหน่วย การฝึกฝนการออกแบบมีอยู่และทำงานได้ดี การสนับสนุนด้านภาษามีอยู่ทั่วแผนที่ อย่างไรก็ตามมีหลายภาษาในกรอบการทดสอบหน่วย

ฉันสงสัยว่าบางคนสามารถอธิบายได้ว่าทำไมภาษาสมัยใหม่ส่วนใหญ่จึงให้การสนับสนุนเพียงเล็กน้อย DbC มีข้อบกพร่องหรือมีราคาแพงเกินไป?

มันแพง. และ. ที่สำคัญมีบางสิ่งที่ไม่สามารถพิสูจน์ได้ในภาษาที่กำหนด ยกตัวอย่างเช่นการเลิกใช้ลูปไม่สามารถพิสูจน์ได้ในภาษาการเขียนโปรแกรมมันต้องการความสามารถในการพิสูจน์ "ลำดับสูงกว่า" ดังนั้นสัญญาบางประเภทจึงอธิบายไม่ได้ทางเทคนิค

หรือเป็นเพียงล้าสมัยเนื่องจาก Extreme Programming และวิธีการอื่น ๆ ?

เลขที่

เราส่วนใหญ่ใช้การทดสอบหน่วยเพื่อแสดงให้เห็นว่า DbC เป็นจริง

สำหรับ Python ดังที่คุณบันทึกไว้ DbC จะไปในหลายที่

  1. ผลการทดสอบ docstring และ docstring

  2. การยืนยันเพื่อตรวจสอบอินพุตและเอาต์พุต

  3. การทดสอบหน่วย

ต่อไป

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


คุณสามารถพิสูจน์กรณีเล็ก ๆ น้อย ๆ ของการยกเลิกลูปเช่นการวนซ้ำในลำดับที่ จำกัด แน่นอน เป็นการวนซ้ำทั่วไปที่ไม่สามารถแสดงให้เห็นว่ายุติได้เล็กน้อย (เนื่องจากสามารถค้นหาวิธีแก้ปัญหาทางคณิตศาสตร์ที่“ น่าสนใจ”) นั่นคือแก่นแท้ของปัญหาการหยุดชะงัก
Donal Fellows

+1 ฉันคิดว่าคุณเป็นคนเดียวที่ได้ครอบคลุมประเด็นที่สำคัญที่สุด - there are some things which cannot be proven. การยืนยันที่เป็นทางการอาจยอดเยี่ยม แต่ไม่ใช่ทุกอย่างที่ตรวจสอบได้! ดังนั้นคุณสมบัตินี้จึง จำกัด การใช้ภาษาโปรแกรมที่สามารถทำได้จริง
Dipan Mehta

@ DonalFellows: เนื่องจากกรณีทั่วไปไม่สามารถพิสูจน์ได้มันจึงยากที่จะรวมฟีเจอร์ต่าง ๆ ที่มี (a) แพงและ (b) รู้ว่าไม่สมบูรณ์ ประเด็นของฉันในคำตอบนี้คือง่ายกว่าที่จะละทิ้งคุณลักษณะเหล่านั้นทั้งหมดและหลีกเลี่ยงการตั้งค่าความคาดหวังที่ผิดพลาดของการพิสูจน์ความถูกต้องอย่างเป็นทางการโดยทั่วไปเมื่อมีข้อ จำกัด ในฐานะที่เป็นแบบฝึกหัดการออกแบบ (นอกภาษา) เทคนิคการพิสูจน์จำนวนมากสามารถใช้ (และควร) ได้
S.Lott

มันไม่แพงเลยในภาษาเช่น C ++ ที่การตรวจสอบสัญญารวบรวมในการสร้างการเปิดตัว และการใช้ DBC มีแนวโน้มที่จะนำไปสู่การสร้างรหัสการสร้างที่มีน้ำหนักเบามากขึ้นเพราะคุณใส่การตรวจสอบรันไทม์น้อยลงสำหรับโปรแกรมที่อยู่ในสถานะทางกฎหมาย ฉันได้สูญเสียจำนวนรหัสเบสที่มากเกินไปที่ฉันได้เห็นซึ่งฟังก์ชั่นมากมายตรวจสอบสถานะที่ผิดกฎหมายและคืนค่าเท็จเมื่อมันไม่ควรอยู่ในสถานะนั้นในรุ่นวางจำหน่ายที่ผ่านการทดสอบอย่างถูกต้อง
Kaitain

6

เพียงแค่คาดเดา อาจเป็นส่วนหนึ่งของเหตุผลที่ไม่เป็นที่นิยมเช่นนี้เพราะ "Design by Contract" เป็นเครื่องหมายการค้าของไอเฟล


3

สมมุติฐานข้อหนึ่งคือสำหรับโปรแกรมที่มีขนาดใหญ่และซับซ้อนโดยเฉพาะอย่างยิ่งที่มีเป้าหมายเคลื่อนที่มวลของสัญญานั้นสามารถเป็นรถบั๊กและยากที่จะดีบั๊กหรือมากกว่านั้นมากกว่าโค้ดโปรแกรมเพียงอย่างเดียว เช่นเดียวกับรูปแบบใด ๆ อาจมีการใช้งานที่ผ่านมาผลตอบแทนลดลงเช่นเดียวกับข้อได้เปรียบที่ชัดเจนเมื่อใช้ในลักษณะที่ตรงเป้าหมายมากขึ้น

ข้อสรุปที่เป็นไปได้อีกประการหนึ่งคือความนิยมของ "ภาษาที่มีการจัดการ" เป็นหลักฐานในปัจจุบันของการสนับสนุนการออกแบบโดยสัญญาสำหรับคุณสมบัติที่มีการจัดการที่เลือกเหล่านั้น (ขอบเขตที่แบ่งตามสัญญาเป็นต้น)


> สัญญาจำนวนมากสามารถกลายเป็นรถบั๊กและยากที่จะดีบั๊กหรือมากกว่านั้นกว่าโค้ดโปรแกรมเพียงอย่างเดียวที่ฉันไม่เคยเห็นมาก่อน
Kaitain

2

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

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

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

ฉันยังทราบด้วยว่าแนวคิดที่เป็นสัญญาสำหรับเทมเพลตค่อนข้างมากและค่อนข้างเกี่ยวข้องกับ DbC ซึ่งถูกทิ้งไว้จากมาตรฐาน C ++ ล่าสุดแม้กระทั่งหลังจากหลายปีของการทำงานกับพวกมัน การเปลี่ยนแปลงที่กว้างขวางกว้างใหญ่และกว้างขวางเกี่ยวกับภาษาเหล่านี้ยากเกินไปที่จะนำไปใช้


2

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

หากไม่มีการสนับสนุนคอมไพเลอร์ "DbC" เป็นเพียงชื่ออับเรนสำหรับ "ตรวจสอบค่าคงที่ / สมมติฐานและส่งข้อยกเว้นหากละเมิด"


นั่นไม่ใช่ปัญหาที่หยุดชะงักหรือไม่
Ceasar Bautista

@ ซีซาร์มันขึ้นอยู่กับ สามารถตรวจสอบสมมติฐานบางข้อได้บางข้อไม่สามารถทำได้ ตัวอย่างเช่นมีระบบประเภทที่ทำให้เป็นไปได้ที่จะหลีกเลี่ยงการส่งรายการว่างเป็นอาร์กิวเมนต์หรือส่งคืนหนึ่ง
Ingo

จุดดี (+1) ถึงแม้ว่า Bertrand Meyer ในส่วนของ "Masterminds of programming" ยังกล่าวถึงระบบของการสร้างคลาสแบบสุ่มและการตรวจสอบการโทรสำหรับการละเมิดสัญญา ดังนั้นจึงเป็นวิธีการรวบรวมเวลา / รันไทม์แบบผสม แต่ฉันสงสัยว่าเทคนิคนี้ใช้ได้กับทุกสถานการณ์
Maksee

นั่นเป็นจริงในระดับหนึ่งแม้ว่ามันควรจะเป็นความล้มเหลวอย่างรุนแรงมากกว่าที่จะเป็นข้อยกเว้น (ดูด้านล่าง) ข้อได้เปรียบที่สำคัญของ DBC คือวิธีการซึ่งนำไปสู่โปรแกรมที่ออกแบบมาดีกว่าและการประกันว่าวิธีการใด ๆ ที่กำหนดต้องอยู่ในสถานะทางกฎหมายเมื่อเข้ามาซึ่งทำให้ตรรกะภายในง่ายขึ้นมาก โดยทั่วไปคุณไม่ควรอยู่ในธุรกิจของการโยนข้อยกเว้นเมื่อมีการละเมิดสัญญา ควรใช้ข้อยกเว้นเมื่อโปรแกรมสามารถอยู่ในสถานะ ~ X ได้และรหัสลูกค้าจะต้องจัดการสิ่งนี้ สัญญาจะบอกว่า ~ X นั้นผิดกฎหมาย
Kaitain

1

ฉันมีคำอธิบายง่ายๆคนส่วนใหญ่ (รวมถึงโปรแกรมเมอร์) ไม่ต้องการงานพิเศษเว้นแต่พวกเขาจะเห็นว่าจำเป็น การเขียนโปรแกรม Avionics ที่ความปลอดภัยถือว่าสำคัญมากฉันไม่เคยเห็นโครงการส่วนใหญ่ที่ปราศจากมัน

แต่ถ้าคุณกำลังพิจารณาเว็บไซต์เดสก์ท็อปหรือการเขียนโปรแกรมมือถือ - ปัญหาและพฤติกรรมที่ไม่คาดคิดบางครั้งก็ไม่ถือว่าเป็นเรื่องเลวร้ายและโปรแกรมเมอร์ก็จะหลีกเลี่ยงการทำงานพิเศษเมื่อรายงานข้อผิดพลาดและการแก้ไขภายหลังก็ถือว่าเพียงพอแล้ว

นี่อาจเป็นเหตุผลที่ฉันคิดว่า Ada ไม่เคยได้รับนอกเหนือจากอุตสาหกรรมการเขียนโปรแกรมการบินเพราะใช้งานการเขียนโค้ดมากกว่าแม้ว่า Ada เป็นภาษาที่ยอดเยี่ยมและถ้าคุณต้องการสร้างระบบที่เชื่อถือได้มันเป็นภาษาที่ดีที่สุดสำหรับงาน ภาษาตาม Ada)

การออกแบบโดยห้องสมุดสัญญาสำหรับ C # ถูกทดลองโดย Microsoft และเป็นประโยชน์อย่างมากสำหรับการสร้างซอฟต์แวร์ที่เชื่อถือได้ แต่พวกเขาไม่เคยได้รับแรงกระตุ้นในตลาดอย่างอื่นคุณจะเห็นพวกเขาเป็นส่วนหนึ่งของภาษา C #

การยืนยันไม่เหมือนกับการสนับสนุนการทำงานอย่างสมบูรณ์สำหรับเงื่อนไขก่อน / หลังและค่าคงที่ แม้ว่าจะสามารถลองลอกเลียนแบบได้ แต่ภาษา / คอมไพเลอร์ที่มีการสนับสนุนที่เหมาะสมจะทำการวิเคราะห์ 'โครงสร้างไวยากรณ์ของนามธรรม' และตรวจสอบข้อผิดพลาดเชิงตรรกะซึ่งไม่สามารถยืนยันได้

แก้ไข: ฉันค้นหาและต่อไปนี้เป็นการสนทนาที่เกี่ยวข้องซึ่งอาจมีประโยชน์: https://stackoverflow.com/questions/4065001/are-there-any-provable-real-world-languages-scala


-2

เหตุผลส่วนใหญ่มีดังนี้

  1. มีเฉพาะในภาษาที่ไม่เป็นที่นิยม
  2. ไม่จำเป็นเนื่องจากสิ่งเดียวกันสามารถทำได้หลายวิธีในภาษาการเขียนโปรแกรมที่มีอยู่โดยทุกคนที่ต้องการทำเช่นนั้น
  3. มันยากที่จะเข้าใจและใช้งาน - ต้องใช้ความรู้เฉพาะทางในการทำอย่างถูกต้องดังนั้นจึงมีคนจำนวนน้อยที่ทำมัน
  4. มันต้องการรหัสจำนวนมากในการทำ - โปรแกรมเมอร์ต้องการลดจำนวนอักขระที่พวกเขาเขียน - ถ้าใช้รหัสยาว ๆ บางสิ่งต้องผิดไป
  5. ข้อดีไม่ได้อยู่ที่นั่น - แค่หาข้อบกพร่องไม่เพียงพอที่จะทำให้คุ้มค่า

1
คำตอบของคุณไม่เป็นที่ถกเถียงกัน คุณเพียงแค่แสดงความคิดเห็นของคุณว่าไม่มีข้อได้เปรียบมันต้องใช้โค้ดจำนวนมากและไม่จำเป็นเพราะมันสามารถทำได้กับภาษาที่มีอยู่ (OP ระบุถึงปัญหานี้โดยเฉพาะ!)
Andres F.

ฉันไม่ได้คิดเกี่ยวกับการยืนยัน ฯลฯ แทนมัน นั่นไม่ใช่วิธีที่ถูกต้องในการทำในภาษาที่มีอยู่ (เช่นยังไม่ได้รับการแก้ไข)
tp1

@ tp1, หากโปรแกรมเมอร์ต้องการลดการพิมพ์ให้น้อยที่สุด, พวกเขาจะไม่ตกอยู่ในสิ่งที่ละเอียดและอ่อนหวานเหมือน Java และใช่การเขียนโปรแกรมเองต้องมี "ความรู้พิเศษ" "เพื่อให้ถูกต้อง" ผู้ที่ไม่ได้ครอบครองความรู้ดังกล่าวก็ไม่ควรได้รับอนุญาตให้ใช้รหัส
SK-logic

@ Sk-logic: ดูเหมือนว่าครึ่งโลกกำลังทำผิด OO เพียงเพราะพวกเขาไม่ต้องการที่จะเขียนฟังก์ชั่นการส่งต่อจากฟังก์ชั่นสมาชิกไปยังฟังก์ชั่นสมาชิกของสมาชิกข้อมูล มันเป็นปัญหาใหญ่ในประสบการณ์ของฉัน ปัญหานี้เกิดขึ้นโดยตรงจากการลดจำนวนอักขระที่จะเขียนให้เหลือน้อยที่สุด
tp1

@ tp1 หากผู้คนต้องการลดการพิมพ์ให้เหลือน้อยที่สุดพวกเขาจะไม่แตะต้อง OO เลย OOP นั้นมีความเฉียบคมตามธรรมชาติแม้ในการนำไปใช้ที่ดีที่สุดเช่น Smalltalk ฉันจะไม่บอกว่ามันเป็นคุณสมบัติที่ไม่ดีมีคารมคมคายช่วยบางครั้ง
SK-logic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.