อะไรคือค่าคงที่, พวกมันสามารถใช้อะไรได้บ้างและคุณเคยใช้มันในโปรแกรมของคุณหรือไม่?


48

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

คำอธิบายของฉันถูกต้องหรือฉันพลาดอะไรไป? คุณเคยใช้มันในโปรแกรมของคุณหรือไม่? และถ้าเป็นเช่นนั้นพวกเขาได้ประโยชน์อย่างไร?



@ Robert Harvey: ใช่ฉันแค่อ่านมันจริงๆ แต่สำหรับฉันแล้วค่าคงที่มีประโยชน์เมื่อคุณพยายามที่จะพิสูจน์อะไรบางอย่าง สิ่งนี้ถูกต้อง (ไม่มีการเล่นสำนวน)
gablin

นั่นคือความเข้าใจของฉัน; เมื่อคุณพยายามให้เหตุผลเกี่ยวกับโปรแกรมของคุณเพื่อพิสูจน์ความถูกต้อง
Robert Harvey

3
@ user9094: การยืนยันเป็นการประกาศว่าบางสิ่งเป็นจริง ณ จุดใดจุดหนึ่งใน runtime และแสดงในโค้ด ค่าคงที่คือข้อความ (หนึ่งหวังว่ามีหลักฐานดี) ซึ่งจะเป็นจริงเสมอเมื่อใดก็ตามที่มันนำมาใช้และไม่ได้แสดงในรหัสตัวเอง
David Thornley

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

คำตอบ:


41

ใน OOP ค่าคงที่คือชุดของการยืนยันที่ต้องถือเป็นจริงตลอดช่วงอายุของวัตถุเพื่อให้โปรแกรมใช้งานได้ มันควรจะเป็นจริงจากจุดสิ้นสุดของตัวสร้างไปยังจุดเริ่มต้นของ destructor เมื่อใดก็ตามที่วัตถุไม่ได้กำลังดำเนินการวิธีการที่เปลี่ยนสถานะของมัน

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

บางครั้งฉันใช้ฟังก์ชั่นสมาชิกของวัตถุเพื่อตรวจสอบว่าค่าคงที่เก็บ หากไม่ใช่กรณีนี้จะมีการเพิ่มการยืนยัน และวิธีการที่เรียกว่าเมื่อเริ่มต้นและออกจากแต่ละวิธีที่เปลี่ยนวัตถุ (ใน C ++ นี่เป็นเพียงหนึ่งบรรทัด ... )


11
+1 สำหรับการกล่าวถึงค่าคงที่ไม่จำเป็นต้องเป็นจริงในระหว่างวิธีการดำเนินการ
Oddthinking

1
@ddthinking ที่ดีที่สุดเพื่อหลีกเลี่ยงว่าเมื่อเป็นไปได้ มันจะง่ายต่อการเข้าสู่สถานะที่ไม่หยุดยั้งและลืมที่จะคืนค่าทุกอย่างอย่างถูกต้องก่อนที่จะกลับมา ข้อยกเว้นอาจทำให้คุณเดือดร้อน
อเล็กซานเด

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

@ คิดไตร่ตรองใช่มันมักจะหลีกเลี่ยงไม่ได้เลย แต่ตัวอย่างเช่นหากมีกลุ่มของตัวแปรที่มีเหตุผลอยู่ด้วยกัน (เช่นอาร์เรย์และดัชนีของรายการ "ที่เลือก" ในอาเรย์) นั่นก็น่าจะคุ้มที่จะแยกพวกมันออกเป็นประเภท จากจุดนั้นการกลายพันธุ์ของอาร์เรย์หรือชนิดสามารถแสดงเป็นการกำหนดค่าเดียวของอินสแตนซ์ใหม่ของประเภทนั้น
Alexander

13

สิ่งที่ฉันเห็นในหัวข้อนี้ดีมาก แต่ฉันมีคำจำกัดความของ 'ค่าคงที่' ที่เป็นประโยชน์อย่างมากสำหรับฉันในที่ทำงาน

ค่าคงที่คือกฎเชิงตรรกะใด ๆ ที่จะต้องปฏิบัติตามตลอดการทำงานของโปรแกรมของคุณที่สามารถสื่อสารกับมนุษย์ แต่ไม่ใช่สำหรับคอมไพเลอร์ของคุณ

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

นอกจากนี้คำจำกัดความนี้มีประโยชน์เพราะช่วยให้คุณใช้การวางนัยทั่วไป "ค่าคงที่ไม่ดี"

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

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

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

ด้วยวิธีนี้เราสามารถพูดได้ว่าการส่งได้รับการออกแบบมาเพื่อ 'ลบค่าคงที่' เพราะมันไม่อนุญาตให้ตัวเองถูกกำหนดค่าทางกลไกในลักษณะที่ละเมิดกฎทางตรรกะ

ค่าคงที่ทุกชนิดที่คุณลบออกจากโค้ดของคุณเป็นการปรับปรุงเนื่องจากมันช่วยลดภาระการรับรู้ของการทำงานกับมัน


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

1
การเปรียบเทียบกับเกียร์ของรถยนต์นั้นชัดเจนมากสำหรับฉัน ขอบคุณ!
Marecky

"ค่าคงที่คือกฎเชิงตรรกะใด ๆ ที่จะต้องปฏิบัติตามตลอดการทำงานของโปรแกรมของคุณที่สามารถสื่อสารกับมนุษย์ แต่ไม่ใช่สำหรับคอมไพเลอร์ของคุณ" - ฉันค่อนข้างชอบความกระชับและจดจำได้ง่าย
ZeroKnight

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

คำอธิบายที่ยอดเยี่ยม! ตอนนี้ฉันเข้าใจจริง ๆ แล้วว่าทำไมการมีค่าคงที่ในรหัสของคุณจึงเป็นเรื่องที่ไม่ดี
เบ็นซีวัง

3

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


3

ตามคำพูดต่อไปนี้จาก Coders At Work ...

แต่เมื่อคุณรู้ว่าค่าคงที่ที่มันคงอยู่คุณจะเห็นว่าถ้าเรารักษาค่าคงที่นั้นเราจะได้เวลาในการค้นหาบันทึก

... ฉันเดา "invariant" = "เงื่อนไขที่คุณต้องการรักษาเพื่อให้แน่ใจว่าได้ผลที่ต้องการ"

ดูเหมือนว่าค่าคงที่มีสองความรู้สึกที่แตกต่างในทางที่ลึกซึ้ง:

  1. สิ่งที่ยังคงเหมือนเดิม
  2. สิ่งที่คุณพยายามรักษาไว้เพื่อให้บรรลุเป้าหมาย X (เช่น "เวลาค้นหาบันทึก" ด้านบน)

ดังนั้น 1 เป็นเหมือนการยืนยัน; 2 เป็นเหมือนเครื่องมือสำหรับการพิสูจน์ความถูกต้องประสิทธิภาพหรือคุณสมบัติอื่น ๆ - ฉันคิดว่า ดูบทความ Wikipediaสำหรับตัวอย่างของ 2 (พิสูจน์ความถูกต้องของวิธีแก้ปริศนา MU)

จริงๆแล้วความรู้สึกที่สามของค่าคงที่คือ:

0.3 โปรแกรม (หรือโมดูลหรือฟังก์ชัน) ควรทำอะไร กล่าวอีกนัยหนึ่งจุดประสงค์ของมัน

จากการสัมภาษณ์โคเดอร์เดียวกันในที่ทำงาน:

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


1

ค่าคงที่เป็นเหมือนกฎหรือข้อสันนิษฐานที่สามารถใช้เพื่อกำหนดตรรกะของโปรแกรมของคุณ

ตัวอย่างเช่นสมมติว่าคุณมีแอปพลิเคชันซอฟต์แวร์บางอย่างที่ติดตามบัญชีผู้ใช้ สมมติว่าผู้ใช้นั้นสามารถมีหลายบัญชี แต่ด้วยเหตุผลใดก็ตามที่คุณต้องแยกความแตกต่างระหว่างบัญชีหลักของผู้ใช้และบัญชี "นามแฝง"

นี่อาจเป็นระเบียน DB หรืออย่างอื่น แต่สำหรับตอนนี้สมมติว่าบัญชีผู้ใช้แต่ละบัญชีแสดงด้วยวัตถุคลาส

คลาส userAccount {ถ่านส่วนตัว * pUserName; ถ่านส่วนตัว * pParentAccountUserName;

... }

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


ค่าคงที่ตรวจสอบสถานะของโปรแกรม พวกเขาไม่ได้ออกแบบการตัดสินใจ
Xavier Nodet

3
ค่าคงที่ไม่ตรวจสอบอะไรเลย คุณสามารถตรวจสอบสถานะของโปรแกรมเพื่อดูว่าค่าคงที่นั้นเป็น TRUE หรือ FALSE หรือไม่ แต่จะไม่ทำอะไรเลย
Pemdas

2
โดยทั่วไปใน C ++ คุณจะเห็นค่าคงที่ของคลาสเช่นสมาชิก x ต้องน้อยกว่า 25 และมากกว่า 0 นั่นคือค่าคงที่ การตรวจสอบใด ๆ กับค่าคงที่นั้นเป็นการยืนยัน ในตัวอย่างที่ฉันมีข้างต้นค่าคงที่ของฉันคือถ้า pParentAccountUserName เป็นค่าว่างหรือเปล่าแล้วมันเป็นบัญชีหลัก ค่าคงที่คือการตัดสินใจออกแบบ
Pemdas

คุณจะตรวจสอบได้อย่างไรว่าถ้า pParentAccountUserName เป็น NULL หรือว่างเปล่าวัตถุนี้เป็นบัญชีหลัก ใบแจ้งยอดของคุณจะกำหนดว่าควรจะแสดงค่า Null / ว่างเปล่าเพียงใด ค่าคงที่คือระบบเป็นไปตามนั้นนั่นคือ pParentAccountUserName สามารถเป็นโมฆะหรือว่างเปล่าหากเป็นบัญชีหลัก มันเป็นความแตกต่างที่ลึกซึ้ง
คาเมรอน

1

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

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


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