|
|||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||
|
Відладка об'єктно-орієнтованих програм
Відладка об'єктно-орієнтованих програм
завжди починається з аналізу об'єктних змінних і перевірки того, чи відповідає
їх стан передбачуваному. Саме з цієї причини в 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.
|
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||