按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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