เมื่อใดก็ตามที่ฉันสามารถฉันพยายามที่จะ จำกัด การสื่อสารระหว่างวัตถุในรูปแบบการร้องขอและตอบสนอง มีการจัดเรียงบางส่วนโดยนัยเกี่ยวกับวัตถุในโปรแกรมของฉันเช่นว่าระหว่างวัตถุ A และ B ใด ๆ อาจมีวิธีสำหรับ A ในการเรียกวิธีการของ B โดยตรงหรือโดยอ้อมหรือ B เพื่อเรียกวิธี A โดยตรงหรือโดยอ้อม แต่เป็นไปไม่ได้ที่ A และ B จะเรียกวิธีการของกันและกัน แน่นอนว่าบางครั้งคุณต้องการสื่อสารย้อนกลับไปยังผู้โทรของวิธีการ มีสองวิธีที่ฉันชอบทำเช่นนี้และไม่มีการโทรกลับ
วิธีหนึ่งคือการรวมข้อมูลเพิ่มเติมในค่าส่งคืนของการเรียกใช้เมธอดซึ่งหมายความว่ารหัสไคลเอนต์ได้รับการตัดสินใจว่าจะทำอย่างไรหลังจากโพรซีเดอร์ส่งคืนการควบคุม
อีกวิธีหนึ่งคือการโทรออกไปยังวัตถุลูกร่วมกัน นั่นคือถ้า A เรียกใช้เมธอดบน B และ B จำเป็นต้องสื่อสารข้อมูลบางอย่างไปยัง A, B เรียกเมธอดบน C โดยที่ A และ B สามารถเรียกทั้งสองได้ว่า C แต่ C ไม่สามารถเรียก A หรือ B. Object A ได้ รับผิดชอบในการรับข้อมูลจาก C หลังจาก B คืนค่าการควบคุมไปที่ A โปรดทราบว่านี่ไม่ได้แตกต่างอย่างแท้จริงจากวิธีแรกที่ฉันเสนอ วัตถุ A สามารถดึงข้อมูลจากค่าที่ส่งคืนได้เท่านั้น ไม่มีการเรียกใช้เมธอดของวัตถุ A โดย B หรือ C การเปลี่ยนแปลงของกลอุบายนี้คือการส่ง C เป็นพารามิเตอร์ไปยังเมธอด แต่ข้อ จำกัด เกี่ยวกับความสัมพันธ์ของ C กับ A และ B ยังคงมีผลบังคับใช้
ตอนนี้คำถามสำคัญคือทำไมฉันยืนยันที่จะทำสิ่งนี้ มีสามเหตุผลหลัก:
- มันทำให้วัตถุของฉันควบคู่กันมากขึ้นอย่างอิสระ วัตถุของฉันอาจห่อหุ้มวัตถุอื่น แต่พวกเขาจะไม่ขึ้นอยู่กับบริบทของผู้โทรและบริบทจะไม่พึ่งพาวัตถุที่ห่อหุ้ม
- มันทำให้การควบคุมของฉันเป็นเรื่องง่าย เป็นเรื่องดีที่สามารถสันนิษฐานได้ว่ามีเพียงรหัสเดียวที่สามารถเปลี่ยนสถานะภายในของ
self
ในขณะที่วิธีการดำเนินการเป็นวิธีหนึ่งและไม่มีวิธีอื่น นี่เป็นเหตุผลแบบเดียวกับที่อาจนำไปสู่การทำให้ mutex บนวัตถุที่เกิดขึ้นพร้อมกัน
- มันปกป้องค่าคงที่ในข้อมูลที่ห่อหุ้มของวัตถุของฉัน วิธีการสาธารณะได้รับอนุญาตให้พึ่งพาค่าคงที่และค่าคงที่เหล่านั้นอาจถูกละเมิดหากวิธีการหนึ่งสามารถถูกเรียกใช้จากภายนอกในขณะที่อีกวิธีหนึ่งกำลังดำเนินการอยู่
ฉันไม่ได้ต่อต้านการโทรกลับทั้งหมด ในการปฏิบัติตามนโยบายของฉันในการไม่เรียก "ผู้โทร" ถ้าวัตถุ A เรียกใช้เมธอดบน B และผ่านการติดต่อกลับไปการเรียกกลับอาจไม่เปลี่ยนสถานะภายในของ A และรวมถึงวัตถุที่ห่อหุ้มโดย A และ วัตถุในบริบทของ A กล่าวอีกนัยหนึ่งการเรียกกลับอาจเรียกใช้เมธอดบนวัตถุที่ให้โดย B เท่านั้นการเรียกกลับมีผลอยู่ภายใต้ข้อ จำกัด เดียวกันกับที่ B คือ
ปลายหลวมสุดท้ายที่จะผูกคือฉันจะอนุญาตให้มีการเรียกใช้ฟังก์ชั่นบริสุทธิ์ใด ๆ โดยไม่คำนึงถึงการสั่งซื้อบางส่วนนี้ฉันได้พูดคุยเกี่ยวกับ ฟังก์ชั่นที่บริสุทธิ์แตกต่างจากวิธีการที่พวกเขาไม่สามารถเปลี่ยนหรือขึ้นอยู่กับสถานะที่ไม่แน่นอนหรือผลข้างเคียงดังนั้นจึงไม่ต้องกังวลเกี่ยวกับพวกเขาสับสนเรื่อง