如何在根类中很好地组织代码?

时间:2013-09-15 21:22:34

标签: c++ code-organization

所以,我用C ++编写这个软件已有一段时间了。它有gui和gui可以访问master类对象,该对象负责gui做的任何任务(当用户点击某些东西时,gui只调用该对象的方法)。

现在,我不知道这是不是最好的方法。我一生中从未在任何编码公司工作,但我遇到了一些问题。

实际上,大师班没有做任何事情。它主要是位于该类内的其他对象的包装器。所以,例如:

class Master {
public:
    void writeSomethingToFile(const char *filename,std::string& text);
...
}

引擎盖下:

class Master {
...
private:
    FileWriter *_writer;
}

void Master::writeSomethingToFile(const char *filename,std::string& text) {
    _writer->write(filename,text);
}

因此,大师班不会自己写作,它只会抛出应该完成工作的作家类的任务。

master类有很多像writer类这样的对象,因此,就gui而言,master类能够满足它在程序中所需要的任何东西。

然而,代码在master类中变得笨重,因为它包含所有这些包装器方法,它有很多方法。

由于它使用了所有这些其他类,每当我更改类主类的任何头时,使用.cpp文件也必须重新编译(对于i7处理器来说不是太糟糕,但我宁愿避免使用它)。

现在我一直在使用的是非常原始的,我绝不会这样做:

class Master {
public:
    // FILE CHANNEL
    void writeToFile(...);
    void deleteFile(...);
    // FILE CHANNEL

    // ARITHMETIC CHANNEL
    void addNumbers(...);
    void multiplyNumbers(...);
    // ARITHMETIC CHANNEL

    ...
}

我确实会将我称之为“频道”的内容与评论分开,这样我就能理解属于什么的东西。现在,对于gui来说,这可能不是那么糟糕,因为一切都是分组的。然而,当我进一步开发这个类时,为它添加新的内部类并包含更多的方法,东西变得笨重,最困扰我的是,它不是坚如磐石的。我的意思是,如果我从评论的“频道”中采用一种方法并将其放在另一种方法中,我真的会看到差异吗?

我想到了几个解决方案。我从未尝试过,但我可以创建成员空间:

class Master {
public:
    namespace file {
        void writeToFile(...);
        void deleteFile(...);
    }

    namespace arithmetic {
        void addNumbers(...);
        void multiplyNumbers(...);
    }

    ...
}

这解决了我作为班级开发人员的问题,但是,对于gui,他们现在必须调用像

这样的方法
master->arithmetic.addNumbers(...); // My syntax could be wrong here
// never used memberspace, corrections are appreciated

现在,由于我的项目现在正在“有点”摆动,这意味着要修改很多代码。

我想到的另一个解决方案是从类到类的不断继承,其中文件中的主类关注于一个通道:

class Master_fileChannel {
     FileHandler *_fileHandler;
     void writeToFile(...);
     void deleteFile(...);
}

...

class Master_arithmeticChannel : public Master_fileChannel {
     ArithmeticUnit *_arithmeticUnit;
     void addNumbers(...);
     void multiplyNumbers(...);
}

依此类推,直到我继承了每个“频道”。这将比原始状态更加稳固,并使文件比此类的当前.cpp文件短很多。但是,我仍然会遇到问题,我可能会使用重复的方法名称,并且必须为我的方法组成越来越多的笨重名称(即addNumbers(..); addThreadNumbers(..); addThreadNumbersSeparately(..);

那么,你建议我在这做什么?我可以把那个大师班建成无限,但我相信有更好的方法。如何在真正体面的代码库中处理这些事情?我可以在所有项目中快速重构代码,以便毫不费力地做出这些重大改变吗?

2 个答案:

答案 0 :(得分:2)

正如@Mat在评论中提到的那样,你发现自己伴随着所谓的“上帝对象” - 它管理你项目中的每一件事,任何代码改变都会影响这个“上帝”。

只要您有一些开发经验,就可以阅读一些最佳实践:

答案 1 :(得分:0)

在这种情况下,修复看起来相当简单。只需放弃整个大师班。它没有增加任何价值,因此保留它没有任何好处。

您的FILE CHANNELnamespace file已存在,并被称为class FileWriter

我对filename论点略显怀疑。这可能不应该出现在write方法中,应该传递给FileWriter构造函数。每个文件都应该有自己的编写器。