模块与vba中的面向对象编程

时间:2010-08-31 07:46:54

标签: python vba

我的第一个“严肃”语言是Java,所以我理解了面向对象编程,因为程序的元素块是一个类。 现在我写VBA和Python。有模块语言,我感到持续的不适:我不知道如何在模块/类中分解程序。

据我所知,一个模块对应一个知识域,一个模块应该能够单独测试... 我应该只将模块理解为命名空间(c ++)吗?

4 个答案:

答案 0 :(得分:3)

我不做VBA但是在python中,模块是基础。正如您所说,可以将其视为命名空间,但它们本身也是对象。但它们不是类,所以你不能从它们继承(至少不是直接)。

我发现保留一个涉及一个域区域的模块是一个很好的规则。我用来判断某些东西是模块级函数还是类方法的规则是问自己是否可以在任何满足它所参数的“接口”的对象上有意义地使用它。如果是这样,那么我将它从类层次结构中释放出来并使其成为模块级函数。如果真正的用途仅限于特定的类层次结构,那么我将它作为一种方法。

如果需要它可以在类层次结构的所有实例上工作并且使它成为模块级函数,请记住所有子类仍然需要使用给定的语义实现给定的接口。这是退出方法的权衡之一:您不能再进行轻微修改并致电super。另一方面,如果子类可能重新定义接口及其语义,那么也许特定的类层次结构不是一个非常好的抽象,应该重新考虑。

答案 1 :(得分:3)

这是味道的问题。如果你使用模块,你的'程序'将更加面向程序。如果选择类,它将或多或少是面向对象的。我正在使用Excel几个月,我个人会尽可能选择课程,因为它对我来说更舒服。如果您不再考虑objects并将其视为Components,您可以优雅地使用它们。我更喜欢课程的主要原因是你可以拥有更多的课程。您不能拥有两个模块实例。它允许我使用封装和更好的代码重用。

例如,假设您希望拥有某种记录器,以记录程序在执行期间执行的操作。你可以为此编写一个模块。它可以具有例如全局变量,该变量指示将在哪个特定纸张记录上完成。但请考虑以下假设情况:您的客户希望您在程序中包含一些奇特的报告生成功能。你很聪明,所以你发现你可以使用你的日志代码来准备它们。但是你不能通过一个模块同时进行日志和报告。您可以使用两个记录Component的实例,而无需对其代码进行任何更改。

答案 2 :(得分:1)

语言的习语是不同的,这就是在不同语言中解决问题的原因采用不同的方法。

  1. “C”是关于程序分解的。
  2. Java中的主要习语是“类或对象”分解。功能不存在,但它们成为这些类的展示行为的一部分。
  3. “Python”支持基于类的问题分解以及基于程序的问题。
  4. 所有这些都使用文件,包或模块作为组合大型代码片段的概念。没有什么可以限制您为一个知识域创建一个模块。 这些是分解和组织技术,可以根据手头的问题进行应用。

    如果你对OO感到满意,你应该能够在Python中很好地使用它。

答案 3 :(得分:1)

VBA还允许使用类。不幸的是,这些类不支持全面的面向对象语言的所有功能。特别是不支持继承。

但是你可以使用界面,至少在某种程度上。

我只使用了“one module = one singleton”这样的模块。我的模块包含“静态”甚至无状态方法。所以我认为VBa模块不是命名空间。更常见的是,一堆类和模块将形成“命名空间”。我经常为这样的“命名空间”创建一个新项目(DLL,DVB或类似的东西)。