1

项目应该在多大程度上相互独立?

我有一个非常大的 Visual Studio 解决方案,其中所有项目都相互依赖。我无法从解决方案中获取单个项目并将其添加到另一台计算机上的另一个解决方案中,因为它们都相互关联。

我做的事情正确吗?


例如;

考虑一下我的这三个项目(磁盘文件、数据转换器和数学 - .h 和 .cpp 文件对是 C++ 类;我将通过它们各自的名称提及它们):

The Solution
|
|---- Disk File
|     |
|     |---- BinaryFile.h, BinaryFile.cpp
|     |---- TextFile.h, TextFile.cpp
|
|---- Data Converter
|     |
|     |---- Utf8.h, Utf8.cpp
|     |---- XmlParser.h, XmlParser.cpp
|     |---- StringFormatter.h, StringFormatter.cpp
|
|---- Math
      |
      |---- Plotter2D.h, Plotter2D.cpp
      |---- Matrix.h, Matrix.cpp
  • TextFile用于Utf8字符编码。这使得Disk File依赖于Data Converter.
  • XmlParser使用TextFile. 这使得Data Converter依赖于Disk File.
  • Plotter2D用于TextFile转储一些数据以与外部软件一起使用,并在其方法Matrix中使用一些字符串格式化工具。::ToString()这使得Math依赖于Disk FileData Converter

这只是几个类之间的依赖关系的一个例子。事实上,我的解决方案中有更多文件。这是一团乱麻的代码依赖。

我将和我的一个朋友开始一个项目。他在他的解决方案中需要我的Math项目。但是要让他适应他自己的解决方案并不容易,因为它会给这些依赖项带来很多编译器错误。

这种依赖量正常吗?我做得对吗?我在每个需要它们的项目中保留所有公共文件的副本怎么样(这可能很愚蠢,我只是在问它)?

我需要你的建议。

4

3 回答 3

0

总会有这样的依赖关系,但你可以使用一些方法来避免它们:

  1. 通过不包括跨模块头文件来保持 .h 文件的独立性,而是在此处使用前向声明并使用 .cpp 文件中的实际头文件。

  2. 对于要在函数中传递的其他头文件中定义的枚举,可以使用 void 指针来传递和验证 .cpp 文件中的值。

  3. 您也可以使用“extern C”函数。

于 2012-09-25T15:38:36.967 回答
0

管理依赖项通常是一个复杂的问题。您似乎已经关注的要点是依赖项应该创建一个无环图。

除此之外,您应该尽可能地打破依赖关系。例如,XmlParser真的需要TextFile吗?或者想要解析文本文件的应用程序是否可以实例化后者,将内容读入字符串并将其传递给XmlParser?如果您设法到第二个,那么XmlParser不再依赖TextFile.

要考虑的另一件事是您正在创建的依赖项的类型。使用相同的示例,TextFile在公共接口中使用XmlParser? 需要在那里使用吗?如果XmlParser取决于TextFile你需要链接库,如果它是接口的一部分,那么用户XmlParser将必须包含TextFile创建更高耦合的标题。在这种情况下,您可以例如将文件名传递给XmlParser而不是 aTextFile以从接口中删除依赖项。

归根结底,这有点艺术。专注于尽可能少的依赖关系,对于那些需要的依赖关系,尽量使耦合最小化。

另一件事是数学库。我会打破对TextFile. 额外的功能可以在处理数学组件序列化的单独库中提供。这将允许Math不需要文件备份的用户不依赖该TextFile组件。

于 2012-09-25T15:40:13.683 回答
0

更好的方法是避免项目之间的依赖循环,在您的情况下,“磁盘文件”和“数据转换器”等实用程序类可能存在于同一个项目中,并且您可以使用命名空间来强制模块化。

为了更好地了解您的依赖关系,建议使用doxygenCppDepend等工具来检测项目之间的所有依赖关系,并在搜索您想要提供给朋友的特定功能所需的所有依赖关系时可能会节省时间。

于 2012-09-25T15:40:45.953 回答