因为它澄清了intent.
A Function
明确地说“我回来后会给你一些东西”。这期待那是一个Function
返回一些东西,因为这就是函数的用途.
A Sub
明确地说“我是做某事你应该期望最终会成功”。期待那是一个Sub
执行一个动作,改变一些状态,引起一些副作用。
A Function
那将被命名为DoSomething
,就像一个令人困惑的Sub
那将被命名为GetFoo
: the intent是模糊的,该程序的本质与它的广告方式相冲突。我预计DoSomething
要么成功做某事,或者抛出一些错误。同样,我期望GetFoo
到,嗯,给我一个Foo
.
因为非返回函数没有任何意义。
在多种编程语言中,Function
(或语义上相似的构造)不在所有代码路径中返回值,甚至无法编译。用一个无返回值函数VBA 中的所有内容听起来都非常像滥用语言,只是因为 VBA 不会抱怨它。正如常识告诉我们的那样,这并不是因为我们can,我们should.
为何返回void
,当你可以返回bool
到处都是,而不分配它?
public bool DoSomething()
{
// do stuff...
// ...and don't assign the return value.
// woopsie, doesn't compile.
}
A VBA Sub
程序就像C#void
方法:是explicit关于它的不回归性质,这是一件好事。
因为静态代码分析工具会抱怨。
众所周知,VBA 编译器不会关心您是否编写了无法明确不返回隐式返回值是否是有意的代码。
当你do意味着返回一个值 - 并且忘记了,因为错误一直在发生 - 如何
你能确定吗this one合法不返回,并且另一个不是吗?没有梳理代码并完全理解它所做的一切and why,你无法分辨。如果你幸运的话,你会看到一些小的、专门的函数,它们显然只做一件事,而且做得很好。否则,您需要浪费时间来了解正在发生的事情,只是为了确定一些本来应该是显而易见的事情.
静态代码分析工具,例如橡皮鸭(我维护该项目)将标记这些功能,因为它们是潜在的错误隐藏在你的代码库中,等着咬你: