按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
add a reference to ReaderWriter):
Imports ReaderWriter
' TODO: Finish implementing the class
Public Class LottoTicketProcessor : Implements IProcessor
Public Function Process(ByVal input As String) As String _
Implements IProcessor。Process
Return input
End Function
End Class
…………………………………………………………Page 277……………………………………………………………
CH A PT E R 1 0 ■ L E A R N I N G A B O U T P E R S IS T E N CE 255
The implementation of the Process() method takes the input parameter and returns it as
the answer。 There is no processing at the moment; just a redirection of the data。
Now let’s look at implementing the ReaderWriter project。 For this first phase; the reader/
writer will also be minimal; so that we can see that all of the pieces are in place and working。
The first phase will assume that the data is received on the console and will be sent on the
console。 Here is the implementation of ReaderWriter。Bootstrap module:
Imports System。IO
Public Module Bootstrap
Public Sub Start(ByVal args() As String; ByVal processor As IProcessor)
Dim reader As TextReader = Console。In
Dim writer As TextWriter = Console。Out
writer。Write(processor。Process(reader。ReadToEnd()))
End Sub
End Module
The implementation performs two main steps: assign the streams and manipulate the
streams。 In the puting world; streams are wonderful things; because they are a generic
concept like string buffers。 A stream could be a text file; console input; or even a network
connection。 A stream can be text…based or binary…based; with or without a formatted protocol。
Thus; when processing a stream; you don’t work specifically with the console or a file; but use
interfaces like System。IO。TextReader and System。IO。TextWriter。
Assigning the console streams involves assigning the properties In and Out to TextReader
and TextWriter; respectively。 The code that calls the processor。Process() method sends a
stream to the processor and awaits a response that is sent as another stream。
Knowing that TextReader and TextWriter are general interfaces; or technically abstract
base classes; you could be tempted to redesign the IProcessor interface as follows:
Public Interface IProcessor
Function Process(ByVal input As TextReader; ByVal output As TextWriter)
End Interface
There is nothing wrong with this declaration of IProcessor; but I would not be tempted to
use it because it relies on the interfaces TextReader and TextWriter。 In the case of our example;
that is acceptable; and you might find that it is good enough for your application。 But I like to
keep things general and then be more specific when necessary。 Later in this chapter; when we
work with binary data streams; we will need to be specific and will use an interface declaration
similar to the one shown here。
■Note As a general rule of thumb; it is always easy to write specific code because you have easy access
to the methods and properties you need。 It is harder from a design perspective to keep things general。 The
advantage of keeping things general is your code is more flexible and can be used in multiple contexts。
However; you shouldn’t make it a hard rule that all code will be general。 The rule of thumb is to try to stay as
general as possible using interfaces and have the implementation define the specifics。
…………………………………………………………Page 278……………………………………………………………
256 CH AP T E R 1 0 ■ L E A R N I N G A B OU T P E R S IS TE N CE
Having implemented all of the pieces; you could pile the source code and run the
mand to read piped data。 The only thing missing is the file that contains the data;
lotto。txt。 For the example; create a file called lotto。txt and add text such as the following;
where each line represents the date of the lottery draw; then the six lottery numbers; and then
the bonus number (you could also use the lotto。txt file included with this book’s download
able code)。
1970。01。10 7 8 12 17 32 40 24
1970。01。17 7 12 22 24 29 40 36
1970。01。24 16 22 25 27 30 35 24
1970。01。31 3 11 21 22 24 39 8
1970。02。07 2 5 11 16 18 38 37
Now run the following piping mand (open a mand prompt and navigate to
TextProcessorTextProcessorbinRelease from the Visual Basic Express base directory):
type lotto。txt | TextProcessor。exe
You should see the contents of lotto。txt。 If that is what you get; you have a successful
round…trip and have created all of the puzzle pieces。
REMEMBERING TO IMPLEMENT ALL THE PIECES
Some readers may argue that having an echo implemented in LottoTicketProcessor is the wrong
approach because there might be a munication failure among team members; leading to buggy code。
Also; you might miss implementing some code; creating bugs when there should not have been any。 Although
those risks are involved; this approach has important benefits; and there are ways to mitigate the risks。
One of the challenges for Visual Basic developers is knowing not only the language; but also the API。
This book will not talk about the API because you could die of old age before you read everything there is to
know about the API。
The API is vast; but you will not need to use all of the API all the time。 What you need to be aware
of are the general classes of