C++ 重构大型c++;班
我正在编写一个nes模拟器,并编写了一个代表6502 cpu的类:C++ 重构大型c++;班,c++,C++,我正在编写一个nes模拟器,并编写了一个代表6502 cpu的类: class CCpu6502 { public: /*....*/ void fetch8(); void fetch16(); void ADC(); void AND(); /* Around 50+ cpu instruction types */ private: /*register state, jump
class CCpu6502 {
public:
/*....*/
void fetch8();
void fetch16();
void ADC();
void AND();
/* Around 50+ cpu instruction types */
private:
/*register state, jump table definition*/
};
基本上,我有一个跳转表,它接收操作码并执行适当的成员函数——更改cpu的内部状态。还有一些其他任务可以确定正确的寻址类型
我意识到类定义太大,很难解析和测试。但是,将类拆分为单独的类似乎有问题,因为几乎每个函数都会改变cpu的内部状态
我考虑将教学类型分类如下:
class AInstructionHandler {/*...*/};
class CArithmeticInstHandler : public AInstructionHandler{/*...*/};
class CBranchInstHandler : public AInstructionHandler{/*...*/};
/*memory accessors, logical, etc. */
然而,我必须让每个指令处理程序类成为朋友,从而让每个指令处理程序类访问cpu的内部状态,这似乎是个坏主意
我想知道是否有一种更好的方法来重构一个几乎所有方法都会影响对象状态的大型类,或者我的设计从一开始就是有缺陷的
谢谢好吧,如果没有大的逻辑块要断开,那么也许您可以找到更小的位来放入它们自己的类中。您提到了JumpTable,它是它自己的类的候选。它可能需要一个操作码并返回一个地址,也许 然后,还有操作码本身,它们可能成为对6502状态进行一些改变的对象。所以,要做到这一点,您可能需要打包CPU内部状态的相关位 一旦您开始删除较小的部分,其他重构可能会发生的事情就变得很明显了
还有一些关于StackOverflow的方法可能会有所帮助。这里是Dobb博士的。我将通过适当的getter/setter公开CPU状态,并将指令作为使用CPU公共接口的非成员、非友元函数。可能在这里有用。每个操作代码都可以是一个策略。