在我们的组织中,我们希望强制使用源代码的分层结构。每个单元将处于特定的“级别”,并且单元将只能使用相同或更低级别的单元。
例子:
假设我们有以下单位:L1_A.pas
,L1_B.pas
,L2_C.pas
,L2_D.pas
,L3_E.pas
(LX_
表示“级别X”)。L1_A
和L1_B
可以互相使用。 L2_C
和L2_D
可以同时使用所有L1_*
单位。 L3_E
可以使用所有其他单位。
如果L1_*
单元尝试使用L2_*
单元或L3_*
单元,则我们需要中止编译并产生一些错误(“较低级别的单元尝试使用较高级别的单元”)。
我们是否使用C(或其他带有预处理器的语言)进行编码,例如将定义LEVEL_1
,LEVEL_2
,LEVEL_3
常数,并在所有第1级(第2级)的单位中检查是否在其中定义了eihter LEVEL_2
或LEVEL_3
(即LEVEL_3
)常量在这种情况下,我们将发出相关的错误。
Delphi定义(由{$DEFINE}
定义)在定义它们的单元之外无效。可以在外部使用命名的常量和常量表达式,但是我们看到的取决于uses
中的单位顺序(即,如果L1_A
定义了const Level=1
和L2_C
const Level=2
,并且L1_B
包含using L2_C, L1_A
,而不是Level
中的L1_B
将是2
)。
我只提出了命名约定[LX_Unit.pas
(或LX.Unit.pas),其中X
是级别的,而Unit
是“真实的”单位名称],并使用svn
commit钩子(Hook)中的脚本进行检查。
我们只想使用基本的Delphi(不使用外部工具)。
最佳答案
但是您可以检查常量。只要几个单元定义相同的单元,以及它们的类型或值是什么,只要其名称与某个模式匹配就没有关系。从某种意义上说,这样的常量就像一个“导出的” $define
:
const
Level3 = 3;
uses
X, Y, Z; // Z.Level3 hides Y.Level3, but that doesn't matter.
{$IF declared(Level3)}
如documentation所述:
关于delphi - 如何在Delphi中强制分层源代码结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55218409/