应该如何依赖项目?

时间:2012-09-25 15:23:59

标签: c++ visual-studio dependencies project-management projects-and-solutions

项目应该相互独立多少?

我有一个非常大的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项目。但是要让它适应自己的解决方案并不容易,因为它会给这些依赖关系带来很多编译器错误。

这种依赖性是否正常?我做得对吗?如何在每个需要的项目中保留所有常见文件的副本(这可能很愚蠢,我只是问它)?

我需要你的建议。

3 个答案:

答案 0 :(得分:0)

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

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

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

  3. 您也可以使用“extern C”功能。

答案 1 :(得分:0)

管理依赖项通常是一个复杂的问题。您似乎遵循的要点是依赖关系应该创建一个非循环图。

除此之外,你应该尝试尽可能地打破依赖关系。例如,XmlParser确实需要TextFile吗?或者,想要解析文本文件的应用程序是否可以将后者读入,将内容读入字符串并将其传递给XmlParser?如果您设置为秒,那么XmlParser不再取决于TextFile

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

在一天结束时,这是一种艺术。专注于尽可能少的依赖项和那些所需的依赖项,尝试使耦合最小化。

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

答案 2 :(得分:0)

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

为了更好地了解您的依赖关系,建议使用doxygenCppDepend之类的工具来检测项目之间的所有依赖项,并在搜索特定功能所需的所有依赖项时获得时间我想给你的朋友。