【问题标题】:How should be dependency between projects?项目之间应该如何依赖?
【发布时间】:2012-09-17 03:46:34
【问题描述】:

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

我有一个非常大的 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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      说到底,这有点艺术。专注于尽可能少的依赖关系,对于那些需要的,尽量减少耦合。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-01
          • 1970-01-01
          • 2015-11-10
          • 1970-01-01
          • 1970-01-01
          • 2012-05-20
          • 2020-08-12
          相关资源
          最近更新 更多