Condividi alcuni campi ma altri unici per il proprietario dell'istanza

3

Ho programmato per molti anni e questa è una specie di strana esigenza e non ho mai visto nulla di simile ma ho un gioco in cui ci sono abilità che puoi fare. Esiste una classe di abilità che memorizza dati come Name, DamageType, DamageValue, Cooldown, CurrentCooldown. È una classe molto generica in cui le istanze che faccio definiscono davvero l'abilità.

La cosa è roba come Name, DamageType, DamageValue, & I cooldown sono valori che possono essere definiti una sola volta per l'abilità stessa e non cambiano mai dopo che l'istanza è stata creata. Tuttavia, CurrentCooldown sarebbe proprietario specifico. Se 2 attori usano questa abilità, ognuno di essi avrebbe bisogno della propria istanza di CurrentCooldown ma non della propria istanza degli altri campi. Sì, potrei fare solo 2 istanze di questa Abilità, ma non c'è un reale bisogno di ciò poiché quegli altri campi non cambieranno.

Idealmente vorrei fare una lista di abilità e solo rendere ogni abilità 1 volta, e quindi dire a ciascun attore quale abilità hanno. Tutti i dettagli per quell'abilità sono lì e saranno uguali e condivisi, ma il CurrentCooldown deve essere istanziato per attore.

Sarebbe bello poter rendere alcuni campi "proprietari" specifici. Credo che una soluzione sarebbe quella di creare un dizionario in cui il nome dell'abilità che l'attore ha è la chiave e il valore è il tempo di recupero per quello. Mi chiedo se ci siano altre idee intorno a questo che le persone hanno e io non sono in grado di pensare?

    
posta user441521 14.05.2015 - 21:22
fonte

2 risposte

4

Sembra molto simile a un schema dei pesi volanti .

Quello che fai è creare oggetti abilità che contengono i dati che definiscono l'abilità e conservarli in un pool di oggetti per un facile riutilizzo.

Il proprietario non contiene direttamente un'abilità, crea un oggetto che incapsula l'abilità ma con uno stato specifico del proprietario come il cooldown corrente o qualsiasi altra sovrascrittura (forse il proprietario ha un aumento di danno?).

I vantaggi:

  • È possibile definire un'abilità una volta per esecuzione dell'applicazione, non una volta per oggetto proprietario. Meno complessità nella logica di inizializzazione.

  • Lo stato di abilità è garantito come coerente tra i proprietari perché utilizzano gli stessi oggetti Abilità.

  • Leggero risparmio di memoria perché i dati non sono duplicati. Probabilmente nulla di cui scrivere a casa, rispetto a 20 anni fa, quando il modello del peso mosca era documentato e la memoria era limitata e costosa.

risposta data 14.05.2015 - 21:36
fonte
0

Non rimanere intrappolato dall'ottimizzazione prematura. Devi pesare qualsiasi guadagno contro l'aumento dei costi di sviluppo e manutenzione. Il più tardi dei due è il killer.

I computer moderni hanno un'incredibile quantità di memoria. Quanto è grande l'oggetto istanziato che stai cercando di deduplicare. 1KB? Di meno? Sovrastimolare un sistema per risparmiare byte di memoria significa spesso sistemi eccessivamente complessi e difficili da mantenere. Di solito non è un compromesso lineare. Anche se tu sei il dono di Dio per l'ottimizzazione mentre il progetto cresce e il team di sviluppo con esso ci saranno sviluppatori meno esperti. Qual è il sovraccarico di tale ottimizzazione sulla loro produttività e accuratezza.

link

Il motivo per cui questo porta spesso a un anti-pattern è perché probabilmente i requisiti di progettazione cambieranno nel tempo. Gli elementi che sono statici ora potrebbero non essere così statici in futuro. La dimensione dei dati duplicati e il numero di istanze influiranno sul processo decisionale, ma diciamo che è 1KB e 1.000 istanze. Al massimo ti risparmia 1 MB. Sembra fantastico fino a quando non si considera che vale circa $ 0,02. Ok diciamo 10 volte sia per la dimensione che per il numero di istanze .. ancora solo $ 2,00 Quanto tempo sia nello sviluppo che nella manutenzione futura hai speso per tutta la durata del progetto per risparmiare $ 2,00? La mia ipotesi è > $ 2,00.

    
risposta data 15.05.2015 - 04:13
fonte

Leggi altre domande sui tag