抱歉,这是一个非常新手的问题。
我正在对这个庞大的应用程序进行维护。它有5种不同的形式。我们将全局变量放在一个单元(uGlobal)中。但我似乎无法从数据单元(uData)访问它。
我有这个:
Unit uGlobal
type
TmyType: (alpha, beta);
...
Unit uGlobal
Stuff: TmyType <- error, undeclared indentifier
当我尝试将 uGlobal 放入 uData 的使用部分时,它抱怨循环引用。所以,这里有点无知。他们都在同一个项目中。这是使用 BDS 2006。
你有一个循环引用,因为你有东西uGlobal
想要利用其中的东西uData
反之亦然。循环引用是大型项目中的一个大问题,因为它们大大增加了复杂性 - 如果您有循环依赖项,它就会变得更像一个更大的单元。我怀疑在你的项目被认为是大型的之前还有很长的路要走,更不用说“大规模”了。 ;)
您有 2 种可能的解决方案:
- 使用循环依赖,建立一个依赖weak, 和另一个strong.
- 进行一些重新设计以完全消除问题。 (把事情分成更小的块。)
保持循环依赖
David 已经给出了答案:至少其中一个单元必须使用实施部分中的另一个单元。
- A 使用 B 使用 A 是绝对不允许的,但是您可以将接口和实现部分视为几乎就像单独的单位本身(带有一堆特殊的引用规则)。
- 所以问问你自己,每个sub-unit need?
- If for example:
- 你声明了一个类型
uData interface
并在其中引用了uGlobal interface
,则界面为uGlobal
needs uData
并且需要相应的uses子句。
- 如果有一个类型
uData implementation
在任何地方都被引用uGlobal
,然后该声明在uData implementation
必须移至界面部分。
- 如果有一个类型
uGlobal interface
它必须仅从实现部分引用uData
那么 use 子句在实现部分就可以了。
- 如果您遇到不幸的情况,即在两个接口部分中都键入了另一个接口部分中的引用类型,那么您have to通过应用该技术来进一步模块化删除循环依赖.
删除循环依赖
消除循环依赖需要将您的单元分解为更易于管理的更小的单元。为此,您must了解依赖关系每个之间的things在您的应用程序中。
例如:
- Suppose
uGlobal
声明 A 和 C
- A依赖于C,但C不需要A
- 还假设
uData
声明 B 需要 C
- 但事实证明A也需要B
- 这就是为什么你有循环依赖
在这种情况下,你所要做的就是在移动 C 处声明一个新单位。
- 然后两个
uGlobal
and uData
将使用uNewUnit
- 但双方都不需要对方
- 并且您的循环依赖将被完全删除。
免责声明
我并不以任何方式提倡你对 uGlobal 的做法。事实上,这是一个非常糟糕的主意,当您的项目开始变大时,它会在两个方面给您带来很大的麻烦。不幸的是,这个解释本身就是一个巨大的答案。
- 使用全局变量是危险的,应该避免。
- 使用像 uGlobal 和 uData 这样的“大倾销单位”也是危险的,而且你才刚刚经历过他们的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)