在函数中使用变量,还是使用函数本身?

Posted

技术标签:

【中文标题】在函数中使用变量,还是使用函数本身?【英文标题】:Use variable within a function, or use the function itself? 【发布时间】:2020-12-13 05:16:56 【问题描述】:

我的代码中有这个功能:

Function get_header(ByVal rw As Range) As Scripting.Dictionary
    Dim header    As New Scripting.Dictionary
    Dim used      As Range

    Set used = Range(rw.Cells(1, 1), rw.Cells(1, rw.Cells(1, rw.Columns.Count).End(xlToLeft).Column))

    For Each cl In used.Cells
        header.Add cl.Value, cl.Column
    Next
    
    Set get_header = header
End Function

该函数的作用是获取表头并创建列名和相应索引的字典,因此列的顺序对于其余代码而言并不重要。

我的问题是:是否有必要使用单独的变量来存储整个循环中的值,或者我可以

    始终编辑返回值(“get_header”),而不是只在最后传递值或 像这样使用 With 结构:
Function get_header(ByVal rw As Range) As Scripting.Dictionary
    Dim used      As Range

    With rw
        Set used = Range(.Cells(1, 1), .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column))
    End With

    With get_header
        For Each cl In used.Cells
            .Add cl.Value, cl.Column
        Next
    End With

End Function

另外,为什么我应该使用这些结构中的任何一个而不是其他结构? 谢谢大家的建议。

【问题讨论】:

尽管这最终是基于意见的,但我投票支持选项#1。 #2 为我隐藏了返回值,而 #1 是明确的。 除了基于意见之外,您的问题在某种意义上是令人困惑的的功能,因此并不能真正说明您似乎试图做出的对比。 仅供参考,如果带有rw 的工作表未激活,则常规代码模块中的这一行Set used = Range(rw.Cells(1, 1), ... 将出错。像Set used = rw.Parent.Range(rw.Cells(1, 1), ... 这样的东西会更健壮。 【参考方案1】:

我更喜欢你的第一个示例,而不是在单个函数调用中多次编辑函数的返回值。

根据错误捕获是中断还是静默(即on error resume next),您可能会得到不同的意外结果。重要的是,您可能会得到意想不到的结果,但您并不知道。

如果几个循环运行良好,并且函数结果变量被更新了几次,那么在处理后面的循环时会发生一些错误(由于输入数组的后面部分的输入、范围、范围等问题,甚至只是内存或焦点或其他运行时问题),您将遇到问题:该函数返回一个过早的(因此不正确的)结果,但看起来好像它已经正常运行了。

我建议使用编码来避免这种情况,无论错误是否被抑制。一个简单的方法是不要在每个可能的函数执行路径中多次设置函数结果对象。

您的第一个代码块似乎已经符合这种想法。您的每个备选建议 1 和 2 都没有。

【讨论】:

“我建议使用编码来避免这种情况” ...似乎是避免使用On Error Resume Next(其中之一)的原因,而不是不使用函数名称作为变量的原因。 @JohnColeman 假设 OP 可以控制整个过程空间中的错误处理。我同意出于多种原因最好不要使用On Error Resume Next。然而,即使错误不是静默的,使用函数名作为变量也可能需要在函数内进行更深入的预期错误捕获。【参考方案2】:

想对此发表评论,但评论太长了:

当我有一个逐步“计算”返回值的函数时,我通常更喜欢使用中间变量,原因如下(请注意,在运行时使用额外的变量是免费的,这不是问题):

命名:我不喜欢为名为 getSomething 的东西赋值。 当使用右侧时,它避免了“中间”值和对函数的递归调用之间的歧义:getSomething = getSomething + getSomething(p)。编译器可以处理,但我的大脑呢?没那么多。我发现retVal = retVal + getSomething(p) 更清晰。 在执行过程中遇到错误情况时,我可以轻松地执行Exit Function,而无需考虑已经计算的内容。

但归根结底(这也适用于是否不使用With-statement 的问题),有两件事很重要:(1)哪个代码更容易阅读并理解。(2) 哪些代码不太可能出现错误。 因为人脑的工作方式不尽相同:找到你的个人风格并坚持下去。

【讨论】:

我也更喜欢这种方法。一方面,大多数编程语言都有return,所以return calculated_value 是唯一的选择。使用 function_name = calculated_value 的习惯用法可以清楚地了解函数返回的内容,而如果您有几行像 function_name = possibly_intermediate_value 一样,则可能不清楚哪一行作为返回。

以上是关于在函数中使用变量,还是使用函数本身?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将变量放在类还是构造函数中? PHP

函数内的指针变量指向堆栈还是堆?

Python学习过程中各个难点---函数篇

Go 向函数传递切片该使用值还是指针?

C++ - 在内部,当定义一个类的成员函数时,应该使用成员变量名称还是它的 getter 函数?

如何判断函数中的变量是全局变量还是局部变量