Отладка объектно-ориентированных программ
Отладка объектно-ориентированных
программ всегда начинается с анализа объектных переменных и проверки того, соответствует
ли их состояние предполагаемому. Именно по этой причине в VS IDE предусмотрены
средства для получения информации о закрытых полях ваших классов — окна просмотра
(Watch) и локальных переменных (Locals). Применение этих средств отладки будет
рассмотрено на простом примере. Допустим, мы решили перейти от связанного списка
к двусвязному. Проще говоря, в каждом элементе должна храниться не одна ссылка,
а две — на следующий и на предыдущий элемент списка, чтобы перебор мог
осуществляться не только в прямом, но и в обратном направлении. Ниже приведен
первый вариант класса двусвязного списка, содержащий ошибку. На этом примере
будут продемонстрированы основные приемы отладки объектно-ориентированных программ:
1 Option Strict
On
2 Module Modulel
3 Sub Main()
4 Dim alinkList
As New LinkedList("first link")
5 Dim aLink
As LinkedList.Link
6 aLink = aLinklist.MakeLink(aLinkList.GetFirstLink,
"second link")
7 aLink = aLinkList.MakeLinktaLink,
"third link")
8 Console.WriteLine(aLinkList.GetFirstLink.MyData)
9 aLink = aLinkList.GetNextLink(aLinkList.GetFirstLink)
10 Console.Wri
teLine(aLi nk.MyData)
11 Console.WriteLineCaLink.NextLink.MyData)
12 Console.
ReadUne()
13 End Sub
14 Public Class
LinkedList
15 Private m_CurrentLink
As Link
16 Private nfFirstUnk
As Link
17 Sub New(ByVal
theData As String)
18 m_CurrentLink
= New Link(theData)
19 m_FirstLink
= m CurrentLink
20 End Sub
21 Public Function
MakeLinktByVal currentLink As Link. ByVal _
22 theData As
String) As Link
23 m_CurrentLink
= New LinkCcurrentLink.theData)
24 Return m_CurrentLink
25 End Function
26 Public Readonly
Property GetNextLink(ByVal aLink As Link)_
27 As Link
28 Get
29 Return aLink.NextLink()
30 End Get
31 End Property
32 Public Readonly
Property GetCurrentLink() As Link
33 Get
34 Return m_CurrentLink
35 End Get
36 End Property
37 Public Readonly
Property GetFirstLink() As Link
38 Get
39 Return m_FirstLink
40 End Get
41 End Property
42
43 ' Вложенный
класс для ссылок
44 Friend Class
Link
45 Private m_MyData
As String
46 Private m_NextLink
As Link
47' Private
m_ParentLink As Link
48 Friend Sub
New(ByVal myParent As Link. ByVal theData As String)
49 m_MyData
= theData
50 m_Parentlink
= Me
51 m_NextLink
= myParent
52 End Sub
53 Friend Sub
New(ByVal theData As String)
54 m_MyData
= theData
55 End Sub
56 Friend Readonly
Property MyData() As String
57 Get
58 Return m_MyData
59 End Get
60 End Property
61 Friend Readonly
Property NextLink() As Link
62 Get
63 Return m_NextLink
64 End Get
65 End Property
66 End Class
67 End Class
68 End Module
Результат
работы программы показан на рис. 4.11. Конечно, это совсем не то, что мы ожидали
получить.
Рис.
4.11. Результат работы программы с ошибкой
В подобных
ситуациях программу приходится отлаживать. Один из способов отладки описан ниже.
Установите
точку прерывания (F9) в позиции, с которой должен начаться анализ состояния
различных объектов программы, — в нашем примере логично установить ее в строке,
предшествующей той, в которой произошло исключение (строка 9 листинга). Запустите
программу командой Debug > Start (клавиша F5). Откройте окно локальных
переменных и выведите его на передний план. На рис. 4.12 показано, как выглядит
это окно. Рядом с именами объектных переменных aLink и aLinkedList расположены
значки «+», на которых так и хочется щелкнуть.
Рис.
4.12. Окно локальных переменных в начале сеанса отладки .
Поскольку
объектная переменная aLink соответствует третьей ссылке, очевидно, ссылка на
предыдущий элемент не должна быть равна Nothi ng. Это наводит на мысль, что
мы должны повнимательнее присмотреться к коду, в котором присваивается значение
ссылки на предыдущий элемент.
Friend Sub New(ByVal
myParent As Link. ByVal theData As String)
m_MyData = theData
m_ParentLink
= Me
m_NextLink =
myParent End Sub
Оказывается,
мы перепутали операции присваивания ссылок и забыли задать ссылки из предыдущего
элемента списка на текущий. Исправленный вариант этой функции должен выглядеть
так:
Friend Sub NewtByVal
myParent As Link, ByVal theData As String)
m_MyData = theData
m_ParentLink
= myParent
m_ParentLink.m_NextLink = Me
End Sub
Возможности
отладки не ограничиваются использованием окна локальных переменных. Например,
вы можете установить условную точку прерывания по условию aLink Is Nothing или
воспользоваться командой Add Watch контекстного меню в окне программы, когда
программа находится в режиме прерывания. Впрочем, независимо от того, какой
путь будет выбран, центральное место в процессе отладки занимает анализ состояния
объектов.
Глава получилась
очень длинной. В ней вы познакомились с некоторыми встроенными классами .NET
Framework, но главной темой была специфика работы с объектами в VB .NET. По
сравнению с прежними версиями VB в этой области произошло много изменений, в
основном принципиальных. В частности, были рассмотрены параметризованные конструкторы,
значительно повышающие надежность создания объектов и их инициализацию. Короче
говоря, в этой главе был изложен базовый материал, абсолютно необходимый для
дальнейшего освоения VB .NET.