应该如何依赖项目?

问题描述 投票:1回答:3

项目应该相互独立多少?

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

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

我需要你的建议。

c++ visual-studio dependencies project-management projects-and-solutions
3个回答
0
投票

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

  1. 通过不包括交叉模块头来保持.h文件独立,而是在那里使用前向声明并使用.cpp文件中的实际头文件。
  2. 对于要在函数中传递的其他头文件中定义的枚举,可以使用void指针来传递和验证.cpp文件中的值。
  3. 您也可以使用“extern C”功能。

0
投票

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

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

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.