ทำไมค่าคงที่จึงมีความสำคัญในวิทยาศาสตร์คอมพิวเตอร์


16

ฉันเข้าใจ 'คงที่' ในความหมายที่แท้จริง ฉันจำได้เมื่อพิมพ์รหัส แต่ฉันไม่คิดว่าฉันเข้าใจความสำคัญของคำนี้ในบริบทของวิทยาศาสตร์คอมพิวเตอร์

เมื่อใดก็ตามที่ฉันอ่านบทสนทนา \ white paper เกี่ยวกับการออกแบบภาษาจากโปรแกรมเมอร์ที่มีชื่อเสียง \ นักวิทยาศาสตร์คอมพิวเตอร์คำว่า 'invariant' ยังคงปรากฏขึ้นอย่างต่อเนื่องเป็นศัพท์แสง และนั่นคือส่วนที่ฉันไม่เข้าใจ มีอะไรพิเศษเกี่ยวกับมัน?


ฉันใช้การยืนยันจำนวนมาก ... ไม่มากที่จะรับประกันความถูกต้องว่าจะลดโอกาสในการเกิดข้อบกพร่อง
งาน

คำตอบ:


7

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

ดังนั้นจุดรวมของการเขียนโปรแกรมคือการระบุสิ่งที่ไม่แตกต่าง - นั่นคือโปรแกรมของคุณ

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


27

ความคิดของค่าคงที่มีการเชื่อมโยงอย่างมากกับ 'ผลข้างเคียง' ฉันเชื่อว่ามันได้รับการโปรโมตโดยแนวทาง 'Design by Contract (DbC) ของเบอร์แทรนด์เมเยอร์สำหรับการออกแบบซอฟต์แวร์

DbC เสริมสร้างชนิดข้อมูลนามธรรม (กระดูกสันหลังของชั้นเรียน) มี 3 สิ่งที่สำคัญความคิด, ปัจจัย, postconditions, ค่าคงที่ มันอธิบายได้ง่ายเมื่อพูดถึงขั้นตอนดังนั้นฉันจะพยายามอธิบายโดยอ้างอิงกับมัน:

  1. เงื่อนไขหมายถึงการป้อนข้อมูลของเงื่อนไขสำหรับขั้นตอนต้องเคารพในการสั่งซื้อที่จะเรียกขั้นตอนที่ เงื่อนไขนี้จะต้องได้รับการเคารพและบังคับใช้โดยลูกค้าของขั้นตอนนั้น ๆ ผู้ออกแบบกระบวนงานอาจปกป้องจากไคลเอนต์ที่ไม่เคารพเงื่อนไขก่อนโดยอ้างเงื่อนไขว่าเป็นบรรทัดแรกในกระบวนงาน ตัวอย่างเช่นมีวิธีการเงื่อนไขอาจจะdouble divide(double dividend, double divisor)divisor != 0

  2. postconditionแสดงให้เห็นถึงสภาพที่อยู่บนข้อมูลออกหลังจากที่ผลตอบแทนขั้นตอน; เป็นหน้าที่ของผู้ออกแบบขั้นตอนทั้งหมดในการเคารพ postcondition หากเงื่อนไขนั้นได้รับการเคารพ ในรูปแบบการเขียนโปรแกรมการป้องกันก่อนที่จะกลับมา postcondition สามารถยืนยันได้

  3. คงสามารถถือได้ว่าเป็นทั้งเงื่อนไขและ postcondition แต่ด้วยความเข้าใจที่แตกต่างกันสำหรับเงื่อนไขและ postcondition จากแนวคิดดังกล่าวข้างต้น ค่าคงที่โดยทั่วไปบอกว่าถ้าอินพุตมีเงื่อนไขเฉพาะพบก่อนโพรซีเดอร์ถูกเรียกใช้จากนั้นเงื่อนไขเฉพาะนั้นจะใช้ได้หลังจากโพรซีเดอร์ถูกเรียก ตัวอย่างเช่นค่าคงที่ที่ถูกต้องสำหรับโพรซีเดอร์boolean search(int term, int array[])อาจบอกว่าสถานะarrayก่อนการโทรนั้นจะเหมือนกันหลังจากการโทร

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


2

ค่าคงที่เป็นสมบัติเชิงตรรกะที่เก็บรักษาไว้โดยการดำเนินการบางอย่าง

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

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


0

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


0

ในบริบทของระบบประเภทภาษาการเขียนโปรแกรมประเภทไม่แปรเปลี่ยนเป็นประเภทที่ไม่สามารถแปลงได้ ตัวอย่างเช่นใน java เมื่อโอเวอร์โหลดวิธีการพารามิเตอร์ทั้งหมดจะไม่แปรเปลี่ยนในขณะที่ประเภทกลับเป็น covariant (อาจจะเหมือนกันหรือชนิดย่อย)

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