มันเป็นจุดสำคัญ แต่ IMHO คุ้มค่าที่จะเข้าใจ
ทุกภาษา OO ทำสำเนาของการอ้างอิงเสมอและห้ามคัดลอกวัตถุ 'ล่องหน' มันจะมากยากที่จะเขียนโปรแกรมถ้าภาษา OO ทำงานหรือวิธีอื่น ๆ ตัวอย่างเช่นฟังก์ชั่นและวิธีการไม่สามารถอัปเดตวัตถุได้ ภาษาจาวาและภาษา OO ส่วนใหญ่แทบจะเป็นไปไม่ได้ที่จะใช้หากไม่มีความซับซ้อนเพิ่มขึ้นอย่างมาก
วัตถุในโปรแกรมควรจะมีความหมายบางอย่าง ตัวอย่างเช่นมันแสดงให้เห็นถึงสิ่งที่เฉพาะเจาะจงในโลกทางกายภาพที่แท้จริง มันมักจะทำให้รู้สึกถึงมีการอ้างอิงจำนวนมากในสิ่งเดียวกัน ตัวอย่างเช่นที่อยู่บ้านของฉันสามารถมอบให้กับผู้คนและองค์กรจำนวนมากและที่อยู่นั้นอ้างอิงถึงสถานที่ตั้งทางกายภาพเดียวกันเสมอ ดังนั้นประเด็นแรกคือวัตถุมักแสดงสิ่งที่เฉพาะเจาะจงจริงหรือเป็นรูปธรรม และเพื่อให้สามารถมีการอ้างอิงจำนวนมากในสิ่งเดียวกันมีประโยชน์อย่างยิ่ง มิฉะนั้นจะเป็นการยากที่จะเขียนโปรแกรม
ทุกครั้งที่คุณส่งผ่านa
เป็นอาร์กิวเมนต์ / พารามิเตอร์ไปยังฟังก์ชั่นอื่นเช่นการโทร
foo(Dog aDoggy);
หรือใช้วิธีa
การรหัสโปรแกรมพื้นฐานทำสำเนาของการอ้างอิงเพื่อสร้างการอ้างอิงที่สองไปยังวัตถุเดียวกัน
นอกจากนี้หากรหัสที่มีการอ้างอิงที่คัดลอกอยู่ในเธรดที่ต่างกันทั้งคู่สามารถใช้พร้อมกันเพื่อเข้าถึงวัตถุเดียวกัน
ดังนั้นในโปรแกรมที่มีประโยชน์มากที่สุดจะมีการอ้างอิงหลายอย่างไปยังวัตถุเดียวกันเพราะนั่นคือความหมายของภาษาการเขียนโปรแกรม OO ส่วนใหญ่
ตอนนี้ถ้าเราคิดถึงมันเพราะการส่งต่อโดยอ้างอิงเป็นกลไกเดียวที่มีอยู่ในหลายภาษา OO (C ++ รองรับทั้งคู่) เราอาจคาดหวังว่ามันจะเป็นพฤติกรรมเริ่มต้นที่ 'ถูกต้อง'
IMHO การใช้การอ้างอิงเป็นค่าเริ่มต้นที่ถูกต้องด้วยเหตุผลสองประการ:
- มันรับประกันว่ามูลค่าของวัตถุที่ใช้ในสองสถานที่ที่แตกต่างกันเหมือนกัน ลองนึกภาพวางวัตถุลงในโครงสร้างข้อมูลที่แตกต่างกันสอง (อาร์เรย์รายการ ฯลฯ ) และทำการดำเนินการบางอย่างบนวัตถุที่เปลี่ยนแปลงมัน นั่นอาจเป็นฝันร้ายที่จะแก้ไขข้อผิดพลาด ที่สำคัญมันเป็นวัตถุเดียวกันในโครงสร้างข้อมูลทั้งสองหรือโปรแกรมมีข้อผิดพลาด
- คุณสามารถ refactor รหัสอย่างมีความสุขในหลาย ๆ ฟังก์ชั่นหรือรวมรหัสจากฟังก์ชั่นหลาย ๆ เป็นหนึ่งและความหมายไม่เปลี่ยนแปลง หากภาษาไม่ได้ให้ความหมายของการอ้างอิงมันจะซับซ้อนยิ่งขึ้นในการปรับเปลี่ยนรหัส
นอกจากนี้ยังมีข้อโต้แย้งประสิทธิภาพ การทำสำเนาของวัตถุทั้งหมดมีประสิทธิภาพน้อยกว่าการคัดลอกข้อมูลอ้างอิง อย่างไรก็ตามฉันคิดว่ามันผิดพลาด การอ้างอิงหลายอย่างไปยังวัตถุเดียวกันนั้นสมเหตุสมผลและใช้งานได้ง่ายกว่าเพราะมันตรงกับความหมายของโลกทางกายภาพที่แท้จริง
ดังนั้น IMHO มันมักจะเหมาะสมที่จะมีการอ้างอิงหลายอย่างไปยังวัตถุเดียวกัน ในกรณีที่ผิดปกติซึ่งไม่เหมาะสมในบริบทของอัลกอริทึมภาษาส่วนใหญ่ให้ความสามารถในการทำสำเนา 'โคลน' หรือสำเนาลึก อย่างไรก็ตามนั่นไม่ใช่ค่าเริ่มต้น
ฉันคิดว่าคนที่โต้เถียงว่าสิ่งนี้ไม่ควรเป็นค่าเริ่มต้นกำลังใช้ภาษาที่ไม่มีการรวบรวมขยะอัตโนมัติ ตัวอย่างเช่น C ++ แบบเก่า ปัญหาคือพวกเขาจำเป็นต้องหาวิธีในการเก็บรวบรวมวัตถุ 'ตาย' และไม่เรียกคืนวัตถุที่อาจยังคงต้องการ การมีการอ้างอิงหลายอย่างไปยังวัตถุเดียวกันทำให้ยาก
ฉันคิดว่าถ้า C ++ มีการรวบรวมขยะที่มีต้นทุนต่ำเพียงพอดังนั้นวัตถุที่อ้างอิงทั้งหมดจะถูกเก็บรวบรวมขยะแล้วการคัดค้านส่วนใหญ่จะหายไป ยังมีบางกรณีที่ความหมายอ้างอิงไม่จำเป็นต้องใช้ อย่างไรก็ตามจากประสบการณ์ของฉันคนที่สามารถระบุสถานการณ์เหล่านั้นมักจะสามารถเลือกความหมายที่เหมาะสมอยู่แล้ว
ฉันเชื่อว่ามีหลักฐานบางอย่างที่แสดงว่ามีโค้ดจำนวนมากในโปรแกรม C ++ เพื่อจัดการหรือลดการรวบรวมขยะ อย่างไรก็ตามการเขียนและการบำรุงรักษารหัส 'infrastructural' นั้นเพิ่มต้นทุน มีไว้เพื่อให้ภาษาใช้งานง่ายขึ้นหรือมีประสิทธิภาพมากขึ้น ตัวอย่างเช่นภาษา Go ได้รับการออกแบบโดยมุ่งเน้นที่การแก้ไขจุดอ่อนของ C ++ และไม่มีทางเลือกอื่นนอกจากการเก็บขยะ
แน่นอนว่าไม่เกี่ยวข้องในบริบทของ Java มันถูกออกแบบมาให้ใช้งานง่ายและยังมีการเก็บขยะ ดังนั้นจึงมีการอ้างอิงหลายรายการเป็นความหมายเริ่มต้นและค่อนข้างปลอดภัยในแง่ที่ว่าวัตถุไม่ได้ถูกเรียกคืนในขณะที่มีการอ้างอิงถึงพวกเขา แน่นอนว่าพวกเขาอาจถูกจัดโครงสร้างข้อมูลเพราะโปรแกรมไม่เป็นระเบียบเรียบร้อยเมื่อมันเสร็จสิ้นกับวัตถุจริงๆ
ดังนั้นการวนกลับไปที่คำถามของคุณ (ด้วยการวางนัยทั่วไป) เมื่อคุณต้องการการอ้างอิงมากกว่าหนึ่งไปยังวัตถุเดียวกัน ค่อนข้างมากในทุกสถานการณ์ที่ฉันสามารถคิดได้ พวกเขาเป็นความหมายเริ่มต้นของกลไกการผ่านพารามิเตอร์ภาษาส่วนใหญ่ ฉันขอแนะนำว่าเป็นเพราะความหมายเริ่มต้นของการจัดการวัตถุที่มีอยู่ในโลกแห่งความเป็นจริงค่อนข้างจะต้องมีการอ้างอิง ('เพราะวัตถุจริงออกมี)
ความหมายอื่นใดจะยากต่อการจัดการ
Dog a = new Dog("rover"); // initialise with name
DogList dl = new DogList()
dl.add(a)
...
a.setOwner("Mr Been")
ฉันขอแนะนำว่า "rover" ในdl
ควรเป็นผลกระทบsetOwner
หรือโปรแกรมยากที่จะเขียนทำความเข้าใจแก้ปัญหาหรือแก้ไข ฉันคิดว่าโปรแกรมเมอร์ส่วนใหญ่จะงงหรือตกใจอย่างอื่น
ต่อมาสุนัขจะถูกขาย:
soldDog = dl.lookupOwner("rover", "Mr Been")
soldDog.setOwner("Mr Mcgoo")
การประมวลผลแบบนี้เป็นเรื่องปกติและปกติ ดังนั้นความหมายของการอ้างอิงจึงเป็นค่าเริ่มต้นเพราะโดยทั่วไปแล้วจะสมเหตุสมผลที่สุด
สรุป: มันเหมาะสมเสมอที่จะมีการอ้างอิงหลาย ๆ อันไปยังวัตถุเดียวกัน