2015-05-20 28 views
6

Sto scrivendo un emulatore NES e ho scritto una sola classe che rappresenta il 6502 CPU:refactoring grande C++ classe

class CCpu6502 { 
    public: 
     /*....*/ 
     void fetch8(); 
     void fetch16(); 

     void ADC(); 
     void AND(); 
     /* Around 50+ cpu instruction types */ 
    private: 
     /*register state, jump table definition*/ 
}; 

Fondamentalmente, ho una tabella di salto che prende in codice operativo ed esegue la funzione di membro appropriata - cambiando la stato interno della cpu. Esistono altre attività che determinano il tipo di indirizzamento corretto.

Mi sono reso conto che la definizione della classe è troppo grande e difficile da analizzare e testare. Tuttavia, suddividere la classe in classi separate sembra problematico perché quasi tutte le funzioni alterano lo stato interno della cpu.

ho pensato di classificare i tipi di istruzione in quanto tale:

class AInstructionHandler {/*...*/}; 
class CArithmeticInstHandler : public AInstructionHandler{/*...*/}; 
class CBranchInstHandler : public AInstructionHandler{/*...*/}; 
/*memory accessors, logical, etc. */ 

Tuttavia, vorrei quindi avere per dare ad ogni accesso di istruzioni classe del gestore per lo stato interno della CPU, rendendo ogni classe un amico, che sembra come una cattiva idea

Mi chiedo se c'è un modo preferito per refactoring di una classe di grandi dimensioni in cui quasi tutti i metodi influenzano lo stato dell'oggetto o se il mio design è imperfetto per cominciare.

Grazie

+2

Vorrei esporre lo stato della CPU tramite getter/setter appropriati e avere le istruzioni come non membro, funzioni non amiche che utilizzano l'interfaccia pubblica della CPU. – Nim

+2

Forse il [Pattern strategia] (http: // en.wikipedia.org/wiki/Strategy_pattern) potrebbe essere utile qui. Ogni codice operativo potrebbe essere una strategia. – Steve

risposta

3

Beh, se non ci sono grandi blocchi logici per rompere fuori, allora forse si possono trovare pezzi più piccoli per inserire nelle proprie classi. Hai citato il JumpTable , che è un candidato per la sua stessa classe. Potrebbe prendere un codice operativo e restituire un indirizzo, forse?

Poi, ci sono i OpCodes stessi, che potrebbe diventare oggetti che fanno un po 'di alterazione dello stato del 6502. Quindi, per farlo, si sarebbe probabilmente vuole impacchettare bit correlate della stato interno del PROCESSORE.

Una volta iniziata la rimozione di pezzi più piccoli, può risultare ovvio quali altri rifacimenti possono aver luogo.

Ci sono anche alcuni relatedanswers su StackOverflow che può essere d'aiuto. Qui ci sono some additional thoughts dal Dr. Dobb's.