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


a matter of experience—the only way to learn is to write code。 
Extending the Lottery…Prediction System 
In Chapter 10; the IProcessor interface was a good first step because it solved the problem at
hand。 The problem was to convert each line of text into another line of text。 However; in this
chapter’s example; that interface is not enough。 We need to add two other methods: Initialize()
and Destroy()。 
We want to find the frequencies of an individual number in the drawn lotteries。 The orig
inal interface method IProcessor。Process() is used to process an individual line of text; and
the frequencies can be calculated only after all of the draws have been processed。 Thus; we add
Destroy(); which is called after all of the lines of text have been read。 mon coding convention
…………………………………………………………Page 419……………………………………………………………
CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 397 
says that if you have a Destroy() method; you should have an Initialize() method that is
called before the lines of text are processed。 
Having extra requirements is not a problem and is fairly mon。 But you want to add the
extra requirements without disrupting existing functionality。 After all; if some code works; you
don’t want to break it because of additional requirements。 Thus; you don’t want to add the
methods to the IProcessor interface like this: 
Public Interface IProcessor
Function Initialize() As String 
Function Destroy() As String 
Function Process(ByVal input As String) As String 
End Interface 
This code is a no…no because you are breaking existing functionality。 Any class that imple
ments IProcessor must now implement the methods Initialize() and Destroy(); even though
those classes don’t need those methods。 
Thus; when adding requirements; you should not change existing interfaces。 You create
new interfaces and subclass the existing interfaces; like this: 
Public Interface IExtendedProcessor 
Inherits IProcessor 
Function Destroy() As String 
Function Initialize() As String 
End Interface
The new interface IExtendedProcessor has the new methods Initialize() and Destroy();
but inherits the method Process()。 The old functionality still has only a single method; and the
new functionality is free to implement either interface。 
Adding new interfaces and new methods does not mean everything will work as is。 If you
go back and look at the source code from Chapter 10; you’ll see that the IProcessor interface
was used by the Bootstrap class。 So; if you want the IExtendedProcessor interface to be recog
nized; you must update Bootstrap。 Updating Bootstrap is fine; because it does not mean that
IProcessor implementations must be updated (or; at least; Bootstrap should not require
that IProcessor implementations be updated)。 
The original abbreviated implementation of Bootstrap is as follows: 
Imports System。IO 
Public Module Bootstrap 
Public Sub DisplayHelp() 
Console。WriteLine(〃You need help? Right now?〃) 
End Sub 
Public Sub Start(ByVal args As String(); _ 
ByVal processor As IProcessor) 
Dim reader As TextReader = Nothing 
Dim writer As TextWriter = Nothing 
…………………………………………………………Page 420……………………………………………………………
398 CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 
If (args。Length = 0) Then 
reader = Console。In 
writer = Console。Out 
ElseIf (args。Length = 1) Then 
If (args(0) = 〃…help〃) Then 
Bootstrap。DisplayHelp() 
Return 
End If 
reader = File。OpenText(args(0)) 
writer = Console。Out 
End If 
" Abbreviated 
writer。Write(processor。Process(reader。ReadToEnd())) 
End Sub 
End Module
In the original implementation; the method Process() is called to read an input and write
an output stream。 Since Initialize() and Destroy() should be called before and after the
string is processed; the most logical location of each method would be before and after the
processor。Process() method; like this: 
Imports System。IO 
Public Module Bootstrap 
Public Sub DisplayHelp() 
Console。WriteLine(〃You need help? Right now?〃) 
End Sub 
Public Sub Start(ByVal args As String(); _ 
ByVal processor As IProcessor) 
Dim reader As TextReader = Nothing 
Dim writer As TextWriter = Nothing 
If (args。Length = 0) Then 
reader = Console。In 
writer = Console。Out 
ElseIf (args。Length = 1) Then 
If (args(0) = 〃…help〃) Then 
Bootstrap。DisplayHelp() 
Return 
End If 
reader = File。OpenText(args(0)) 
writer = Console。Out 
End If 
" Abbreviated 
If TypeOf processor Is IExtendedProcessor Then 
writer。Write( _ 
DirectCast(processor; IExtendedProcessor)。Initialize()) 
End If 
…………………………………………………………Page 421……………………………………………………………
CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 399 
小说推荐
返回首页返回目录