重构大型C++类

6
我正在编写一款NES模拟器,并编写了一个代表6502 CPU的单个类:
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的内部状态,使每个类成为友元,这似乎是一个不好的想法。

我在思考,是否有一种首选的方法来重构一个几乎所有方法都会影响对象状态的大类,或者我的设计本来就有缺陷。

谢谢


2
我会通过适当的getter/setter公开CPU状态,并将指令作为非成员、非友元函数,使用CPU的公共接口。 - Nim
2
也许策略模式在这里很有用。每个操作码可以是一个策略。 - Steve
1个回答

3
如果没有大的逻辑块可以分离,那么或许你可以找到更小的部分放到它们自己的类中。你提到了 JumpTable,它可以作为一个自己的类。它可以接受一个操作码并返回一个地址,对吧?
然后,还有那些 OpCodes 本身,它们可以成为一些对象,可以改变 6502 的状态。所以,你可能想要打包 CPU 内部状态的相关部分。
一旦你开始移除较小的部分,其他的重构就会显而易见。
在 StackOverflow 上也有一些相关的回答relatedanswers,这里还有 Dr. Dobb's 的some additional thoughts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接