项目应该相互独立多少?
我有一个非常大的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 File
和Data Converter
。这只是几个类之间依赖关系的一个例子。事实上,我的解决方案中有更多文件。这完全是代码依赖的混乱。
我将和我的一个朋友开始一个项目。他在解决方案中需要我的Math
项目。但是要让它适应自己的解决方案并不容易,因为它会给这些依赖关系带来很多编译器错误。
这种依赖性是否正常?我做得对吗?如何在每个需要的项目中保留所有常见文件的副本(这可能很愚蠢,我只是问它)?
我需要你的建议。
答案 0 :(得分:0)
总会有这样的依赖,但你可以使用一些方法来避免它们:
通过不包括交叉模块头来保持.h文件独立,而是在那里使用前向声明并使用.cpp文件中的实际头文件。
对于要在函数中传递的其他头文件中定义的枚举,可以使用void指针来传递和验证.cpp文件中的值。
您也可以使用“extern C”功能。
答案 1 :(得分:0)
管理依赖项通常是一个复杂的问题。您似乎遵循的要点是依赖关系应该创建一个非循环图。
除此之外,你应该尝试尽可能地打破依赖关系。例如,XmlParser
确实需要TextFile
吗?或者,想要解析文本文件的应用程序是否可以将后者读入,将内容读入字符串并将其传递给XmlParser
?如果您设置为秒,那么XmlParser
不再取决于TextFile
。
要考虑的另一件事是您正在创建的依赖项的类型。使用相同的示例,TextFile
的公共接口中使用XmlParser
?是否需要在那里使用?如果XmlParser
取决于TextFile
,则需要链接库,如果它是界面的一部分,那么XmlParser
的用户必须包含TextFile
创建的标头更高的耦合。在这种情况下,您可以将文件名传递给XmlParser
而不是TextFile
,以从接口中删除依赖项。
在一天结束时,这是一种艺术。专注于尽可能少的依赖项和那些所需的依赖项,尝试使耦合最小化。
另一件事是数学库。我会将依赖性打破TextFile
。额外的功能可以在一个单独的库中提供,该库处理数学组件的序列化。这样,Math
不需要文件备份的用户就不会依赖TextFile
组件。
答案 2 :(得分:0)