按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
to labor to find the bug。 A debugger has its uses; but when writing good tests in many scenarios; you will rarely
need to use it。
And speaking of writing tests; as I noted in Chapter 6; in this book; I could introduce a testing framework
like NUnit (http://nunit。org) or Microsoft Visual Studio Team System (http://
msdn2。microsoft。/en…us/vstudio/default。aspx)。 When you are writing production code; you
will probably use such a testing framework。 Testing frameworks do not help you to write your tests; but rather
help you by providing support code to generate errors; log problems; and indicate progress of the tests。 Do
not get misled by tools that say they can write the tests for you。 No tool can write your tests; because that
would imply the tool understands the context of your code。 And since such a tool does not yet exist; you will
need to write your own tests。
Implementing Room Groupings
Room groupings are collections of rooms that fall into a specific organization。 The idea behind
a grouping is to perform group operations without having to explicitly examine a room before
performing an operation。 For example; in the case of the museum; we don’t need to figure out
whether a room is public or private each time a global operation is being performed。
The organization of the collection is that there can be multiple room groupings that are
linked together; and within a grouping; there are multiple rooms that can be grouped together。
The linked list structure has two levels and is coded as follows (in LibLightingSystem):
Class RoomGrouping
Inherits BaseLinkedListItem
Public Rooms As Room
Public Description As String
End Class
Class Room
Inherits BaseLinkedListItem
Public ObjRoom As IRoom
End Class
…………………………………………………………Page 235……………………………………………………………
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 213
The class declaration Room represents an individual room。 But notice how it derives from
BaseLinkedListItem; which seems to imply that Room is actually many rooms。 This is part of the
linked list implementation; it is like a chain; where the chain is created by individual links。
The RoomGrouping class has two data members: Rooms; which represents the list of rooms in
the grouping; and Description; which represents an easy…to…understand description of the
grouping。 The single data member for Room is a reference to an IRoom interface instance。
The room groupings are managed by the LightingController class。 An initial implemen
tation of LightingController is as follows:
Public Class LightingController
Private _roomGroupings As BaseLinkedListItem = New RoomGrouping()
End Class
When dealing with linked lists; you have a problem: which is the first element of a list? When
you use arrays; an empty list of arrays is an array with no references。 But there is an explicit
array object。 Using the linked list; an empty linked list is a list that does not exist。 Thus; when
you want to create a list; you need a room。 In LightingController; the first element is an instance
of RoomGrouping; which is not a room grouping; but serves as a placeholder。 To insert a room
grouping; you could simply use this code:
_roomGroupings。Insert(NewRoomGroup())
Without the placeholder; you would need to write the following code whenever you
wanted to add an element into the list。
If _roomGroupings Is Nothing Then
_roomGroupings = NewRoomGroup()
Else
_roomGroupings。Insert(NewRoomGroup())
End If
The code that uses the placeholder is shorter and simpler; however; it also requires a dangling
instance of RoomGrouping that has no real value。 I chose the dangling approach because I am
making the decision that a room grouping with no identifier is the default room grouping。
Adding a Room Grouping
The following code adds a room grouping (added to the class LightingController)。
Public Function AddRoomGrouping(ByVal description As String) As Object
Dim grouping As RoomGrouping = New RoomGrouping() _
With { _
。Description = description; _
。Rooms = Nothing
}
_roomGroupings。Insert(grouping)
Return grouping
End Function
…………………………………………………………Page 236……………………………………………………………
214 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
To add a new room grouping; you instantiate RoomGrouping; assign the data members; and
then call the method _roomGroupings。Insert() to insert the new room grouping into the linked list。
Let’s look at the technique for assigning data members; called object initialization。 In
previous examples; when an object was instantiated and we wanted to assign default values;
we would create a constructor with the appropriate parameters。 However; another way is to instan
tiate the object and define a block that assigns the appropriate data members or properties。 In the
case of RoomGrouping; there are two publicly defined data members: Description and Rooms:
。Description = description; _
。Rooms = Nothing
The Description and Rooms data members have assign access; which is important as this
technique o