《VB2008从入门到精通(PDF格式英文版)》第114章


maxValue = value 
End If 
Next 
Console。WriteLine(〃Maximum value is (〃 & maxValue & 〃)〃) 
Another variation is as follows: 
Dim elements As IList(Of Integer) = New List(Of Integer)() 
elements。Add(1) 
elements。Add(2) 
elements。Add(3) 
Dim runningTotal As Integer = 0 
Dim maxValue As Integer = Integer。MinValue 
For Each value As Integer In elements 
If value 》 maxValue Then 
maxValue = value 
End If 
runningTotal = runningTotal + value 
Next 
…………………………………………………………Page 259……………………………………………………………
C HA P TE R 9 ■ L E AR N I N G A B O U T L I ST S; DE L E G AT E S ; AN D L A M B D A E X PR E SSI O N S 237 
For one or two instances; writing the For Each loop is not that problematic; but it would be
if you needed to use the iterator code in a dozen places。 This type of code is harder to maintain
and extend。 One way of being more efficient is to delegate the code to an abstract base class
that is implemented to calculate the running total or maximum value。 The following is the
plete code (you can place the three classes in separate files called IteratorBaseClass。vb;
RunningTotal。vb; and MaximumValue。vb if you want to test this)。 
MustInherit Class IteratorBaseClass
Protected Sub New(ByVal collection As IList(Of Integer)) 
_collection = collection 
End Sub 
Public Function Iterate() As IteratorBaseClass 
Dim element As Integer 
For Each element In Me。_collection 
ProcessElement(element) 
Next 
Return Me 
End Function 
Protected MustOverride Sub ProcessElement(ByVal value As Integer) 
Private _collection As IList(Of Integer) 
End Class 
Class RunningTotal 
Inherits IteratorBaseClass 
Public Sub New(ByVal collection As IList(Of Integer)) 
MyBase。New(collection) 
Total = 0 
End Sub 
Protected Overrides Sub ProcessElement(ByVal value As Integer) 
Total = Total + value 
End Sub 
Public Total As Integer 
End Class 
Class MaximumValue 
Inherits IteratorBaseClass 
Public Sub New(ByVal collection As IList(Of Integer)) 
MyBase。New(collection) 
MaxValue = Integer。MinValue 
End Sub 
…………………………………………………………Page 260……………………………………………………………
238 CH AP T E R 9 ■ L E A R N IN G AB OU T L I ST S; D E L E G A T E S; A N D L A M B DA E X P R E S SI ON S
Protected Overrides Sub ProcessElement(ByVal value As Integer) 
If (value 》 MaxValue) Then 
MaxValue = value 
End If 
End Sub 
Public MaxValue As Integer 
End Class 
Module Module1 
Sub Main() 
Dim elements As IList(Of Integer) = New List(Of Integer)() 
elements。Add(1) 
elements。Add(2) 
elements。Add(3) 
Dim runningTotal As Integer = _ 
TryCast(New RunningTotal(elements)。Iterate(); RunningTotal)。Total 
Dim maximumValue As Integer = _ 
TryCast(New MaximumValue(elements)。Iterate(); MaximumValue)。MaxValue 
Console。WriteLine(〃RunningTotal (〃 & runningTotal & 〃)〃) 
Console。WriteLine(〃Maximum Value (〃 & maximumValue & 〃)〃) 
End Sub 
End Module 
The rewritten code is much longer; even though the bolded code; which represents the
user code; is much shorter。 However; this code still isn’t right。 The code is ill fitting because the
problem that it addresses can be solved using another; simpler technique。 So; in a nutshell; you
can say the problem is that you want to solve a single particular technical problem using an
elegant piece of code that does not include repeated sections that have been copied and pasted。
A better solution is consider the code as two code blocks; and in the following section; you’ll
see how delegates can solve the problem of adding and keeping a running total。 
WEIGHING THE ADVANTAGES OF REUSING CODE 
Very often; when you write code; the code that performs the task directly is shorter and to the point。 When you
abstract the code and develop general classes; the code will begin to bloat and expand; but the advantage is
that the code can be reused。 So; when is abstracting code worth the effort? 
Consider the analogy of building a house。 You are constructing the trusses for the house。 You have a
blueprint that indicates that you need to build 50 trusses。 You could build each of the 50 trusses individually;
or you could build a jig to speed up building the trusses。 And herein lies the problem。 If the trusses can be built
without a jig in 10 hours; and with the jig in 2 hours; you would think building the jig was a good idea。 But not
so fast。 What if building the jig takes 20 hours? Then the time that you saved by using the jig you lost by
building the jig。
…………………………………………………………Page 261……………………………………………………………
C HA P TE R 9 ■ L E AR N I N G A B O U T L I ST S; DE L E G AT E S ; AN D L A M B D A E X PR E SSI O N S 239 
Software is no different。 Sometimes; even though the code
小说推荐
返回首页返回目录