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

How to organize code well in root class?

本文关键字:代码 很好      更新时间:2023-10-16

所以,我已经用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 CHANNELnamespace file已经存在,称为 class FileWriter

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

相关文章: