所以,我用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(..);
那么,你建议我在这做什么?我可以把那个大师班建成无限,但我相信有更好的方法。如何在真正体面的代码库中处理这些事情?我可以在所有项目中快速重构代码,以便毫不费力地做出这些重大改变吗?
答案 0 :(得分:2)
正如@Mat在评论中提到的那样,你发现自己伴随着所谓的“上帝对象” - 它管理你项目中的每一件事,任何代码改变都会影响这个“上帝”。
只要您有一些开发经验,就可以阅读一些最佳实践:
答案 1 :(得分:0)
在这种情况下,修复看起来相当简单。只需放弃整个大师班。它没有增加任何价值,因此保留它没有任何好处。
您的FILE CHANNEL
或namespace file
已存在,并被称为class FileWriter
。
我对filename
论点略显怀疑。这可能不应该出现在write
方法中,应该传递给FileWriter
构造函数。每个文件都应该有自己的编写器。