Ereditarietà vs composizione


16

Guadagno i miei soldi in C # Generalmente in quella lingua mi piace disaccoppiare tutto con il cielo usando le interfacce. Questo mi è servito bene nel codice aziendale, ma nella scrittura di giochi in C # mi ritrovo a tendere all'eredità a causa della capacità di definire alcuni comportamenti predefiniti per le classi di base. Mi sento sporco mentre faccio questo, come se disobbedissi a un dio dell'architettura che una volta disse "favorisci la composizione sull'eredità". So che non è in bianco e nero, ma sento anche che potrei usare le interfacce con un po 'più di lavoro e ottenere all'incirca la stessa cosa.

Cosa fanno le altre persone? L'ereditarietà è l'approccio giusto per i giochi o devo refactoring in alcune interfacce?


1
Neanche le interfacce sono composizione, quindi non è chiaro cosa stai chiedendo.

Voglio solo menzionare che dal momento che stai lavorando con C #, avresti difficoltà a scegliere l'ereditarietà poiché C # non supporta l'ereditarietà multipla reale. L'uso del metodo dell'interfaccia multipla va bene fino a quando non si arriva all'intervallo di interfaccia 4-5 e si deve tagliare / incollare oltre 25 righe di codice tra ogni classe che condivide la stessa implementazione. Ci sono alcuni round di lavoro, ma sono ugualmente brutti dal momento che la lingua non fornisce supporto diretto.
NtscCobalt,

Risposte:


23

L'ereditarietà nei giochi è in realtà una delle peggiori cose che puoi fare, in particolare per quanto riguarda le entità. Leggi questo per il perché. La composizione rispetto all'eredità ti porta molto lontano con i giochi. Per quanto riguarda le altre aree del tuo motore, non importa. Supponiamo ad esempio che tu stia effettuando una chiamata a una sorta di servizio di rete esterno, quindi puoi ereditare un servizio di tipo generico per es. HTTPService e SocketService - proprio come nelle app aziendali a cui sei abituato.

A meno che il gioco è molto semplice, si verrà desidera utilizzare un'entità un'architettura basata su componenti (CBE). L'idea generale è che con le entità, il motivo per cui sono così comunemente composte piuttosto che ereditate è perché non si può sapere fino al runtime quali capacità avrà una data entità. Ad esempio, prendi la nave del giocatore in uno sparatutto spaziale. Non sai fino a un certo punto durante il gioco, quali armi, armature, sistemi (cioè componenti) quel giocatore sta per raccogliere, acquistare, vendere, perdere, aver distrutto, ecc. Quindi l'unico modo realistico per modellarlo è attraverso la composizione dell'oggetto. Il lato positivo in questo scenario è che puoi anche avere nemici completamente personalizzabili, costruiti nello stesso modo, piuttosto che nemici che sono sempre esattamente gli stessi ogni volta che vedi quel tipo di nemico. Quindi, con i CBE, potresti vedere un Martian Freighter e pensare "Ah ha solo minuscoli laser, lo prenderò giù", e di solito questo sarebbe vero, ma quando arrivi nel raggio d'azione improvvisamente ti rendi conto che ha un grosso culo pistola wormhole. Sorpresa sorpresa!

La componentizzazione sta rimuovendo l'accoppiamento implicito della logica, e questo è BUONO.


Grazie per il consiglio amico :) Bello sapere che non stavo ascoltando le voci!
Peter Short,

1
+1 Grazie per l'articolo, ho intenzione di farlo nel mio gioco da un po 'di tempo
John McDonald

3
Va notato che, a causa dell'elevata dipendenza delle entità di gioco, l'eredità spesso complica le cose e rende la manutenzione e l'estensione un compito complicato. I sistemi componenti affrontano bene questo problema e l'altro vantaggio aggiuntivo è ciò che è elencato nella risposta sopra;)
James

Va anche notato che "ma quando ti trovi nel raggio d'azione all'improvviso ti rendi conto che ha una pistola wormhole di grande culo. Sorpresa sorpresa!" è un cattivo design del gioco: D
Jonathan Connell,

1
Le sorprese sono divertenti, ma sorprese che significano che muori senza preavviso, come una nave di basso livello che può OHKO, sono solo frustranti;) Naturalmente questo potrebbe non essere ciò che intendevi nella tua risposta. Inoltre, c'è molto di più in un gioco oltre al semplice design del gioco.
Jonathan Connell,

3

Per coloro che parlano tedesco un libro interessante: http://www.amazon.com/Architektur-Kerns-einer-Game-Engine-Implementierung/dp/3639324471/ref=sr_1_1?ie=UTF8&qid=1314875533&sr=8-1

Uno sguardo più da vicino su quando e perché usare quale architettura può essere trovata qui: /programming/1901251/component-based-game-engine-design

Per quanto mi riguarda, decido la mia architettura in base alle dimensioni del progetto e alla possibilità di estendere o riutilizzare il codice. Perché investire ore e ore nell'architettura di un microprogetto in cui non è possibile utilizzare nuovamente il codice? Allo stesso tempo è possibile terminare il progetto.

Composizione contro componenti I componenti sono fantastici oggetti ma nella maggior parte dei progetti / architetture anche la composizione farà lo stesso (senza sovraccarico basato sui componenti). Dipende da cosa può fornire il tuo sistema di componenti che la composizione non può.


Ad esempio, prendi la nave del giocatore in uno sparatutto spaziale. Non sai fino a un certo punto durante il gioco, quali armi, armature, sistemi (cioè componenti) quel giocatore sta per raccogliere, acquistare, vendere, perdere, aver distrutto, ecc. Quindi l'unico modo realistico per modellarlo è attraverso la composizione dell'oggetto.

tutto ciò era possibile anche senza componenti molto tempo fa


-1, i componenti sono una forma di composizione.

bene, una forma ma non la stessa poiché forniscono funzionalità diverse. (Quindi non capisco il tuo commento e -1)
idefix

1
Quando dici "composizione vs componenti" non è chiaro cosa stai confrontando poiché i componenti sono composizione. Intendi componenti dinamici rispetto a componenti statici? O uno di quelli contro la composizione di tipi correlati né familiari né strutturalmente? Che cos'è il "sovraccarico basato sui componenti"? Nei sistemi con componenti statici (e molti dinamici) il sovraccarico è quasi zero.

Hm, punti interessanti. Ti dispiace una discussione un po 'più dettagliata? Altrimenti vorrei inviarti il ​​mio indirizzo di posta su un'altra piattaforma.
idefix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.