Molte variabili di istanza all'interno della mia classe suggeriscono Design imperfetto?

1

Ok, quindi sto cercando di consolidare un po 'di apprendimento che sto facendo. Quello che sto per fare è creare un piccolo gioco relativo a un gioco che mi piace chiamato Persona.

Per riferimento a un personaggio che puoi pensare come un Pokemon.

Fondamentalmente voglio che il flusso sia l'utente sceglie un personaggio, un'arma e una persona (da una lista di personaggi e persone predefiniti, cioè statistiche e incantesimi predefiniti per la persona e armi, statistiche e personaggi predefiniti per i personaggi). Sceglieranno e userò matematica / if / whiles per calcolare i vincitori.

Al momento ho una classe Characters (con variabili di istanza Persona, Stats e Weapon), una classe Character Stats (health, mana etc IVs), una classe Persona (con statistiche personali e nome iv), una classe di statistiche Persona (agility forza ecc. IV) (più avanti classificherò la classe PersonaSpells) e una classe Armi (attacco, colpo, ecc. IV), così come una classe Duel (dove verranno eseguiti tutti i calcoli e metodi per la selezione del giocatore, la selezione nemica ecc. con la mia attuale implementazione tutti gli oggetti personaggio, gli oggetti personali e gli oggetti arma ecc saranno definiti in questa classe e assegnati usando, ad esempio, caratteri Carattere = nuovo Carattere (Nome, Salute, Persona, Arma, ...), con costruttori per persona e Un'arma definita prima di questo, infine una classe principale in cui userò efficacemente un oggetto della classe duel per eseguire il gioco, e manterrò la classe principale e il metodo più chiaro.

La mia domanda è, questo disegno è difettoso in questo, finisco per dover dichiarare un sacco di oggetti (come IV) dai costruttori delle mie classi. (Quindi ho un oggetto di tutte e 20 le armi, tutti i 10 personaggi, tutti i 20 Personas, tutte le 10 statistiche di personaggi, tutte le 20 statistiche personali) Tutto nella mia classe Duel. Esempio di codice di seguito:

private Weapon deusXiphos = new Weapon();
(x 20 more like this)

private PersonaStats artemisiaStats = new PersonaStats();
(x 20 more like this)

private Persona artemisia = new Persona();
(* 20 more like this)

private CharacterStats mitsuruStats = new CharacterStats(400, 250);
(* 10 more like this)

private Character mitsuru = new Character("Mitsuru", artemisia, deusXiphos, mitsuruStats);
(* 10 more like this)
    
posta FinalFind 31.07.2014 - 14:56
fonte

1 risposta

3

Sì, avere molte variabili di istanza indica che hai un design imperfetto.

Personalmente, metto la linea attorno a 3 variabili se sono mutabili e 5 se non lo sono (se la classe è qualcosa di più di semplici vecchi dati ). Questo è insolitamente basso. Ma non importa dove sia la linea, là è una linea e avere 80 variabili di istanza in una classe sta andando oltre la linea di tutti.

Perché?

  • Probabilmente significa che hai violato il principio di responsabilità singola . Quando la tua classe ha molte variabili di istanza, è improbabile che forniscano una singola responsabilità coerente per quella classe. Quando fallisce, diventa difficile cambiare classe per un motivo senza rompere gli altri. Rende difficile testare la funzionalità della classe in isolamento poiché è necessario che tutti della sua roba siano presenti.
  • Probabilmente significa che hai violato la Non ripetere te stesso delle linee guida. Cosa succede quando vuoi cambiare un campo in quelle statistiche? Ora devi andare alle 30 copie e cambiarle tutte. Questo aumenta le possibilità che tu commetta un errore e manchi uno.
  • Rende difficile usare il principio di inversione delle dipendenze , perché sarà super annoying per passare in 80 oggetti nel vostro costruttore.

Raggruppare le variabili in classi sembra l'approccio migliore. Perché il Duel ha bisogno delle statistiche di Mitsuru e di Mitsuru? Mitsuru non dovrebbe avere le sue statistiche?

(sebbene con la lettera della legge, ciò porterebbe a una violazione della Legge di Demetra quando Duel chiama mitsuru.Stats.Strength . Non penso che sia un errore particolarmente eclatante, dal momento che è improbabile che questo accoppiamento possa causare errori futuri, ed è molto meglio dell'alternativa)

    
risposta data 31.07.2014 - 16:01
fonte

Leggi altre domande sui tag