Kezdőoldal » Számítástechnika » Programozás » Alacsony elem a hiearchiában...

Alacsony elem a hiearchiában üzenjen egy magas szintű elemnek?

Figyelt kérdés

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?


2017. jan. 9. 00:26
 1/9 anonim ***** válasza:
100%
Szerintem itt valami nagyon félrecsúszott, amikor a szoftvered felépítését tervezted. Csak mivel nem értem, hogy ez mi akar lenni - nem tudok elképzelni olyan életszerű esetet, amikor ilyenre lenne szükség - nem nagyon tudok tippeket adni.
2017. jan. 9. 00:31
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:

Ha ilyet kell csinálnod, ajánlanék egy refaktorálást a projektnek, mert az ilyen "passzolgatások" jóhoz nem vezetnek.


[link]

2017. jan. 9. 00:31
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:
Mindenesetre nekem ez úgy tűnik, mintha egy fa szerkezet akarna lenni, aminek a gyökere A-ból indul.
2017. jan. 9. 00:32
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
Ha fa szerkezet, ahogy írja a kolléga, akkor a fában egy kereséssel D elküldheti az ő E pointerét A-nak. Írsz egy metódust, ami keres a fában, és E pointert fogad paraméternek, megadod neki célnak A-t, és A-nak át is adhatod E-t, amit a kereső metódusod paraméterben kapott meg.
2017. jan. 9. 00:34
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:

"D-nek el kéne juttatni A-hoz az ő E-jének pointerét."


Miért?

2017. jan. 9. 00:47
Hasznos számodra ez a válasz?
 6/9 A kérdező kommentje:

Egy game engine-t próbálok összerakni. Itt van az architectúra vázlatosan:

[link]


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.

2017. jan. 9. 07:45
 7/9 A kérdező kommentje:

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?)

2017. jan. 9. 08:26
 8/9 anonim ***** válasza:

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.)

2017. jan. 9. 09:42
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:

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.


[link]


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:


[link]

2017. jan. 9. 14:41
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!