如何在根类中很好地组织代码
How to organize code well in root class?
所以,我已经用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 而言,大师班能够完成它在程序中需要的任何东西。
然而,代码在大师类中有点笨拙,因为它包含所有这些包装器方法,它有很多方法。
由于它使用所有这些其他类,因此每当我更改类主类使用的任何标头时,.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(..);
那么,你会建议我在这里做什么?我可以把大师班建立到无限,但我相信有更好的方法。如何在真正大小合适的代码库中处理这些事情?我可以在所有项目中快速重构代码以毫不费力地完成这些剧烈的更改吗?
@Mat在评论中善意地提到的那样,您发现自己伴随着所谓的"上帝对象" - 它管理项目中的每一件事,任何代码更改都会影响这个"上帝"。
只要您有一些开发经验,就值得阅读一些最佳实践:
- "四人帮(GoF)"http://www.uml.org.cn/c++/pdf/DesignPatterns.pdf
- 依赖注入 http://en.wikipedia.org/wiki/Dependency_injection
- 模型-视图-控制器 http://en.wikipedia.org/wiki/Model-View-Controller
- 模型-视图-视图模型 http://en.wikipedia.org/wiki/MVVM
在这种情况下,修复看起来相当简单。只需放弃整个大师班。它没有增加任何价值,所以保留它没有任何好处。
您的FILE CHANNEL
或namespace file
已经存在,称为 class FileWriter
。
我对filename
论点有点怀疑。这可能不应该存在于 write
方法中,应该传递给 FileWriter
构造函数。每个文件都应该有自己的编写器。
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 很好的语法来获取对向量/数组数据的大小引用?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 尽管一切看起来都很好,但值不会交换
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 为什么指标有时效果很好,有时效果不佳?写下霍夫曼代码
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 唯一的字符代码在 Linux 中运行时不起作用,但在 Windows (C++) 中很好
- 为什么这个代码在ubuntu上运行得很好,而在Windows8上运行得不好
- C++:这个代码有什么问题吗?它编译得很好,但人们告诉我会有内存泄漏
- 这个荒谬的代码在 Clang 和 GCC 中编译得很好吗?
- 如何在根类中很好地组织代码
- g++可以很好地链接带有旧代码的旧对象文件
- 为什么我在Codechef的褪色回文中得到一个WA,即使我在我的代码中没有发现任何错误,它对我来说工作得很好
- 代码在Visual Studio中可以很好地编译,但在使用g++的Unix终端中就不行了.我在多维向量处得到一个错误.为
- c++在Eclipse CDT中编译我的代码工作得很好,但是从命令行执行会导致大量错误
- 很好的代码注释技巧