Sunrabbit

ความแปรปรวนร่วมและความแปรปรวนตรงข้าม

สร้าง: 2024-11-01

สร้าง: 2024-11-01 01:06

เนื้อหานี้เป็นเนื้อหาที่คุณจะได้พบเจอโดยธรรมชาติ หากคุณเป็นนักพัฒนาคอมไพเลอร์
หรือใช้ 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

การติดฉลากข้อมูลคืออะไร? ประเภท ข้อดี ข้อเสียการติดฉลากข้อมูลเป็นกระบวนการที่ติดแท็กให้กับข้อมูลเพื่อให้อัลกอริทึมของปัญญาประดิษฐ์สามารถทำความเข้าใจข้อมูลได้ เช่น การแยกแยะระหว่างสุนัขกับแมว ซึ่งสามารถนำไปใช้ได้ในหลายๆ ด้านและช่วยปรับปรุงประสิทธิภาพของแบบจำลอง
세상 모든 정보
세상 모든 정보
세상 모든 정보
세상 모든 정보

March 29, 2024

[ออบเจกต์] บทที่ 2 การเขียนโปรแกรมเชิงวัตถุแนวคิดการเขียนโปรแกรมเชิงวัตถุและการสร้างระบบจองตั๋วหนังเพื่ออธิบายเกี่ยวกับ ออบเจกต์ คลาส การทำงานร่วมกัน การสืบทอด และพหุรูปแบบ
제이온
제이온
제이온
제이온

April 28, 2024

[Effective Java] รายการที่ 6: หลีกเลี่ยงการสร้างออบเจ็กต์ที่ไม่จำเป็นการสร้างออบเจ็กต์ที่ไม่จำเป็นนั้นนำไปสู่การสิ้นเปลืองหน่วยความจำ ดังนั้น สำหรับออบเจ็กต์ เช่น สตริง หรือบูลีน ควรใช้ลิเทอรัลหรือเมธอดจากโรงงานแบบคงที่แทน
제이온
제이온
제이온
제이온

April 28, 2024

[Effective Java] รายการที่ 2: พิจารณาการใช้ Builder เมื่อมีพารามิเตอร์ใน Constructor จำนวนมากการใช้รูปแบบ Builder เมื่อมีพารามิเตอร์ใน Constructor จำนวนมากสามารถช่วยเพิ่มความสามารถในการอ่านและความเสถียรได้ รูปแบบ Builder มีประสิทธิภาพมากกว่ารูปแบบ Java Beans หรือรูปแบบ Constructor แบบขั้นบันได
제이온
제이온
제이온
제이온

April 27, 2024

[Effective Java] รายการที่ 4: หากต้องการป้องกันการสร้างอินสแตนซ์ ให้ใช้คอนสตรัคเตอร์แบบ privateอธิบายวิธีการใช้คอนสตรัคเตอร์แบบ private เพื่อป้องกันการสร้างอินสแตนซ์ เมื่อสร้างคลาสยูทิลิตี้ที่ใช้เพียงเมธอดและฟิลด์แบบ static เท่านั้น
제이온
제이온
제이온
제이온

April 28, 2024

[ออบเจกต์] บทที่ 1 วัตถุ การออกแบบอธิบายถึงความสำคัญและแนวคิดของการออกแบบเชิงวัตถุในงานพัฒนาซอฟต์แวร์ พร้อมยกตัวอย่างแอปพลิเคชันจำหน่ายตั๋วเพื่อเน้นย้ำถึงความจำเป็นของการออกแบบเชิงวัตถุ
제이온
제이온
제이온
제이온

April 28, 2024