Отладка объектно-ориентированных программ
Отладка объектно-ориентированных программ
Отладка объектно-ориентированных программ всегда начинается с анализа объектных переменных и проверки того, соответствует ли их состояние предполагаемому. Именно по этой причине в 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 контекстного меню в окне программы, когда программа находится в режиме прерывания. Впрочем, независимо от того, какой путь будет выбран, центральное место в процессе отладки занимает анализ состояния объектов.