In a number of cases, the order of nesting of loops (and conditional tests) is not important: All must be done, but the order of nesting does not change the result.
Example: Sum the cells in a three-dimensional array.
Dim dblTotal As Double
dblTotal = 0#
For k = 1 To MaxK
For j = 1 To MaxJ
For i = 1 To MaxI
dblTotal = dblTotal + arrValues(i, j, k)
Next i
Next j
Next k
' Use "dblTotal" here...
...can safely be changed to...
Dim dblTotal As Double
dblTotal = 0#
For i = 1 To MaxI
For j = 1 To MaxJ
For k = 1 To MaxK
dblTotal = dblTotal + arrValues(i, j, k)
Next k
Next j
Next i
' Use "dblTotal" here...
Q: Why do this?
A1: We might want to print subtotals as our next move.
Dim dblTotal As Double
Dim dblTotalI As Double
Dim dblTotalJ As Double
Dim dblValueK As Double
dblTotal = 0#
For i = 1 To MaxI
dblTotalI = 0#
For j = 1 To MaxJ
dblTotalJ = 0#
For k = 1 To MaxK
dblValueK = arrValues(i, j, k)
dblTotalJ = dblTotalJ + dblValueK
Next k
Print "Total for i=" & i & ", j=" & j & " is " & dblTotalJ
dblTotalI = dblTotalI + dblTotalJ
Next j
Print "Total for i=" & i & " is " & dblTotalI
dblTotal = dblTotal + dblTotalI
Next i
' Use "dblTotal" here...
Print "Final total is " & dblTotal
A1b: To support other refactoring moves...
From...
If x Then
If y Then
Do A.
Else
Do B.
End If
Else
If y Then
Do A.
Else
Do C.
End If
End If
To...
If y Then
If x Then
Do A.
Else
Do A.
End If
Else
If x Then
Do B.
Else
Do C.
End If
End If
then...
If y Then
Do A.
Else
If x Then
Do B.
Else
Do C.
End If
End If
Q: Why do this?
A2: It may be necessary to make the code more efficient or intuitive.
Here 's a real example, taken from production code:
For i = 1 To MaxI
For j = 1 To MaxJ
If Data(i) = 0 Then
' Do important processing.
End If
Next j
Next i
changed to...
For i = 1 To MaxI
If Data(i) = 0 Then
For j = 1 To MaxJ
' Do important processing.
Next j
End If
Next i
Because we don't need to determine if "Data(i)" is processable MaxJ TIMES (for each and every i)!!!
This example was the inspiration for creating this page -- and the first few generic examples. -- JeffGrigg
Q: Why do this?
A3: It can be used to increase locality of reference so as to not hammer your system cache as much. -- AlastairBridgewater
Q: Why do this?
A4: Because my brain likes things to be in order. Therefore:
for i...
for j...
for k...
reads easier than
for j...
for i...
for k...
Or you might choose the J (JayLanguage) statement:
theTotal =: +/,theArray
which works for any rank array, not just the rank 3 array being discussed. --JimRussell
[CategoryRefactoring/RefactoringLanguage]