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?
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
Ha ilyet kell csinálnod, ajánlanék egy refaktorálást a projektnek, mert az ilyen "passzolgatások" jóhoz nem vezetnek.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
"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?)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
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.)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz1.png)
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 © 2025, 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!