VBA中的模块与面向对象编程
我学的第一门“正式”的编程语言是Java,所以我明白面向对象编程的意思,就是程序的基本构件是类。现在我在写VBA和Python。这些语言有模块的概念,我一直感到不舒服,因为我不知道该如何把程序拆分成模块或类。
我明白一个模块对应一个知识领域,一个模块应该能够单独测试……我是不是应该把模块理解成像C++中的命名空间那样呢?
4 个回答
不同编程语言有各自的特点,这就是为什么用不同语言解决同一个问题时,方法会有所不同。
- "C"语言主要是通过过程分解来解决问题,也就是把大问题拆分成一个个小步骤。
- 在Java中,主要的思路是通过“类或对象”来分解问题。虽然函数也存在,但它们更多是作为这些类的行为的一部分。
- "Python"则支持两种方式:既可以通过类来分解问题,也可以通过过程来分解。
这些语言都使用文件、包或模块的概念来组织大量的代码。没有什么限制你只能为一个知识领域创建一个模块。 这些都是分解和组织代码的技巧,可以根据具体问题来选择使用。
如果你对面向对象编程(OO)比较熟悉,那么在Python中也能很好的运用它。
这完全是个人喜好。如果你使用模块,你的“程序”会更偏向过程式编程。如果你选择类,那它就会更偏向面向对象编程。我最近几个月一直在使用Excel,个人来说,我尽量选择类,因为这样对我来说更舒服。如果你不把对象
当作复杂的东西,而是把它们看作组件
,你就能更优雅地使用它们。我喜欢类的主要原因是你可以有多个实例,而模块只能有一个实例。这让我可以更好地封装代码,也能更好地重复使用代码。
举个例子,假设你想要一个日志记录器,用来记录程序执行过程中发生的操作。你可以为此写一个模块。这个模块可以有一个全局变量,指示在哪个特定的工作表上进行日志记录。但想象一下这样的情况:你的客户希望你在程序中加入一些炫酷的报告生成功能。你很聪明,想到了可以用你的日志记录代码来准备这些报告。但你不能用一个模块同时进行日志记录和报告生成。而如果你有两个日志记录的组件
,就可以在不修改它们代码的情况下同时进行这两项工作。
我不太懂VBA,但在Python中,模块是非常重要的。就像你说的,模块可以看作是命名空间,但它们本身也是对象。不过,它们不是类,所以你不能直接从模块继承。
我觉得一个好的规则是让每个模块只关注一个领域。判断一个函数是模块级别的还是类方法的标准是问自己:这个函数是否可以在任何满足它参数要求的对象上有意义地使用?如果可以,那我就把它放在模块里,而不是放在类里。如果这个函数的用处确实只限于某个特定的类层次,那我就把它做成一个方法。
如果你希望这个函数能在类层次的所有实例上工作,但又把它做成了模块级别的函数,那你要记得所有的子类仍然需要按照给定的接口和语义来实现。这就是不使用方法的一个权衡:你不能再轻松地修改一下然后调用super
。另一方面,如果子类很可能会重新定义接口及其语义,那可能这个类层次就不是一个很好的抽象,值得重新考虑一下。