Неформальное введение в объектно-ориентированное программирование на платформе .NET Framework 5

Неформальное введение в объектно-ориентированное программирование на платформе Net.Framework

Продолжение. Начало
в КГ №№ 13, 14, 16, 17, 20

Новости платформы Net.Framework
По сложившейся у нас традиции в начале своей статьи я вам расскажу о новостях платформы Net.Framework. А новостей, собственно говоря, не так уж и много. Точнее, новость, по крупному счету, всего одна, но зато какая! Состоялась долгожданная официальная презентация пакета Visual Studio 2003 и операционной системы Windows Server 2003.

Visual Studio и сопутствующие программные продукты
Как я вам и предсказывал в прошлой статье цикла, диски с этими программными продуктами уже появились в свободной продаже. Я лично видел не только дистрибутив с Visual Studio 2003 Everett (все восемь дисков), но и однодисковые варианты этой среды разработки. "Майкрософт" выпустила, и у нас свободно продаются, дистрибутивы Microsoft Visual C# 2003, Microsoft Visual Basic.NET 2003 и Visual C++.Net 2003. Также я видел в продаже комплект из трех дисков MSDN 2003 for Visual Studio 2003. Таким образом, вы можете установить только необходимый вам набор языков программирования, не затрачивая средства на покупку всего восьмидискового комплекта Visual Studio Net. Enterprise Architect. Покупая языки по отдельности, не забудьте приобрести и три диска MSDN 2003 for Visual Studio 2003. Они существенно упростят для вас изучение новой платформы.
Раз уж у нас речь зашла о справочных системах, расскажу вам еще о двух дисках, которые мне попадались в продаже. Первый из них содержит SDK по DirectX 9.0. Это отдельная справочная система, посвященная вопросам программирования Direct3D-приложений на языках Visual Studio 2003. Помимо самого справочника, к слову, интегрирующегося в Visual Studio на манер MSDN, пакет содержит как сам DirectX 9.0 (отладочный вариант и обычный пользовательский), так и кучу примеров, демонстрирующих использование его многочисленных функций.
К сожалению, половину примеров я так и не сумел запустить в связи с отсутствием аппаратной поддержки DirectX 9.0 в моей видеокарте (ATI Radeon 9000 Pro).
Второй диск — это SDK по платформе Windows Server 2003. Он содержит массу справочной информации для программистов о разных аспектах этой новой операционной системы. Справочник опять-таки интегрируется в Visual Studio 2003 и содержит массу примеров кода. Одно из любопытных свойств этого пакета заключается в том, что его можно обновлять через Internet, таким образом поддерживая свою справочную систему в адекватном текущему моменту состоянии. К сожалению, я сейчас пишу этот текст, находясь в командировке. Интернетом тут и близко не пахнет, поэтому я не могу вам сказать адрес страницы, на которой производятся апдейты. Как вернусь домой, обязательно вам его сообщу, если, конечно, не забуду.
Вот я и вернулся домой. Искомая страница — http://www.microsoft.com/msdownload/platformsdk/sdkupdate/update.htm .
В принципе, оттуда можно скачать и весь SDK целиком, а не только апдейты, но объем пакета таков, что это занятие лишь для людей с "толстым" каналом в Internet.

Windows Server 2003
Windows Server 2003 — это первая операционная система, изначально имеющая в своем составе предустановленный пакет Net.Framework. Windows Server 2003 продается у нас также совершенно свободно и легко доступен. Кроме того, вы можете бесплатно скачать себе образ установочного диска Windows Server 2003 Enterprise с сайта "Майкрософт". Скачав его и установив, вы проходите несложную процедуру регистрации на том же самом сайте, после чего получаете официальную лицензию на право эксплуатации платформы в течение 180 дней. Лицензия позволяет вам установить операционную систему на четырех компьютерах с неограниченным числом сетевых клиентов. Я рекомендую вам попробовать эту новую операционную систему на практике. Она содержит массу улучшений и нововведений и, что очень приятно, довольно нетребовательна к ресурсам компьютера. Если на вашем компьютере работает Windows XP, то и Windows Server 2003 будет работать ничем не хуже, а может быть, еще и лучше. Как мне показалось, чисто визуально эта новая операционная система при прочих равных условиях работает, пожалуй, даже несколько побыстрее, чем Windows XP.
Наш российский пользователь нечасто может почувствовать себя владельцем лицензионного программного обеспечения. В этом виноват и наш менталитет, и наша бедность. Обязательно побалуйтесь редкой для себя возможностью побыть лицензированным пользователем, благо этот "сыр" ничего не стоит. Собственно говоря, скачивать дистрибутив с "Майкрософт" не обязательно. Вы можете попробовать зарегистрировать уже имеющуюся у вас копию. Сам я этого не пробовал, но, думаю, особых проблем возникнуть не должно.
Как я и обещал, в ближайшее время я напишу статью в цикле "Ставим операционные системы", в которой подробно рассмотрю установку Windows Server 2003 и последующее его доведение до ума. Доводить до ума там есть чего. К примеру, по умолчанию в нем отключены механизмы Direct 3D, Windows Audio и даже визуальные темы. Если визуальные темы и Windows Audio включаются довольно легко (для этого достаточно всего лишь разрешить и запустить изначально запрещенные сервисы), то с Direct3D мне пришлось "покувыркаться". Решение оказалось довольно простым, можно даже сказать, самоочевидным, хотя я пришел к нему не сразу. Дело в том, что в лучших традициях "Майкрософт" новая операционная система требует новых драйверов для работающего под ее управлением оборудования. Причем драйверы от предыдущей операционной системы из этой линейки работают, в принципе, ничем не хуже. Так вышло и на этот раз. Процесс установки драйверов, исходно предназначенных для Windows XP, на Windows 2003 прошел без особых проблем. Омрачали его только регулярно выскакивающие окошки о том, что данные версии драйверов не тестировались под этой операционной системой.
Тем не менее, все оборудование успешно обнаружилось и установилось, но родная утилита "Майкрософт" для тестирования DirectX (dxdiag) отрапортовала о полном отсутствии поддержки 3D в установленных драйверах. Я чуть не поседел, пытаясь понять, чем именно не угодили Windows эти драйверы, пока случайно не заглянул на закладку Устранение неполадок в свойствах экрана. Тут-то все и выяснилось. Оказывается, Windows Server просто отключил Аппаратное ускорение у моей видеокарты. По всей видимости, это произошло из-за того, что драйверы не были под него сертифицированы. Как только я включил его обратно, все успешно заработало. Впрочем, не все: AGP-текстурирование так и не запустилось. Спасли положение только новые драйверы для моего чипсета. Разумеется, это были новые драйверы для Windows XP, а не для Windows 2003. Последних просто пока еще нет в природе. После установки драйверов Nforce версии 2.41 последняя "засада" была побеждена, и я получил на руки операционную систему, ни в чем не уступающую по своим возможностям Windows XP, но существенно превосходящую последнюю по качеству реализации этих самых возможностей.

Borland C# Builder
Небезызвестная фирма Borland объявила о выпуске релиза своей новой среды разработки под Net.Framework, называющейся C# Builder. Живьем я это чудо пока не видел, поэтому ничего конкретного про него рассказать не могу. Если вы заинтересовались этой их разработкой, прогуляйтесь к ним на сайт. Судя по имеющейся там информации, фирма Borland попыталась скрестить новый язык программирования со своими традиционными разработками в лице CORBA и Interbase. Честно говоря, я не вижу в этом особой необходимости, так как механизмы Net.Remoting и ADO.Net куда как покудрявее будут. С другой стороны, рассуждать на эту тему пока рано, вот "пощупаю" этот релиз своими собственными руками, тогда и смогу рассказать вам что-либо более определенное.

Введение
В предыдущих статьях цикла мы с вами на примере класса MVD_Worker рассмотрели, как в классах C# выглядят такие конструкции языка, как поля (переменные), свойства, методы и конструкторы. Также нами были рассмотрены два из трех столпов объектно-ориентированного программирования, называющиеся инкапсуляция и наследование. Мы поговорили и о переопределении методов класса-предка в классе-потомке. В качестве домашнего задания я попросил вас поиграться несколько необычным примером кода.
Эту статью я посвящу последнему, наиболее интересному, на мой взгляд, столпу объектно-ориентированного программирования. Называется он полиморфизм. Именно его мы и начали обыгрывать в том самом "необычном" домашнем задании. Поэтому давайте не будем пугаться незнакомого иностранного слова и глянем на практике, что это за зверь такой, полиморфизм, и какой гарнир принято подавать вместе с ним на стол.

Отладка приложений в Visual Studio Net
Попутно мы с вами, как всегда, пробежимся по "боковым ветвям", всплывающим при обсуждении основной темы статьи. Так, в этой статье мы сначала поговорим о том, как в Visual Studio происходит отладка приложений. Без ее использования мне будет трудно раскрыть вам главную тему этой статьи.
Давайте разберемся, как в Visual Studio создаются контрольные точки остановки (BreakPoints) программы, да и вообще происходит отладка приложений. Для начала давайте поговорим о том, что это вообще такое. Когда вы запускаете свою программу на выполнение, она очень быстро проскакивает через все команды, сразу выводя вам результат своей работы. Довольно часто получается так, что синтаксически правильный код работает вовсе не так, как вы ожидали.
Например, вы ожидаете увидеть на выходе вашей программы число 4, а на экран выводится число 6. С точки зрения правильности написания ваш код совершенно верен, поэтому компилятор Visual Studio не выводит каких-либо ошибок. Но не забывайте: компилятор — это не человек. Он будет педантично придираться к каждой неправильно поставленной запятой в вашем коде, но он понятия не имеет о том, а правильно ли, собственно говоря, вы запрограммировали сам исходный алгоритм. Если вы описали в своем коде, что работник MVD имеет 16 пальцев на ногах и дополнительную, центральную руку, растущую из головы, компилятору совершенно нет дела до того, что такое невозможно в принципе. Если вы так сказали, значит, так и есть — он вам верит на слово.
Если же вы при запуске программы заметили, что ее алгоритм имеет логические ошибки, вам наверняка захочется обладать какими-либо средствами для того, чтобы точно выяснить, где именно в вашем коде возникает из небытия третья рука или вместо числа 4 появляется число 6.
Такое средство имеется практически во всех современных средах программирования под Windows, и называется оно отладчиком. На жаргоне его еще называют дебаггером (от английского "де" — частица отрицания и "баг" — жучок, ошибка).
Интерфейс и набор функций отладчика в различных средах программирования под Windows уже давно пришли к некоему общему знаменателю. Как правило, любой современный отладчик вне зависимости от языка программирования обеспечивает следующий набор стандартных средств для анализа логики работы вашего кода.

1. Возможность остановить выполнение программы в любом произвольном месте (BreakPoint — точка остановки). Такая остановка может происходить либо при первом входе в указанный участок кода, либо при указанном вами очередном входе. К примеру, вы заметили, что ошибка возникает только при 256-м вызове некоей функции. Ставите точку остановки на функцию и указываете, что хотите остановить выполнение программы во время 256-го прохождения этого участка кода. Отладчик так и сделает, и вы легко обнаруживаете, что вместо того, чтобы использовать в качестве числа-счетчика тип int, вы использовали System.Byte. Поэтому и происходит переполнение.
Еще одна разновидность точки остановки — это остановка по условию. К примеру, вы говорите, что останавливать выполнение программы в этом месте следует только тогда, когда значение переменной internalHasDocument в объекте MVD_Worker равняется true. Отладчик будет проскакивать без остановки эту точку, если данное условие не выполняется, и сразу остановится, как только это условие совпадет.

2. Возможность посмотреть содержимое используемых в программе объектов. Для этой цели в большинстве отладчиков существует окно, называющееся Watch. Суть его работы сводится вот к чему. Вы указываете в этом окне, что хотите узнать, чему сейчас равняются значения свойств того или иного объекта. После того как отладчик остановит выполнение программы, в этом окне будет показано текущее состояние указанных вами переменных. По мере того, как вы выполняете программу по шагам, значения переменных в этом окне меняются, по-прежнему отражая их реальное значение, изменяемое методами вашей программы за время этих шагов.

3. Возможность изменить это самое содержимое переменных. Если вы заметили, что некоторая функция падает, если передать ей в качестве параметра число 14, то вы можете, как правило, в том же самом окне Watch вручную ввести это число, не дожидаясь момента, когда оно попадет туда своим естественным путем. Затем проходите подозрительную процедуру по шагам, провоцируя ее показать, какой именно фрагмент кода приводит к нежелательным для вас последствиям.

4. Возможность пройти подозрительный фрагмент программы по шагам. По шагам означает по одной конструкции языка за ход. Вы делаете шаг и смотрите в окне Watch, как изменилось содержимое переменных в программе. Затем делаете еще шаг и опять смотрите, что происходит. Таким образом можно найти сбойный участок в вашем коде. К примеру, тот, в котором возникает "третья рука у работника MVD". Найдя этот участок, вы прекращаете отладку и исправляете ошибку. Снова запускаете программу и убеждаетесь в правильности неписаного правила, гласящего, что последняя найденная ошибка в коде всегда на самом деле является предпоследней.
Большинство отладчиков поддерживает несколько разновидностей пошагового прохода. К примеру, можно идти пошагово по коду, заходя во внутренности методов всех встречных объектов, а можно считать их "черными ящиками" и внутрь не заходить. Можно одним скачком проскочить код до позиции под вашим курсором, а дальше идти по шагам. Возможностей очень много, и описывать их можно долго.

5. Возможность продолжить обычное безостановочное выполнение программы. Убедившись, что ошибка кроется где-то в другом месте, вы можете запустить программу выполняться дальше, до следующей точки остановки или до своего логического конца. Чтобы точка остановки больше не путалась под ногами, ее можно временно отключить или полностью убрать.
Давайте посмотрим, как эти отладочные возможности реализованы в среде Visual Studio Net.

1. Возможность поставить точку остановки.
В Visual Studio это можно сделать как минимум двумя способами. Во-первых, просто щелкнуть по левой границе окна с текстом вашего класса на нужной строчке. Обратите внимание: справа у нас имеется скроллер (полоска с бегунком), для того чтобы перемещаться по тексту документа, а слева также имеется некая серая полоса размером со скроллер, но на ней ничего нет. Щелкните мышкой по этой серой полосе — на ней появится красный кружок, а линия кода напротив него также окрасится в красный цвет. Произошедшее означает, что вам удалось установить наиболее простую разновидность точки остановки. По достижении помеченного участка кода выполнение программы будет немедленно остановлено. После этого вы сможете воспользоваться остальными отладочными возможностями среды Visual Studio. Если вам нужна более "умная" точка остановки, вызовите на нужной строчке кода контекстное меню с помощью правой кнопки мыши или же поставьте курсор на нужную строчку и вызовите пункт меню Debug-> New BreakPoint (на худой конец просто нажмите Ctrl-B). На экране появится мастер, состоящий из четырех закладок. Вы можете воспользоваться любой из них. Как только вы выставите желаемые значения на одной закладке, остальные автоматически заполняются на основании тех данных, которые вы указали.
На первой закладке, озаглавленной "Function", вы можете указать название конкретной функции, работу которой вы хотите отладить. Внутри этой функции можно указать конкретную строчку кода, на которой следует прервать выполнение программы. Если функций с указанным вами именем в вашем проекте несколько, среда предложит вам список их всех. В списке можно указать, вызов каких именно из имеющихся функций вы хотите отлаживать.
Вторая закладка, озаглавленная "File", наиболее простая. Вам предлагается просто указать файл и строчку кода, на которой следует установить новую точку остановки. При этом все поля уже заранее заполнены основываясь на том, в каком месте редактируемого сейчас файла вы вызвали мастер.

Следующие две закладки относятся к более низкоуровневой отладке при программировании на языке С++ без использования Net.Framework. Крайне маловероятно, что вы станете ими пользоваться при написании программ на C#. На третьей закладке вам предлагают установить точку остановки на конкретный физический адрес в вашем коде, а на четвертой — на факт изменения каких-либо физических данных в вашем коде. Что любопытно, четвертой закладкой мне воспользоваться так и не удалось. На любые мои попытки установить такую точку остановки выводится окошко, что Net.Framework не поддерживает такой метод. По всей видимости, этот режим предназначен исключительно для C++ и неуправляемого кода.
Прикол! Если добиться вывода сообщения о невозможности такого метода, а затем все-таки установить точку остановки с помощью второй закладки, то при повторном входе в мастер, например, через свойства точки остановки, он состоит уже не из четырех, а из трех страниц. Последняя страница исчезает. По всей видимости, это глюк используемой мной версии среды разработки Visual Studio 2003 Final Beta.
Для всех четырех методов установки точек останова можно указать дополнительные условия. Так, нажав кнопку Condition, можно задать какое-либо условие — например, определенное значение переменной. Точка остановки сработает только тогда, когда это условие выполнится. Условие выражения станет равно true. Второй допустимый вариант срабатывания — изменение результата этого условия. Например, раньше было true, а теперь стало false. Нужный вариант задается специальной галочкой. Под кнопкой Condition находится кнопка HitCount. Это счетчик входов в точку остановки — с его помощью мы указываем, какой именно последовательный проход через точку нас интересует. Предлагается также несколько вариантов. Можно сказать останавливаться всегда или по достижении определенного количества проходов.
Комбинируя все указанные значения, можно установить самую замысловатую точку остановки. Все значения установленной вами контрольной точки можно впоследствии изменить с помощью пункта контекстного меню BreakPoints Properties. В том же меню можно временно отменить все имеющиеся в коде точки остановки сразу или ту конкретную, на которую указывает курсор мышки.
Постановим, что механизм контрольных точек в Visual Studio находится на должной высоте.

2. Теперь давайте посмотрим, как Visual Studio позволяет нам контролировать содержимое используемых в программе объектов. После того как отладчик останавливается на точке остановки, вы увидите перед собой три окна просмотра содержимого объектов. Окна озаглавлены "Autos", "Local" и "Watch". Если вы их случайно закроете, то всегда можете достать обратно. Живут они в пункте меню Debug-> Window.
В окне Autos отладчик показывает содержимое тех объектов, которые упоминаются в коде текущей выполняемой и соседних с ней строчках кода. В окне Local отображаются все локальные, для этого участка кода, объекты. Окно Watch предназначено на тот случай, если вам мало первых двух окон. Вы можете вписать в него любой произвольный объект. Его содержимое будет отображаться в этом окне.
Все три окна отображают также и внутреннюю структуру объектов в иерархической древовидной форме. То есть, если в некоем объекте есть вложенный объект, то, щелкнув по "плюсику" рядом с его именем, вы можете углубиться и в его внутреннее устройство. Это очень удобное свойство окон Watch я широко использовал на первых порах вместо справочника по объектам Net.Framework. С его помощью вы можете изучить, как устроен изнутри, скажем, объект Dataset. Создали его экземпляр, поставили точку остановки на следующую строчку за его созданием — и изучайте его внутреннюю структуру в окне Watch сколько вам влезет. Действительно очень удобно, рекомендую.
Да, вот еще, совсем забыл. Окон Watch может быть несколько. Дополнительные окна открываются через Debug-> Window-> Watch. Помимо обычных окон Watch, существует еще и плавающее окно QuickWatch. В нем можно быстро набрать имя какого-либо объекта, и его значение выведется в нижнем списке.

3. Возможность изменить это самое содержимое.
Все перечисленные в предыдущем абзаце окна позволяют не только просматривать, но и изменять значения объектов. Просто вводите в их свойства новое значение — и все. Кроме этого, существует еще и такое интересное окно, как Immediate. В нем вы можете ввести любую произвольную команду, которую отладчик передаст отлаживаемой программе. Скажем, вместо того чтобы лазить по деревьям в окне Watch в поисках свойства hasDocument у объекта gai1, можно просто набрать в этом окне gai1.hasDocument=true — и свойство будет присвоено. В этом окне работает технология Intellisense, подсказывающая вам имеющиеся методы и свойства набираемого объекта. Вообще функциональность этого окна намного больше, чем простой просмотр-изменение значений переменных. Рассказывать о нем можно долго...

4. Возможность пройти подозрительный фрагмент программы по шагам.
И тут Visual Studio поддерживает стандартный набор способов пошагового прохода. Сгруппированы они в пункте меню Debug. Имеется и способ "с заходом в функции" (Step Into — F11), и способ без такого "захода" (Step Over — F10). Также дополнительно имеется метод Пропустить до выхода из метода (Step Out — Shift F11). Объяснять на пальцах, что именно делает каждый из этих трех способов, можно долго. Думаю, вам будет проще самим поиграться всеми тремя способами и посмотреть, чем они отличаются друг от друга. Также довольно прозрачно объясняют различия в их поведении иконки, расположенные напротив соответствующих пунктов меню. На них наглядно изображено, как работает каждый способ пошагового прохода.

5. Возможность продолжить обычное безостановочное выполнение программы.
Разобравшись с глюком, вы можете продолжить безостановочное выполнение программы. Как принято в Visual Studio, вам для этого предоставляется как минимум две возможности. Во-первых, можно выбрать Debug-> Continue (F5), и программа пойдет дальше своим ходом до тех пор, пока снова не наткнется на какую-либо другую точку остановки или эту же самую точку повторно. Во-вторых, можно, в меню Debug щелкнуть по DetachAll. В этом случае отладчик "отцепится" от вашего приложения, и оно пойдет дальше, игнорируя все точки остановки в коде. Помимо продолжения выполнения программы, вы можете прервать ее ход, выбрав Debug-> Stop debbuging (Shift-F5). В этом случае выполнение программы немедленно оборвется, и вы можете приступать к исправлению найденных ошибок.
На самом деле в среде Visual Studio предусмотрено еще много отладочных функций. Я намеренно не углубляюсь в своем повествовании в подробности, ограничиваясь рассказом лишь о том, что собираюсь использовать в своем примере. Попробуйте поиграться различными пунктами меню Debug самостоятельно. Я уверен, вы найдете там много любопытного.

Продолжение следует.
Герман Иванов



Компьютерная газета. Статья была опубликована в номере 23 за 2003 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета