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

例子:

假设我们有以下单位:L1_A.pasL1_B.pasL2_C.pasL2_D.pasL3_E.pas(LX_表示“级别X”)。
L1_AL1_B可以互相使用。 L2_CL2_D可以同时使用所有L1_*单位。 L3_E可以使用所有其他单位。

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

我们是否使用C(或其他带有预处理器的语言)进行编码,例如将定义LEVEL_1LEVEL_2LEVEL_3常数,并在所有第1级(第2级)的单位中检查是否在其中定义了eihter LEVEL_2LEVEL_3(即LEVEL_3)常量在这种情况下,我们将发出相关的错误。

Delphi定义(由{$DEFINE}定义)在定义它们的单元之外无效。可以在外部使用命名的常量和常量表达式,但是我们看到的取决于uses中的单位顺序(即,如果L1_A定义了const Level=1L2_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;
  • 单元X具有恒定的Level1
  • 单元Y具有恒定的Level3
  • 单元Z具有恒定的Level3

  •  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/

    10-10 05:24