为什么这些等效函数产生不同的结果?

时间:2015-01-13 18:14:45

标签: function loops groovy while-loop equivalent

这是原始方法,我的目的是抽象掉代码的许多细节,通过将特定内容放在执行相同操作但具有更易读名称的函数中来提高可读性。

使用第一种方法,我实现了所需的行为,并将行[x]正确添加到lineRows。

def getAllRowsForLine( rows, index ) {
    def lineRows = [rows[index]]
    def newOperatorNotFound
    def x = index + 1
    if ( x <= rows.size() - 1 ) {
        newOperatorNotFound = true
        while ( x <= ( rows.size() - 1 ) && newOperatorNotFound ) {
            if ( rows[x].PGM_PROC_OPE.trim() == "" ) {
                lineRows << rows[x]
            } else if ( rows[x].PGM_PROC_TY == "AN" || rows[x].PGM_PROC_TY == "OR" ) {
                lineRows << rows[x]
            }
            else {
                newOperatorNotFound = false
            }
        x++
        }

    }
    return lineRows
}    

以下是重构代码以及上下文的相关方法。

此方法不会产生所需的行为,在第一行[x]添加到lineRows后会中断循环。

def getAllRowsForLine2( rows, index ) {
    def lineRows = [rows[index]]
    def newOperatorNotFound
    def i = index + 1
    if ( moreRows( rows, i ) ) {
        newOperatorNotFound = true
        while ( moreRows( rows, i ) && newOperatorNotFound ) {
            if ( operatorEmpty( rows, index ) ) {
                lineRows << rows[i]
            } 
            else if ( procTypeAnd( rows, i ) || procTypeOr( rows, i ) ) {
                lineRows << rows[i]
            } else {
                newOperatorNotFound = false
            }
        i++
        }
    }
    return lineRows
}

def operatorEmpty( rows, index ) {
    return rows[index].PGM_PROC_OPE.trim() == ""
}

def procTypeAnd( rows, index ) {
    return rows[index].PGM_PROC_TY == "AN"
}

def procTypeOr( rows, index ) {
    return rows[index].PGM_PROC_TY == "OR"
}

def moreRows( rows, index ) {
    return index <= ( rows.size() - 1 )
}

据我所知,这些事情是等价的。我运行下面的代码来尝试测试函数的等价性,它返回true。

println lineProcessor.getAllRowsForLine( rows, 0 ) == lineProcessor.getAllRowsForLine2( rows, 0 )
=> true

1 个答案:

答案 0 :(得分:0)

糟糕,我意识到我在operatorEmpty函数中使用了index而不是i。如果我将索引更改为i,则函数将按预期执行。