2015-05-20 13 views
6

ich nes Emulator schreibe und schrieb eine einzige Klasse, die die 6502 CPU:Refactoring große C++ Klasse

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

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

Grundsätzlich habe ich eine Sprungtabelle, die in Opcode nimmt und führt die entsprechende Elementfunktion - die sich wandelnde CPU-interner Zustand. Es gibt einige andere Aufgaben, die den richtigen Adressierungstyp bestimmen.

Ich habe festgestellt, dass die Klassendefinition viel zu groß und schwer zu parsen sowie zu testen ist. Das Aufteilen der Klasse in separate Klassen scheint jedoch problematisch zu sein, da fast jede Funktion den internen Zustand der CPU ändert.

Ich dachte über die Befehlstypen als solche Klassifizierung:

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

Allerdings würde ich dann, indem sie jede Klasse ein Freund jeden Befehl Handler-Klasse Zugriff auf den internen Zustand der CPU geben müssen, was scheint wie eine schlechte Idee.

Ich frage mich, ob es eine bevorzugte Möglichkeit gibt, eine große Klasse umzuformen, wo fast alle Methoden den Zustand des Objekts beeinflussen oder ob mein Design fehlerhaft ist.

Dank

+2

Ich würde den CPU-Status über entsprechende Getter/Setter offen legen, und habe die Anweisungen als Nichtmitglied, Nicht-Freund-Funktionen, die die öffentliche Schnittstelle der CPU verwenden .. – Nim

+2

Vielleicht das [Strategie-Muster] (http: // en.wikipedia.org/wiki/Strategy_pattern) könnte hier nützlich sein. Jeder Op-Code könnte eine Strategie sein. – Steve

Antwort

3

Nun, wenn es nicht große logische Stücke aus zu brechen, dann können Sie vielleicht kleinere Bits in ihre eigenen Klassen platzieren zu finden. Sie erwähnten die JumpTable, die ein Kandidat für seine eigene Klasse ist. Es könnte einen Opcode nehmen und vielleicht eine Adresse zurückgeben?

Dann gibt es die OpCodes selbst, die Objekte werden könnten, die eine gewisse Verfälschung von dem Zustand des 6502. So tun, das zu tun, würden Sie wahrscheinlich verwandten Bits des internen Zustand des verpacken wollen ZENTRALPROZESSOR.

Sobald Sie beginnen, kleinere Stücke zu entfernen, kann es offensichtlich werden, welche anderen Refactorings stattfinden können.

Es gibt auch einige relatedanswers auf StackOverflow, die helfen können. Hier sind some additional thoughts von Dr. Dobb's.