Отладка объектно-ориентированных программ

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

В подобных ситуациях программу приходится отлаживать. Один из способов отладки описан ниже.

  • Нажмите кнопку Break в диалоговом окне, показанном на рис. 9.11.
  • Закройте окно (в данном примере — консольное), чтобы вернуться в IDE.
  • Установите точку прерывания (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.