- Covariance and contravariance (computer science)
- Many programming language type systems support subtyping. For instance, if the type Cat is a subtype of Animal, then an expression of type Cat should be substitutable wherever an expression of type Animal is used.
เนื้อหานี้เป็นเนื้อหาที่คุณจะได้พบเจอโดยธรรมชาติ หากคุณเป็นนักพัฒนาคอมไพเลอร์
หรือใช้ API ของคอมไพเลอร์
หรือใช้ระบบชนิดข้อมูลของคอมไพเลอร์มากเกินไป
เป็นเนื้อหาที่พบเจอได้ตามธรรมชาติในชีวิตการเขียนโค้ดของเรา
และมันผสานเข้ากับชีวิตการเขียนโค้ดของเราอย่างกลมกลืน
อย่างง่ายๆ สมมติว่าเรามีสองชนิดข้อมูล Animal และ Dog
ถ้า Dog ถูกกำหนดให้เป็น Animal ความแปรปรวนร่วม (Covariance)และ
ในทางกลับกันถ้า Animal ถูกกำหนดให้เป็น Dog ความแปรปรวนตรงข้าม (Contravariance)นั่นเอง
โดยทั่วไปแล้ว เราไม่สามารถกำหนด Animal ให้เป็น Dog ได้
เพราะว่าในมุมมองของคนทั่วไปแล้วมันไม่สมเหตุสมผล
ดังนั้นนักพัฒนาคอมไพเลอร์จึงคำนึงถึงเรื่องนี้และบางส่วนเท่านั้นที่ใส่ความแปรปรวนตรงข้ามเข้าไป
โดยทั่วไปแล้วจะใช้ความแปรปรวนตรงข้ามกับค่า input ของฟังก์ชัน และรักษาความแปรปรวนร่วมไว้กับค่า output
แล้วทำไมความแปรปรวนตรงข้ามถึงจำเป็น?คุณอาจสงสัย
มันช่วยให้เราทำงานได้อย่างยืดหยุ่นและรักษา polymorphism ไว้ได้มากขึ้น ในส่วนของการจัดการเหตุการณ์ (Event Handling)
ในทางกลับกัน ความแปรปรวนร่วมอาจทำให้เกิดปัญหาได้
ในโค้ดด้านบน เราใส่ Animal ลงไปในตำแหน่งที่ควรจะเป็น Dog เพื่อเพิ่มความยืดหยุ่นและคำนึงถึง polymorphism
แต่ถ้าเราใส่ Chiwawa ซึ่งเป็น subtype ของ Dog ลงไปแทน เมื่อเรียกใช้ Event Handler มันอาจเกิด error ได้ เพราะ Dog ไม่มี interface เฉพาะของ Chiwawa
ในทางกลับกัน หากเราใช้ Animal เป็น type ในการเรียกใช้ฟังก์ชัน ระบบก็จะจัดการ subtype ของ Animal อย่างอัตโนมัติ
อาจทำให้รู้สึกเหมือนกับว่า Dog ถูกกำหนดให้เป็น Animal
โดยทั่วไปแล้ว ความแปรปรวนตรงข้ามจะใช้กับค่า input เป็นหลัก
ความแปรปรวนร่วมและตรงข้าม (Invariance)
สรุปสั้นๆ คือ ความแปรปรวนร่วมและตรงข้าม (Invariance) หมายถึงทั้งความแปรปรวนร่วมและตรงข้ามสามารถทำได้ ในขณะที่ความไม่แปรปรวน (Invariance) หมายถึงทั้งสองอย่างไม่สามารถทำได้
สรุป
เนื้อหานี้เป็นเนื้อหาที่ง่ายหรือซับซ้อน ขึ้นอยู่กับมุมมองของแต่ละคน
ลองอ่านดูนะครับ
ความคิดเห็น0