DRY方式切换执行顺序

在函数波纹中(我还没有testing),我需要移动数组中的值,然后相应地调整数组的大小,问题是,这取决于如果我们在索引中移动值,或者我需要首先调整数组大小或移动值。 正如你所看到的,我有一个If语句,并且它有移动和resize的海湾,但是两种情况都是一样的(只有行的顺序被切换),是否有DRYer的方式来写?

 Private Function Update_Index(index As Interger, move As Integer) As Boolean Dim last As Integer last = UBound(Var_array, 2) If move < 0 Then ReDim Preserve Var_array(2, last + move) For i = index - 1 To last Var_array(i, 1) = Var_array(i + move, 1) Var_array(i, 2) = Var_array(i + move, 2) Next i Else For i = index - 1 To last Var_array(i, 1) = Var_array(i + move, 1) Var_array(i, 2) = Var_array(i + move, 2) Next i ReDim Preserve Var_array(2, last + move) End If End Function 

注意:在这种情况下,重复似乎是无害的,但我正在解决更大块的代码与这样的需求。

创build一个子程序来通过引用传递数组。

 Private Sub Update(ByRef array as variant, ByVal index as long, ByVal move as long) For i = index - 1 To ubound(array) Var_array(i, 1) = Var_array(i + move, 1) Var_array(i, 2) = Var_array(i + move, 2) Next i End Sub Private Sub Update_Index(index As Interger, move As Integer) As Boolean If move < 0 Then ReDim Preserve Var_array(2, last + move) Update Var_array, index, move Else Update Var_array, index, move ReDim Preserve Var_array(2, last + move) End If End Function 

您可能可能提取另一种方法,但我不确定为什么你ReDim之前和之后取决于移动大小。

 Private Function Update_Index(index As Integer, move As Integer) As Boolean Dim last As Integer last = UBound(Var_array, 2) If move < 0 Then ReDim Preserve Var_array(2, last + move) For i = index - 1 To last Var_array(i, 1) = Var_array(i + move, 1) Var_array(i, 2) = Var_array(i + move, 2) Next i If move > 0 Then ReDim Preserve Var_array(2, last + move) End Function