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


rs
and private methods of other instances of that type。 
…………………………………………………………Page 230……………………………………………………………
208 CH AP T E R 8 ■ L E A R N IN G AB OU T CO M P O N E N TO R IE N T E D AR C HI TE CT U R E 
Once the data members of the item have been assigned; the item is integrated into the list;
by redirecting the _prev property of the next object (if it is not Nothing); and then assigning the
local _next property to the object to be inserted。 
The Remove() method does the same as Insert(); but in reverse。 The first step is to redirect
the _next and _prev properties of the previous and next objects; assuming that they are not
Nothing。 And then the object to be removed has its _next and _prev properties assigned to Nothing。 
■Note The declaration of PrevItem and NextItem is a mon architecture where data members can be
read; but to assign them; you need to use methods。 Using read…only properties is one way to make sure that
the internal state cannot be corrupted; if you must expose the internal state。 
Testing the Linked List 
BaseLinkedListItem is a core class and serves a utility purpose。 This makes the class eligible to
be declared in the kernel or a definitions assembly。 As the class is a core class; it means you
need a more exhaustive testing framework to ensure that there will be no problems。 In this
section; we will go through one test that demonstrates what you should be testing for and how
you should be testing a core class。 
BaseLinkedListItem is declared as MustInherit and needs an implementation。 The purpose of
the implementation is to give us enough information on the state and context of the object。 In this
case; we want to define an object that tests every part of the class BaseLinkedListItem。 If you have
ever seen pictures of a test car tire hooked up to dozens of wires; then you will understand what the
test class needs to do。 Following is a sample implementation; placed in the TestLightingSystem
project。 Remember to include a reference to LibLightingSystem (right…click References in
TestLightingSystem and select Add Reference and then Projects LibLightingSystem)。
。 。 。 
Imports LibLightingSystem 
Class LinkedItem
Inherits BaseLinkedListItem 
Private _identifier As String 
Public Sub New(ByVal identifier As String) 
_identifier = identifier 
End Sub 
Public ReadOnly Property Identifier As String 
Get
Return _identifier 
End Get 
End Property 
…………………………………………………………Page 231……………………………………………………………
C H AP TE R 8 ■ L E AR N IN G AB O U T CO M P O N E N T O R IE N TE D A R CH I TE C TU R E 209 
Public Overrides Function ToString() As String 
Dim buffer As String 
buffer = 〃Me(〃 & _identifier & 〃)〃 
If NextItem IsNot Nothing Then 
buffer = buffer & 〃 next(〃 & _ 
DirectCast(MyBase。NextItem; LinkedItem)。Identifier & 〃)〃 
Else
buffer = buffer & 〃 next(Nothing)〃 
End If 
If PrevItem IsNot Nothing Then 
buffer = buffer & 〃 prev(〃 & _ 
DirectCast(MyBase。PrevItem; LinkedItem)。Identifier & 〃)〃 
Else 
buffer = buffer & 〃 prev(Nothing)〃 
End If 
Return buffer 
End Function 
End Class 
The LinkedItem class has a single data member declaration; _identifier; which is used
to identify the instance。 The test code will call the Insert() and Remove() methods; and then
generate a visual representation of the linked list。 The visual representation is used to under
stand what the problem might be if anything goes wrong。 You will not write tests against the
visual representation because that would overplicate the testing。 
To generate a visual representation of the object; the ToString() method is overridden。 By
default; all objects have a ToString() implementation; which does absolutely nothing other
than spit out the identifier of the object reference。 To make ToString() do something useful;
you need to override it。 In the example; ToString() will generate a buffer that contains the
LinkedItem identifier and the next and previous object identifiers。 These three pieces of infor
mation tell you the structure of the linked list。 
The next step is to write a test in TestLightingSystem’s Module1。vb that verifies that the
Insert() method works properly; and it is implemented as follows: 
Module Module1 
Sub Main() 
TestInsert() 
End Sub 
Public Sub TestInsert()
Console。WriteLine(〃**************〃) 
Console。WriteLine(〃TestInsert: Start〃) 
Dim item1 As LinkedItem = New LinkedItem(〃item1〃) 
Dim item2 As LinkedItem = New LinkedItem(〃item2〃) 
Dim item3 As LinkedItem = New LinkedItem(〃item3〃) 
Dim toString As String = item1。ToString() 
Console。WriteLine(toString) 
If (item1。NextItem IsNot Nothing) OrElse _ 
…………………………………………………………Page 232……………………………………………………………
210 CH AP T E R 8 ■ L E A R N IN G AB OU T CO M P O N E N TO R IE N T E D AR C HI TE CT U R E 
(item1。PrevItem IsNot Nothing) Then
Throw New Exception( _ 
〃TestInsert: Empty structure is incorrect〃) 
End If 
item1。Insert(i
小说推荐
返回首页返回目录