คำถามที่ดี! ก่อนที่ฉันจะไปถึงคำถามเฉพาะที่คุณถามฉันจะพูดว่า: อย่าประมาทพลังแห่งความเรียบง่าย Tenpn ถูกต้อง โปรดทราบว่าสิ่งที่คุณพยายามทำด้วยวิธีการเหล่านี้คือการหาหนทางที่สวยงามในการเลื่อนการเรียกฟังก์ชั่นหรือแยกผู้โทรออกจากผู้โทร ฉันสามารถแนะนำ coroutines เป็นวิธีที่ใช้งานง่ายอย่างน่าประหลาดใจเพื่อบรรเทาปัญหาเหล่านั้น แต่นั่นเป็นเรื่องเล็กน้อย บางครั้งคุณก็ควรโทรหาฟังก์ชั่นและใช้ชีวิตด้วยความจริงที่ว่าเอนทิตี้ A เชื่อมโยงโดยตรงกับเอนทิตีบีดู YAGNI
ที่กล่าวว่าฉันเคยใช้และมีความสุขกับรูปแบบสัญญาณ / สล็อตรวมกับการส่งข้อความแบบง่าย ฉันใช้มันใน C ++ และ Lua สำหรับชื่อ iPhone ที่ค่อนข้างประสบความสำเร็จและมีตารางงานที่แน่นมาก
สำหรับกรณีสัญญาณ / สล็อตถ้าฉันต้องการให้เอนทิตี้ A ทำบางสิ่งบางอย่างเพื่อตอบสนองต่อเอนทิตี B ที่ทำ (เช่นปลดล็อกประตูเมื่อมีอะไรบางอย่างตาย) ฉันอาจมีเอนทิตี้ A สมัครสมาชิกโดยตรงกับเหตุการณ์การตายของเอนทิตี้ B หรือเอนทิตี A อาจสมัครสมาชิกกลุ่มแต่ละกลุ่มเพิ่มจำนวนตัวนับในแต่ละเหตุการณ์ที่ถูกไล่ออกและปลดล็อคประตูหลังจากที่ N ของพวกเขาเสียชีวิต นอกจากนี้ "กลุ่มเอนทิตี" และ "N ของพวกเขา" โดยทั่วไปจะถูกกำหนดไว้ในข้อมูลระดับ (นอกเหนือจากนี้นี่เป็นพื้นที่หนึ่งที่ coroutines สามารถส่องแสงได้จริง ๆ เช่น WaitForMultiple ("Dying", entA, entB, entC); door.Unlock ();)
แต่นั่นอาจทำให้เกิดความยุ่งยากเมื่อพูดถึงปฏิกิริยาที่แนบคู่กับรหัส C ++ หรือเหตุการณ์เกมชั่วคราวโดยเนื้อแท้: สร้างความเสียหาย, โหลดอาวุธ, แก้จุดบกพร่อง, ตอบกลับ AI ที่อิงตามตำแหน่งของผู้เล่น นี่คือที่การส่งข้อความสามารถเติมช่องว่าง มันบอกอะไรทำนองนี้ "บอกทุกหน่วยงานในพื้นที่นี้ให้ได้รับความเสียหายภายใน 3 วินาที" หรือ "เมื่อใดก็ตามที่คุณทำฟิสิกส์ให้เสร็จเพื่อให้รู้ว่าใครเป็นคนยิงฉันบอกให้พวกเขาเรียกใช้ฟังก์ชันสคริปต์นี้" เป็นการยากที่จะทราบวิธีการทำเช่นนั้นโดยใช้การเผยแพร่ / สมัครสมาชิกหรือสัญญาณ / สล็อต
สิ่งนี้สามารถ overkill ได้ง่าย (เทียบกับตัวอย่างของ tenpn) นอกจากนี้ยังสามารถขยายตัวได้อย่างไม่มีประสิทธิภาพหากคุณมีการดำเนินการมากมาย แต่ถึงแม้จะมีข้อเสีย แต่วิธี "ข้อความและกิจกรรม" นี้เข้ากันได้ดีกับโค้ดเกมที่เขียนสคริปต์ (เช่นใน Lua) รหัสสคริปต์สามารถกำหนดและตอบสนองต่อข้อความและเหตุการณ์ของตนเองโดยไม่ต้องใช้รหัส C ++ ในการดูแลเลย และโค้ดสคริปต์สามารถส่งข้อความที่เรียกรหัส C ++ เช่นระดับการเปลี่ยนแปลงการเล่นเสียงหรือแม้แต่ปล่อยให้อาวุธตั้งค่าความเสียหายที่ข้อความ TakeDamage ส่งมอบได้อย่างง่ายดาย มันช่วยฉันได้สักระยะเพราะฉันไม่ต้องโง่ไปกับ luabind และให้ฉันเก็บรหัส luabind ทั้งหมดไว้ในที่เดียวเพราะมันมีไม่มาก เมื่อประกอบเข้าด้วยกันอย่างถูกต้อง
นอกจากนี้ประสบการณ์ของฉันกับกรณีการใช้งาน # 2 คือว่าคุณดีกว่าจัดการกับมันเป็นเหตุการณ์ในทิศทางอื่น แทนที่จะถามว่าสุขภาพของกิจการคืออะไรให้เริ่มเหตุการณ์ / ส่งข้อความเมื่อใดก็ตามที่สุขภาพมีการเปลี่ยนแปลงที่สำคัญ
ในแง่ของอินเทอร์เฟซ btw ฉันลงเอยด้วยคลาสที่สามเพื่อใช้ทั้งหมดนี้: EventHost, EventClient และ MessageClient EventHosts สร้างสล็อต, EventClients สมัครสมาชิก / เชื่อมต่อกับพวกเขาและ MessageClients เชื่อมโยงผู้ได้รับมอบหมายกับข้อความ โปรดทราบว่าเป้าหมายผู้รับมอบสิทธิ์ของ MessageClient ไม่จำเป็นต้องเป็นวัตถุเดียวกับเจ้าของสมาคม ในคำอื่น ๆ MessageClients สามารถมีอยู่เพียงเพื่อส่งต่อข้อความไปยังวัตถุอื่น FWIW คำอุปมาโฮสต์ / ไคลเอ็นต์นั้นไม่เหมาะสม Source / Sink อาจเป็นแนวคิดที่ดีกว่า
ขอโทษฉันเดินไปที่นั่น มันเป็นคำตอบแรกของฉัน :) ฉันหวังว่ามันจะสมเหตุสมผล