決策外置一節的範例還有進一步改善的空間:
書中範例:
C++ Example of a Switched Loop
1: for (i = 0 ; i < count ; i++) { 2: if(sumType == SUMTYPE_NET) { 3: netSum = netSum + amount[i]; 4: } else { 5: grossSum = grossSum + amount[i]; 6: } 7: }
書中的改進範例
C++ Example of an Unswitched Loop照書中的說明:
1: if (sumType == SUMTYPE_NET) { 2: for (i = 0; i < count; i++) { 3: netSum = netSum + amount[i]; 4: } 5: } else { 6: for(i = 0; i < count; i++) { 7: grossSum = grossSum + amount[i]; 8: } 9: }
本案例的壞處是兩個迴圈必須同時維護。如果count變更為clientCount,您必須記得在兩個地方同時變更,這對您而言是一種困擾;對必須使用程式碼的其他人而言,也會造成維護上的困擾。事實上,我們可以更進一步,在不降低可讀性與維護性的情況下,將範例改善如下:
1:  if ( sumType == SUMTYPE_NET ) {  
2:    sum = netSum;  
3:  } else {  
4:    sum = grossSum;  
5:  }  
6:  for ( i = 0; i < count; i++) {  
7:    sum = sum + amount[i];  
8:  }  
9:  if ( sumType == SUMTYPE_NET ) {  
10:    netSum = sum;  
11:  } else {  
12:    grossSum = sum;  
13:  }  
如此一來,「兩個迴圈必須同時維護」的問題便不存在了。甚至更進一步,考慮到未來維護時,可能會增加SUMTYPE的問題時,還可以再將迴圈單獨抽出成為一個函式:
1:  int sumAmount(int initValue)  
2:  {  
3:    int sum = initValue;  
4:    for ( i = 0; i < count; i++) {  
5:      sum = sum + amount[i];  
6:    }  
7:    return sum;  
8:  }  
再將原來的程式改為:
1:  if ( sumType == SUMTYPE_NET) {  
2:    netSum = sumAmount(netSum);  
3:  } else {  
4:    grossSum = sumAmount(grossSum);  
5:  }  
如此,便可以兼顧可讀性,維護性與效能。
沒有留言:
張貼留言