在函数开头为函数赋值是不是很好的编码实践?

时间:2014-08-22 18:53:55

标签: vbscript standards

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

我写这样的函数..

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

我知道两种方法在功能上都是可行的,因为这两种方法都有效。但是我被告知我正在做的事情是不正确的,我的代码的查看者会感到困惑。

有没有真相,我的编码风格不是一个好的风格吗?

1 个答案:

答案 0 :(得分:3)

可能的答案:

  1. 正如您所说的那样["写下[你的]这样的功能",即对你的编码风格没有任何理由,就像你被告知一样。
  2. 你的评论员的论点 - "那是错的"和#34;我感到很困惑" - 无可辩驳。作为(s)他支付/评分你,按照你的要求去做。
  3. 两个函数都有异味:返回数组的第一个元素是无用的/总是为假;第二个元素是"" (隐形)或"相同" (容易出错且效率低下),所以应该是布尔值;有多个出口点;有副作用(打印)。另外一种可能的气味并不重要,按照你的要求去做。
  4. 真实世界的问题 - 如果两个字符串args都是非空且区分大小写的,则返回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
    

    输出:

    cscript 25453765.vbs
    ||a| False
    |a|| False
    ||| False
    |a|b| False
    |a|a| True   <-- non-empty and case-sensitive equal
    |a|A| False
    

    看看ma:根本没有编码风格问题。

    所以基本规则是:在计算之后,即最后一个function-name = return-value语句。

    可能的偏差:

    利用VBScript的功能来组合&#34;指定返回值&#34;和&#34;退出功能&#34;在一个陈述(如return(whatever))中进行深度清理:

    从使用.NET System.Text.StringBuilder的类进行奇特的格式化:

    Public Function formatOne(sFmt, vElm)
        m_oSB.AppendFormat sFmt, vElm  <--- much more computings could be here
        formatOne = m_oSB.ToString()   <--- specify return value *before* the end
        m_oSB.Length = 0               <--- late clean-up
    End Function ' formatOne
    

    在顶部指定返回值,因为计算确定;例如必须返回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
    

    会把我的作业放在首位,所以我不能忘记它;但我会接受这个论点&#34;每个人都会看一个函数的结尾来确定返回值&#34; - 并告诉我。

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

    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
    

    我不想在这里使用临时变量。

    总结:尝试编写像f()这样的函数;有理由想要偏离默认规则;不要与喂你的手争论。