Vbscript 在函数开头为函数赋值是否是一种良好的编码实践?

Vbscript 在函数开头为函数赋值是否是一种良好的编码实践?,vbscript,standards,Vbscript,Standards,我被问及我的编码风格,我不同意我的评论者 我这样写我的函数 Function Func_DoSomething(argVariable1, argVariable2) strStringSame = "" Func_DoSomething = Array(False,strStringSame) If argVariable1 = "" Then Exit Function End If If argVariable2 = "" The

我被问及我的编码风格,我不同意我的评论者

我这样写我的函数

Function Func_DoSomething(argVariable1, argVariable2)
    strStringSame = ""
    Func_DoSomething = Array(False,strStringSame)

    If argVariable1 = "" Then
        Exit Function
    End If

    If argVariable2 = "" Then
        Exit Function
    End If

    If StrComp(argVariable1,argVariable2,vbBinaryCompare) = 0 Then
        print "Yes!"
        strStringSame = "Same"
    End If

    Func_DoSomething = Array(False,strStringSame)
End Function
我的审阅者建议我不应该在函数开始时为函数分配数组甚至变量,而应该这样做

Function Func_DoSomething(argVariable1, argVariable2)
    strStringSame = ""

    If argVariable1 = "" Then
        Func_DoSomething = Array(False,strStringSame)
        Exit Function
    End If

    If argVariable2 = "" Then
        Func_DoSomething = Array(False,strStringSame)
        Exit Function
    End If

    If StrComp(argVariable1,argVariable2,vbBinaryCompare) = 0 Then
        print "Yes!"
        strStringSame = "Same"
    End If

    Func_DoSomething = Array(False,strStringSame)
End Function
我知道这两种方法在功能上都是可行的,因为这两种方法都有效。然而,我被告知,我所做的是不正确的,我的代码的查看器会感到困惑

这有什么道理吗?我的编码风格不是一种好的风格吗?

可能的答案:

  • 因为你只是“像这样编写[你的]函数”,也就是说,对你的“编码风格”没有任何理由,就照你说的去做
  • 你的评论者的论点——“那是错误的”和“我弄糊涂了”——是无可辩驳的。他付给你钱/给你评分,就照他说的去做
  • 两个函数都有气味:返回数组的第一个元素无效/始终为False;第二个元素是“”(不可见)或“相同”(容易出错且效率低下),因此应该是布尔值;有多个出口点;有副作用(打印)。因为还有一种可能的气味无关紧要,所以照吩咐你的去做
  • 现实世界中的问题—当两个字符串参数都非空且区分大小写相等时返回true的函数—可以通过使用VBScript语法编写规范来解决:

    Option Explicit
    
    Function f(s, t)
      f = s <> "" And t <> "" And s = t
    End Function
    
    Dim aa : aa = Array( _
         Array("", "a") _
       , Array("a", "") _
       , Array("", "") _
       , Array("a", "b") _
       , Array("a", "a") _
       , Array("a", "A") _
    )
    Dim a
    For Each a In aa
        WScript.Echo "|" & Join(a, "|") & "|", CStr(f(a(0), a(1)))
    Next
    
    在顶部指定返回值,因为它不是由计算确定的;e、 g.必须返回
    Me
    的类的init函数:

    Class C
    Private m_x
    Function init(x, lots, of, parms)
      Set init = Me
      m_x = x
      use lots of parms
      ...
    End Function
    
    我会把我的任务放在首位,所以我不能忘记它;但我会接受“每个人都看一个函数的结尾来确定返回值”的论点,并按我说的去做

    提前设置默认返回值以提高效率:

    Function isin(a, s)
      isin = False
      For Each e In a
          If e = s Then
             isin = True
             Exit Function  <--- algorithm needs break here
          End If
      Next
    End Function
    
    函数isin(a,s)
    isin=False
    对于a中的每个e
    如果e=s,则
    isin=True
    退出功能可能的答案:

  • 因为你只是“像这样编写[你的]函数”,也就是说,对你的“编码风格”没有任何理由,就照你说的去做
  • 你的评论者的论点——“那是错误的”和“我弄糊涂了”——是无可辩驳的。他付给你钱/给你评分,就照他说的去做
  • 两个函数都有气味:返回数组的第一个元素无效/始终为False;第二个元素是“”(不可见)或“相同”(容易出错且效率低下),因此应该是布尔值;有多个出口点;有副作用(打印)。因为还有一种可能的气味无关紧要,所以照吩咐你的去做
  • 现实世界中的问题—当两个字符串参数都非空且区分大小写相等时返回true的函数—可以通过使用VBScript语法编写规范来解决:

    Option Explicit
    
    Function f(s, t)
      f = s <> "" And t <> "" And s = t
    End Function
    
    Dim aa : aa = Array( _
         Array("", "a") _
       , Array("a", "") _
       , Array("", "") _
       , Array("a", "b") _
       , Array("a", "a") _
       , Array("a", "A") _
    )
    Dim a
    For Each a In aa
        WScript.Echo "|" & Join(a, "|") & "|", CStr(f(a(0), a(1)))
    Next
    
    在顶部指定返回值,因为它不是由计算确定的;e、 g.必须返回
    Me
    的类的init函数:

    Class C
    Private m_x
    Function init(x, lots, of, parms)
      Set init = Me
      m_x = x
      use lots of parms
      ...
    End Function
    
    我会把我的任务放在首位,所以我不能忘记它;但我会接受“每个人都看一个函数的结尾来确定返回值”的论点,并按我说的去做

    提前设置默认返回值以提高效率:

    Function isin(a, s)
      isin = False
      For Each e In a
          If e = s Then
             isin = True
             Exit Function  <--- algorithm needs break here
          End If
      Next
    End Function
    
    函数isin(a,s)
    isin=False
    对于a中的每个e
    如果e=s,则
    isin=True
    
    直接从MSDN退出函数:
    “若要从函数返回值,请将值分配给函数名。任何数量的此类分配都可以出现在过程中的任何位置。”
    我认为第一行与其他任何位置一样合理。也许更是如此。毕竟,VBScript返回自己的“默认”值(空字符串、False等)。我认为覆盖这个默认值的地方应该是函数的第一行,而且我倾向于给函数变量赋值false,最后赋值true。动机是,如果函数中有一个,我将退出,它将以False退出。如果没有错误,则存在true,true也有效。我被告知变量在初始化时没有被赋值为False,这是一种错误的编码实践……我不同意这一点,但我如何说服他人。我也这么做,只是一开始我甚至懒得将其初始化为
    False
    。默认情况下,它是
    False
    。从技术上讲,默认情况下它是一个未初始化的变体。但是,未初始化的变量可以被视为空字符串(
    ),数值
    0
    ,或布尔值
    False
    。在VB/VBA中的工作原理相同。甚至键入的变量在VB/VBA中也有默认值(
    表示
    字符串
    0
    表示
    Integer/Long
    False
    表示
    布尔值
    ,等等)。不利用这一点似乎很遗憾。直接从MSDN开始:
    “若要从函数返回值,请将值分配给函数名。任何数量的此类分配都可以出现在过程中的任何位置。”
    我认为第一行与其他行一样合理。也许更是如此。毕竟,VBScript返回自己的“默认”值(空字符串、False等)。我认为覆盖这个默认值的地方应该是函数的第一行,而且我倾向于给函数变量赋值false,最后赋值true。动机是,如果函数中有一个,我将退出,它将以False退出。如果没有错误,则存在true,true也有效。我被告知变量在初始化时没有被赋值为False,这是一种错误的编码实践……我不同意这一点,但我如何说服他人。我也这么做,只是一开始我甚至懒得将其初始化为
    False
    。默认情况下,它是
    False
    。从技术上讲,默认情况下它是一个未初始化的变体。但是,未初始化的变量可以被视为空字符串(
    ),数值
    0
    ,或布尔值
    False
    。同样的道理