0

所以,我用 C++ 编写这个软件已经有一段时间了。它有 gui 并且 gui 可以访问主类对象,该对象负责 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);
}

所以,大师班自己不做写作,它只是把任务交给应该做的作家班。

大师班有很多像作家班这样的对象,所以,就 gui 而言,大师班能够满足它在程序中需要的任何东西。

然而,代码 get 在主类中有点笨拙,因为它包含所有这些包装器方法,它有很多方法。

由于它使用所有这些其他类,因此每当我更改使用的类主类的任何标头时,也必须重新编译 .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(..);

那么,你会建议我在这里做什么?我可以将那个大师班建立到无限,但我相信有更好的方法。在真正大小合适的代码库中如何处理这些事情?我可以在所有项目中快速重构代码以不费吹灰之力地进行这些重大更改吗?

4

2 回答 2

2

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

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

于 2013-09-15T21:35:47.893 回答
0

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

你的FILE CHANNELornamespace file已经存在,并且被称为class FileWriter.

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

于 2013-09-16T07:13:50.877 回答