如何将 MS Access 函数和子程序组织到标准模块中?

How do I organize MS Access functions and subroutines into standard modules?

使用 MS Access VBE 将子例程和函数分组到标准模块中的约定是什么?我可以找到大量关于模块内子例程和函数的命名法和功能的信息,但没有关于如何将子例程和函数分组 到标准模块中的信息。

目前,我总共有两个标准模块——一个叫做 "Subs",一个叫做 "Functions",每个模块都包含数百行代码,导航起来很费劲。我可以使用哪些准则来改进它?

我尽量让 可重复使用 子程序和函数与特定应用程序分开。
我尝试按功能对它们进行分组。这样我就有了一个模块可以在处理文本文件 import/export 时导入,另一个用于 XML 东西,另一个用于浏览文件或文件夹,从完整路径中提取文件夹等等。
此外,我通常将模块导出到 .bas 文件(右键单击模块,然后导出),我可以将其重新导入到其他应用程序中。

你所追求的,叫做抽象

成员是 SubFunctionProperty 完全没有关系(请不要说你有 Properties 模块...)。您关心的是它的用途

根据用途命名事物,并根据用途 重新组合 public 成员。保持 public 成员的实现简单,处于相对较高的 抽象级别

用简单的英语来说,这意味着如果你有一个制作咖啡和拿杯子的程序,知道从哪里得到水、牛奶、奶油、糖、榛子和法国香草的香味,知道有多少倒出所有东西,搅拌并上菜(或者您在 数百行代码 中所做的任何事情),那么您的程序会做太多事情。

分开吧。将其分解为小步骤,每个步骤都比前一个更专业(即在较低的抽象级别)。

Public Sub MakeCoffee()

    Dim selectedCoffeeType As CoffeeType
    selectedCoffeeType = PickCoffeeType

    Dim selectedSize As CoffeeSize
    selectedSize = PickCoffeeSize(selectedCoffeeType)

    GrindGrains selectedCoffeeType
    Infuse selectedCoffeeType, selectedSize
    AddExtras

End Sub

注意这个MakeCoffee程序可以不关心机器里有没有水,或者牛奶是否需要起泡,是否有选择尺寸的杯子可用,是否有选择的谷物类型,要倒入多少糖 and/or 奶油,或任何其他不相关的细节:它让您选择类型和尺寸,并使用该信息来完成它的行为。

详细信息处于较低的 抽象级别 ,根据该过程在 Private FunctionPrivate Sub 过程中实现。它们在它下面,因为它们密切相关,如果你从头到尾阅读模块,它会告诉你一个从非常高层次到非常专业和详细的故事 - 永远不需要 200 -班轮程序。

现在出现了另一个模块,您需要一台出售薯片和可乐(或生物三明治和瓶装水)的自动售货机。同样的事情:抽象 决定事物如何分裂。

那么你需要咖啡机实现支付功能。您要从自动售货机复制现有代码吗?从咖啡机的代码调用自动售货机的私有程序?幸运的是你不能那样做。不,你会抽取一个class,将支付模块功能封装到自己的专用对象中,咖啡机和自动售货机都可以使用。

如果您使用 Rubberduck,那么您可以在每个模块中放置 @Folder 注释,并实际将您的模块组织到文件夹和子文件夹中,您可以使用加载项的 Code Explorer 功能 - 因此您完全没有理由害怕拥有 "too many modules".

非常感谢@Mat's_Mug 和@iDevlop 的反馈。你们各自的抽象解释和更具体的回应都让我找到了我正在寻找的答案。 似乎你们两个都在暗示,在问这个问题之前我无果而终的谷歌搜索让我怀疑,以及上面提到的@Darren_Bartrup-Cook——没有用于组织模块的正式结构,适当的结构可以非常广泛从一个数据库到另一个数据库。如果我的结论有误,请纠正我,但我从你们所说的内容中了解到,要遵循的一般原则是:

  • 在您自己的代码中找到有意义且有用的分组(分组太小总比分组太大更好,也许吧?)
  • 为了 readability/ease 调试代码
  • 将实现保持在较高的抽象级别