อ่าน 3 นาที
แนวคิด (การเขียนโปรแกรมทั่วไป)
ในการเขียนโปรแกรมเชิงเจเนริกแนวคิดคือคำอธิบายของการดำเนินการที่รองรับบนประเภทหนึ่งๆรวมถึงไวยากรณ์และความหมาย ในลักษณะนี้...
แนวคิด (การเขียนโปรแกรมทั่วไป)
ในการเขียนโปรแกรมเชิงเจเนริกแนวคิดคือคำอธิบายของการดำเนินการที่รองรับบนประเภทหนึ่งๆรวมถึงไวยากรณ์และความหมาย ในลักษณะนี้ แนวคิดจึงมีความสัมพันธ์กับประเภทนามธรรมแต่แนวคิดไม่จำเป็นต้องมีความสัมพันธ์แบบประเภท ย่อย
การใช้ภาษา
คำนี้ถูกใช้มาตั้งแต่ปี 1998 สำหรับSTL [ 1 ]เนื่องจากเป็นหนึ่งในไลบรารีแรกๆ ที่ใช้เทมเพลตอย่างกว้างขวางแนวคิด ของคำ นี้(และการทำให้เป็นที่นิยม) ได้รับการยกย่องให้แก่Alexander Stepanov [ 2 ] [ 3 ]ผู้ออกแบบหลักของ STL
ใน มาตรฐาน C++ 1998 คำว่า Conceptถูกนำมาใช้เพื่ออธิบายข้อกำหนดสำหรับประเภทเฉพาะอย่างง่ายๆ ซึ่งโดยปกติจะเป็นพารามิเตอร์เทมเพลต ไม่ได้มีการเข้ารหัสในภาษาอย่างชัดเจน – แนวคิดนี้แสดงออกโดยการดำเนินการที่พยายามทำกับวัตถุของประเภทนั้น และสิ่งที่คาดว่าจะทำงานได้ (นั่นคือ คอมไพล์ได้อย่างถูกต้อง) มีการเสนอให้เพิ่มแนวคิดเป็นคุณลักษณะของภาษาอย่างชัดเจนในC++11แต่ถูกปฏิเสธเนื่องจาก "ยังไม่พร้อม" ในที่สุด C++20ก็ยอมรับการออกแบบแนวคิดที่ได้รับการปรับปรุงแล้ว แม้ว่าจะเป็นเวอร์ชันที่ลดลงจากข้อเสนอเดิมก็ตาม[ 4 ]แนวคิดเป็นตัวอย่างของการกำหนดประเภทเชิงโครงสร้าง
เนื่องจากเจเนริกในJavaและC# มีความคล้ายคลึงกับ เทมเพลตใน C++ บทบาทของคอนเซ็ปต์จึงถูกแทนที่ด้วยอินเทอร์เฟซอย่างไรก็ตาม มีความแตกต่างที่สำคัญอย่างหนึ่งระหว่างคอนเซ็ปต์และอินเทอร์เฟซ คือ เมื่อพารามิเตอร์เทมเพลตจำเป็นต้องใช้งานอินเทอร์เฟซเฉพาะ การจับคู่ประเภทจะต้องเป็นคลาสที่ใช้งานอินเทอร์เฟซนั้น (อย่างชัดเจน) เท่านั้น นี่เรียกว่า การกำหนดประเภทแบบนาม ( nominal typing ) คอนเซ็ปต์ให้ความยืดหยุ่นมากกว่าเพราะสามารถตอบสนองได้สองวิธี:
- มีการกำหนดไว้อย่างชัดเจนว่าตรงตามเงื่อนไขโดยใช้แผนผังแนวคิด (ซึ่งกำหนดแยกต่างหากจากประเภทนั้นๆ ไม่เหมือนกับอินเทอร์เฟซ)
- กำหนดไว้โดยปริยายสำหรับ "แนวคิดอัตโนมัติ" ซึ่งสามารถใช้ได้กับประเภทในตัวและประเภทอื่นๆ ที่ไม่ได้กำหนดไว้สำหรับการใช้งานนี้โดยเฉพาะ
แต่ภาษา C# มีโครงสร้างหลายอย่างที่ประเภทที่ใช้ไม่จำเป็นต้องใช้งานอินเทอร์เฟซที่กำหนดไว้อย่างชัดเจน เพียงแค่ต้องตรงกับรูปแบบที่เกี่ยวข้อง (อย่างไรก็ตาม รูปแบบเหล่านี้ไม่ได้เรียกว่าแนวคิด ) ตัวอย่างเช่นforeachคำสั่งการวนซ้ำอนุญาตให้วัตถุที่วนซ้ำเป็นประเภทใดก็ได้ ตราบใดที่มันใช้งานGetEnumeratorเมธอด ที่เหมาะสม [ 5 ] (เปรียบเทียบกับusingคำสั่งที่กำหนดให้ทรัพยากรต้องใช้งานSystem.IDisposableอินเทอร์เฟซ[ 6 ] )
ภาษาการเขียนโปรแกรม Nimใช้แนวคิดเป็นชุดของเงื่อนไขบูลีนแบบคอมไพล์ไทม์ตามอำเภอใจ[ 7 ]
อีกภาษาหนึ่งที่ใช้แนวคิดคล้ายคลึงกันมากคือHaskellซึ่งคุณลักษณะนี้เรียกว่าคลาสประเภท (type classes )
ใน ภาษาการเขียนโปรแกรม Goอินเทอร์เฟซเทียบเท่ากับแนวคิดใน C++ ซึ่งกำหนดชุดของลายเซ็นเมธอด ต่างจากอินเทอร์เฟซใน Java/C# ที่คลาสต้องประกาศว่าใช้งานอินเทอร์เฟซนั้น ประเภทที่ตรงตามลายเซ็นเหล่านี้จะใช้งานอินเทอร์เฟซ (โดยปริยาย) [ 8 ]
ตัวอย่าง
การสั่งซื้อทั้งหมด
แนวคิดการเรียงลำดับทั้งหมดอธิบายความหมายของ<ตัวดำเนินการ ประเภทจะถูกเรียงลำดับทั้งหมดเมื่อ<เป็นตัวบ่งชี้ไบนารีและเป็นไปตามคุณสมบัติต่อไปนี้: [ 9 ] [ 10 ]
- ต่อต้านการสะท้อนกลับ:
!(a < a)สำหรับค่าใดๆaก็ตาม - กริยาที่ต้องการกรรม: ถ้า
a < bเช่นb < cนั้นa < c - สมมาตรผกผัน: ถ้า
a < bเช่นนั้น!(b < a). - รวม: ถ้า
a != bเช่นนั้นa < bหรือb < a.
อัลกอริทึมหลายตัวอาศัยคุณสมบัติเหล่านี้เพื่อให้ทำงานได้อย่างถูกต้อง ตัวอย่างเช่นminฟังก์ชันสามารถกำหนดได้อย่างปลอดภัยบนประเภทที่มีลำดับสมบูรณ์:
import std ;โดยใช้std :: totally_ordered ;template < totally_ordered T > [[ nodiscard ]] constexpr T min ( T a , T b ) noexcept { return ( b < a ) ? b : a ; }หรือแทนที่จะใช้แนวคิด "แทนที่" อาจใช้ข้อความย่อยแทนได้typenameข้อความย่อยจำเป็นเฉพาะเมื่อข้อจำกัดซับซ้อนเกินกว่าจะอธิบายโดยตรงในคำประกาศ เท่านั้น นอกจากนี้ยังสามารถใช้ข้อความย่อยต่อท้ายได้อีกด้วย requiresrequirestypenamerequires
template < typename T > requires totally_ordered < T > [[ nodiscard ]] constexpr T min ( T a , T b ) noexcept { return ( b < a ) ? b : a ; }ตัววนซ้ำ
หากประเภทIterตรงตามแนวคิด Trivial Iterator ใน C++ และiเป็นประเภทIterนิพจน์ต่อไปนี้จะถือว่าถูกต้องตามความหมายที่สอดคล้องกัน: [ 11 ]
Iter iโครงสร้างเริ่มต้น*iต้องสามารถแปลงเป็นประเภทใดประเภทหนึ่งTได้i->mถือว่าถูกต้องหาก(*i).mเป็นเช่นนั้น
ดูเพิ่มเติม
ลิงก์ภายนอก
- เทคนิคการเขียนโปรแกรมทั่วไปของ Boost
- Douglas Gregorและคณะแนวคิด: การสนับสนุนทางภาษาศาสตร์สำหรับการเขียนโปรแกรมแบบทั่วไปใน C++
- ดั๊ก เกรเกอร์ บรรยายเรื่องแนวคิดต่างๆ ที่ Google (วิดีโอ)
- การเปรียบเทียบแนวคิดของ C++ และคลาสประเภทใน Haskell เก็บถาวรเมื่อ 2017-08-09 ที่Wayback Machine
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ แนวคิด (การเขียนโปรแกรมทั่วไป)
ในการเขียนโปรแกรมเชิงเจเนริกแนวคิดคือคำอธิบายของการดำเนินการที่รองรับบนประเภทหนึ่งๆรวมถึงไวยากรณ์และความหมาย ในลักษณะนี้...
การใช้ภาษา
คำนี้ถูกใช้มาตั้งแต่ปี 1998 สำหรับ STL [ 1 ] เนื่องจากเป็นหนึ่งในไลบรารีแรกๆ ที่ใช้เทมเพลตอย่างกว้างขวาง แนวคิด ของคำ นี้ ( และการทำให้เป็นที่นิยม) ได้รับการยกย่องให้แก่ Alexander Stepanov [ 2 ] [ 3 ] ผู้ออกแบบหลักของ STL
การสั่งซื้อทั้งหมด
แนวคิดการเรียงลำดับทั้งหมดอธิบายความหมายของ < ตัวดำเนินการ ประเภทจะถูกเรียงลำดับทั้งหมดเมื่อ < เป็นตัวบ่งชี้ไบนารีและเป็นไปตามคุณสมบัติต่อไปนี้: [ 9 ] [ 10 ]
ตัววนซ้ำ
หากประเภท Iter ตรงตามแนวคิด Trivial Iterator ใน C++ และ i เป็นประเภท Iter นิพจน์ต่อไปนี้จะถือว่าถูกต้องตามความหมายที่สอดคล้องกัน: [ 11 ]