【发布时间】:2009-05-24 14:31:11
【问题描述】:
我们的团队已经使用 Delphi 6 多年,然后在 2006 年前切换到 Delphi。对于这两个版本,我们都有以下问题:编译器经常抱怨一个应该递归使用的单元。该单元是一个 40k LOC 单元,是一个拥有近 100 万 LOC(包括第三方)的项目的核心。
错误消息不正确:项目的完整构建始终有效。不幸的是,错误消息没有告诉我们假定的循环引用在哪里,只是该单元的名称。有时甚至会出现有效的错误消息被列出 2-4 次,直到“找到”循环引用问题。很明显,编译器在这里循环运行。由于该项目的规模,很难手动找到问题。因此,我制作了一个证明确实没有循环引用的工具(该工具创建了单元的有向依赖图并确定该图中的连贯性组件 - 除非我故意放一些中)。
这不仅会影响 F9 编译,还会影响大部分时间不起作用的代码完成/洞察力。有时当我第二次按 ctrl-space 时它会起作用...
有什么想法可以隔离甚至解决问题吗?请注意,将 40k LOC 单元拆分为较小的单元非常困难,因为它包含大约 15 个在接口部分相互依赖的大类(我知道这很糟糕,但无论如何应该可以工作)。
更新
我们一直在重构,但这是一个难以重构的单元,因为几乎一切都取决于一切。一直试图通过接口来解决它,但我们正在谈论一些具有 100 多个方法和属性的类。而且会慢一些。
升级到 D2009 可能是一个选择,但现在我们被 D2006 困住了(Unicode 的东西和价格标签是这里的两个障碍)。无论如何,问题是它是否会有所帮助,因为至少从 D6 开始就存在问题。
关于修剪使用条款,我们一直在使用 Icarus 进行此操作。但到目前为止,这并没有帮助。我们现在在界面部分减少了 90 个自定义单元。但是,对于真正的循环引用,问题可能出现在任何单元中。还尝试将所有单位添加到 dpr。
该项目与其他项目共享大量代码,并且有一些 IFDEF。但是,定义不是在项目选项中设置的,而是通过一个通用的包含文件设置的。因此所有模块都应该看到相同的定义。此外,在没有切换到另一个项目的情况下完全重建后不久,该问题再次出现。
【问题讨论】:
标签: delphi