gpt4 book ai didi

delphi - 如何在Delphi中强制分层源代码结构

转载 作者:行者123 更新时间:2023-12-03 15:03:25 26 4
gpt4 key购买 nike

在我们的组织中,我们希望强制源代码采用分层结构。每个单位都处于特定的“级别”,并且单位只能使用相同或更低级别的单位。

示例:

假设我们有这些单位:L1_A.pas , L1_B.pas , L2_C.pas , L2_D.pas , L3_E.pas ( LX_ 表示“X 级”)。

L1_AL1_B可以互相利用。 L2_CL2_D可以全部使用L1_*单位和彼此。 L3_E可以使用所有其他单位。

如果L1_*单位尝试使用 L2_*单位或L3_*单元,我们需要中止编译并产生一些错误(“较低级别的单元尝试使用较高级别的单元”)。

我们是否用 C(或其他带有预处理器的语言)进行编码,例如我们会定义 LEVEL_1 , LEVEL_2 , LEVEL_3常量和所有第一(或第二)级单元中检查是否 LEVEL_2LEVEL_3 (分别为 LEVEL_3 )定​​义了常量,在这种情况下我们会发出相关错误。

Delphi 定义(由 {$DEFINE} 定义)在定义它们的单元之外没有效果。命名常量和常量表达式可以在外部使用,但我们看到哪一个取决于 uses 中的单元顺序(即,如果 L1_A 定义 const Level=1L2_C const Level=2L1_B 包含 using L2_C, L1_ALevel 中的 L1_B 将是 2 )。

我只提出了命名约定[ LX_Unit.pas (或 LX.Unit.pas),其中 X是水平的并且 Unit是“真实的”单位名称],并使用 svn 中的脚本进行检查提交钩子(Hook)。

我们只想使用基本的 Delphi(无外部工具)。

最佳答案

但是您可以检查常量。多个单元是否定义相同的单元以及它们的类型或值是什么并不重要,只要其名称与特定模式匹配即可。在某种程度上,这样的常量就像“导出的”$define:

const
Level3 = 3;
  • 单元 X 具有常数 Level1
  • 单位 Y 具有常数 Level3
  • 单元 Z 具有常数 Level3
 uses
X, Y, Z; // Z.Level3 hides Y.Level3, but that doesn't matter.

{$IF declared(Level3)}
<小时/>

作为documentation状态:

Declared returns True if the argument passed to it is a valid declared Delphi identifier visible within the current scope.

关于delphi - 如何在Delphi中强制分层源代码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55218409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com