คำถามติดแท็ก invariants

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

6
Foreach-loop พร้อม break / return vs. while-loop ที่มี invariant และ post-condition อย่างชัดเจน
นี่เป็นวิธีที่นิยมมากที่สุด (ดูเหมือนฉัน) ในการตรวจสอบว่าค่าอยู่ในอาร์เรย์หรือไม่: for (int x : array) { if (x == value) return true; } return false; อย่างไรก็ตามในหนังสือที่ฉันอ่านเมื่อหลายปีก่อนโดยอาจ Wirth หรือ Dijkstra มันก็บอกว่าสไตล์นี้ดีกว่า (เมื่อเทียบกับ while-loop ที่มีทางออกด้านใน): int i = 0; while (i < array.length && array[i] != value) i++; return i < array.length; วิธีนี้เงื่อนไขการออกเพิ่มเติมกลายเป็นส่วนหนึ่งที่ชัดเจนของลูปค่าคงที่ไม่มีเงื่อนไขที่ซ่อนอยู่และออกจากภายในลูปทุกอย่างชัดเจนมากขึ้นและมากขึ้นด้วยวิธีการเขียนโปรแกรมแบบมีโครงสร้าง ฉันมักจะแนะนำนี้รูปแบบหลังเมื่อใดก็ตามที่เป็นไปได้และใช้for-loop เพียงสำทับจากไปab ถึงกระนั้นฉันก็ไม่สามารถพูดได้ว่ารุ่นแรกนั้นมีความชัดเจนน้อยกว่า บางทีมันอาจจะชัดเจนและเข้าใจง่ายกว่าอย่างน้อยก็สำหรับผู้เริ่มต้น ดังนั้นฉันยังคงถามตัวเองว่าคำถามใดดีกว่ากัน? บางทีใครบางคนสามารถให้เหตุผลที่ดีแก่คนใดคนหนึ่งในวิธีการ? …

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

1
อายุการใช้งานของวัตถุกับความหมายของการย้าย
เมื่อฉันเรียนรู้ C ++ นานมาแล้วมันเน้นอย่างมากกับฉันว่าส่วนหนึ่งของจุดของ C ++ คือเหมือนลูปมี "loop-invariants" คลาสยังมีค่าคงที่ที่เกี่ยวข้องกับอายุการใช้งานของวัตถุ - สิ่งที่ควรเป็นจริง เพราะตราบเท่าที่วัตถุยังมีชีวิตอยู่ สิ่งที่ควรกำหนดโดยผู้สร้างและเก็บรักษาไว้โดยวิธีการ การห่อหุ้ม / การควบคุมการเข้าถึงมีไว้เพื่อช่วยให้คุณบังคับใช้ค่าคงที่ Raii เป็นสิ่งหนึ่งที่คุณสามารถทำได้กับความคิดนี้ ตั้งแต่ C ++ 11 ตอนนี้เรามีความหมายย้าย สำหรับคลาสที่รองรับการย้ายการย้ายจากวัตถุไม่สิ้นสุดอย่างเป็นทางการตลอดอายุการย้ายควรจะปล่อยให้มันอยู่ในสถานะ "ถูกต้อง" บางอย่าง ในการออกแบบชั้นเรียนเป็นเรื่องที่ไม่ถูกต้องหรือไม่หากคุณออกแบบชั้นเรียนเพื่อให้ค่าคงที่ของชั้นเรียนถูกเก็บรักษาไว้จนถึงจุดที่ถูกย้ายออกไป หรือว่าไม่เป็นไรถ้ามันจะช่วยให้คุณทำให้มันเร็วขึ้น หากต้องการทำให้เป็นรูปธรรมสมมติว่าฉันมีประเภททรัพยากรที่ไม่สามารถคัดลอกได้ แต่เคลื่อนย้ายได้เช่น: class opaque { opaque(const opaque &) = delete; public: opaque(opaque &&); ... void mysterious(); void mysterious(int); void mysterious(std::vector<std::string>); }; และด้วยเหตุผลใดก็ตามฉันจำเป็นต้องทำ …

3
การเขียนโปรแกรมการทำงานคืออะไรคำตอบให้กับค่าคงที่ประเภทตาม?
ฉันรู้ว่าแนวคิดของค่าคงที่มีอยู่ในกระบวนทัศน์การเขียนโปรแกรมหลายรายการ ตัวอย่างเช่นค่าคงที่ลูปมีความเกี่ยวข้องใน OO การเขียนโปรแกรมเชิงฟังก์ชันและโพรซีเดอร์ อย่างไรก็ตามชนิดหนึ่งที่มีประโยชน์มากที่พบใน OOP คือค่าคงที่ของข้อมูลประเภทใดประเภทหนึ่ง นี่คือสิ่งที่ฉันเรียกว่า "ค่าคงที่ประเภทตาม" ในชื่อ ตัวอย่างเช่นFractionประเภทอาจมีnumeratorและdenominatorด้วยค่าคงที่ gcd ของพวกเขาเสมอ 1 (เช่นเศษส่วนอยู่ในรูปแบบลดลง) ฉันสามารถรับประกันได้เพียงแค่มีการห่อหุ้มบางประเภทไม่ให้ข้อมูลถูกตั้งค่าอย่างอิสระ ในทางกลับกันฉันไม่ต้องตรวจสอบว่ามันลดลงหรือไม่ดังนั้นฉันจึงสามารถลดความซับซ้อนของอัลกอริทึมเช่นการตรวจสอบความเท่าเทียมกันได้ ในทางตรงกันข้ามถ้าฉันเพียงแค่ประกาศFractionประเภทโดยไม่ให้การรับประกันนี้ผ่านการห่อหุ้มฉันไม่สามารถเขียนฟังก์ชันใด ๆ ในประเภทนี้ได้อย่างปลอดภัยซึ่งคิดว่าเศษส่วนจะลดลงเพราะในอนาคตคนอื่นอาจเข้ามาและเพิ่มวิธี จากการได้รับเศษส่วนที่ไม่ลดลง โดยทั่วไปการขาดค่าคงที่ประเภทนี้อาจนำไปสู่: อัลกอริทึมที่ซับซ้อนมากขึ้นเนื่องจากต้องมีการตรวจสอบ / รับประกันล่วงหน้าในหลาย ๆ สถานที่ การละเมิด DRY เนื่องจากเงื่อนไขล่วงหน้าซ้ำ ๆ เหล่านี้แสดงถึงความรู้พื้นฐานที่เหมือนกัน (ที่ค่าคงที่ควรเป็นจริง) มีการบังคับใช้เงื่อนไขล่วงหน้าผ่านความล้มเหลวรันไทม์มากกว่าการรวบรวมเวลารับประกัน ดังนั้นคำถามของฉันคือสิ่งที่การเขียนโปรแกรมการทำงานตอบสนองค่าคงที่ประเภทนี้ มีวิธีการทำงานที่เป็นไปตามสำนึกของการบรรลุสิ่งเดียวกันมากขึ้นหรือน้อยลง? หรือมีลักษณะบางอย่างของการเขียนโปรแกรมฟังก์ชั่นซึ่งทำให้ประโยชน์ที่เกี่ยวข้องน้อยลง?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.