Alacsony elem a hiearchiában üzenjen egy magas szintű elemnek?
C++, Tegyük fel vannak ezek az osztályok: A, B, C, D, E
A tartalmaz egy B-t, B tartalmaz C-ket, C tartalmaz D-ket, D-nek van egy E tagja..
D-nek el kéne juttatni A-hoz az ő E-jének pointerét.
Jelenleg úgy van, hogy minden alsóbb elem ismeri a felette álló elemet (tulajdonosát).
Ha az implementációban importálom a fentebbi elemeket, akkor lehetne azt csinálni D-ben, hogy GetC().GetB().GetA().DoSomething().
De ez nem tűnik igazán jónak.
Ha nem ismeri, akkor meg azt lehetne, hogy:
C.DoSomething(), ez meghívja a B.DoSomething()-ot, ami meghívja az A.DoSomething()-ot.
De ez se igazán jó, mert minden műveletre kéne egy rakat metódus mindne osztályba. (bár azt még meg lehet csinálni, hogy egy absztrakt információt szállít egy metódus lánc A-hoz, szóval minden köztes osztályban 1 metódus lenne, amik láncolva hívják egymást, egészen addig, amíg nem érkezik meg A-hoz, aki pedig megnézi, hogy mi is ez az absztrakt információ valójában, és feldolgozza azt. (ezt lehet dynamic_cast-al, de az nem szerencsés, vagy lehetne egy enum az absztrakt típusban, ami jelzi a típusát, és aszerint castolni. De ez meg redundáns)
Jelenleg ennyi jutott eszembe, de egyszerűen nem tudok egy szép és effektív megoldást erre.
Hogyan lehet átlátható, kicsi kóddal elérni ezt a D és A közötti kommunikációt?
Ha ilyet kell csinálnod, ajánlanék egy refaktorálást a projektnek, mert az ilyen "passzolgatások" jóhoz nem vezetnek.
"D-nek el kéne juttatni A-hoz az ő E-jének pointerét."
Miért?
Egy game engine-t próbálok összerakni. Itt van az architectúra vázlatosan:
Azt akartam, hogy az a SubSystemeket (pl. GraphicsEngine) izoláltak legyenek, de ez ne mmindenhol sikerült.
A GraphicsEngine még viszonylag jó, mert Ott van minden OpenGL művelet, és ő csak annyit csinál, hogy a nála lévő RenderDaták alapján rajzol (ezek csak primitív értékek struktúrája)
De pl a játék logikáját nem sikerült szeparálnom, mert a Scene-nek rá kell látnia az EngineCore-ra, hogy eljuthattassa pl. a RenderDatákat hozzá, hogy az továbbadhassa a GraphicsEngine-nek.
Windownál pedig az input eventeket átadja a Scene-nek, aki pedig meghívogatja a feliratkozott függvényeket az input információval. Itt is rálát a Window a játék logikáját tartalmazó Scene-re.
Szóval a legfőbb probléma a normális kommunikáció megvalósítása a SubSystemek és a Komponensek között.
Példák:
- Renderer hogyan regisztrálja a RenderData-ját a GraphicsEngine-n.
- Camera (komponens) hogyan regisztrálja a CameraData-ját a GraphicsEngine-n.
- Rigidbody hogyan regisztrálja a RigidbodyData-ját a PhysicsEngine-n
- Hogyan jelezze a PhysicsEngine, hogy Collosion történt, hogy az esetleges játéklogika (pl lövedékkel való találkozás) reagáljon rá? Jelnleg csak arra tudok gondolni, hogy beállítja a két RigidbodyData-n a másik azonosítóját (ezzel ütközött), majd ezt észleli a Data tulajdonos Rigidbody komponens, aki ezt "szétkürtöli" a GameObjecten belül. (Meghívja a feliratkozott függvényeket? Vagy szórja szét az üzenetet minden komponensre és akit érdekel az feldolgozza, akit nem az nem csinál semmit?)
Nagyon reszletesen nem megyek bele az elemzesebe, de itt valoban valami a tervezes resznel csuszott lehet el picit.
Sok ilyen esetben van valami "main" (esetedben talan a Scene), ami tudja kezelni a kommunikaciot akar a komponensek kozott.
Plusz sok esetben, ilyen rendszereknek hasznos az observer pattern. (Amit amugy hasznalsz is mar helyenkent. De azt lehetne meg boviteni.)
Pontosan jóra gondolsz, eseményekkel kéne ezeket megoldani. Nem akarod azt, az erőforrások allokációja miatt, hogy minden frame-ben ellenőrizd az összes objektumot, hogy volt-e collision. Majd az objektum szól, ha volt collision egy másik collidable elementtel.
Javaslom, hogy a tervet vizsgáld felül, és ahogy említettem, refaktoráld, mert a komplexitásod csak nőni fog, és most jobb, ha megfogod az ilyen tervezési hibákat, valamint kicsit olvasd át a tervezési módszertanokat innen:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!