Перейти к основному содержимому

5.16. Архитектура

Разработчику Архитектору

Архитектура

Visual Basic — это семейство языков программирования и сред разработки, созданных корпорацией Microsoft с целью упрощения создания приложений для операционных систем Windows. На протяжении своей истории Visual Basic прошёл через несколько ключевых этапов эволюции, каждый из которых вносил фундаментальные изменения в его архитектурные принципы. Эти изменения отражают общие тенденции развития программного обеспечения: переход от процедурного к объектно-ориентированному подходу, интеграция с компонентными технологиями, появление управляемых сред выполнения и унификация платформ. Архитектура Visual Basic делится на два основных поколения: классический Visual Basic 6 и современный Visual Basic .NET. Оба поколения имеют собственные архитектурные особенности, определяющие способы построения, компиляции, выполнения и взаимодействия приложений.

Visual Basic 6: Компонентная модель и событийное программирование

Visual Basic 6 представляет собой завершённую реализацию парадигмы событийного программирования в рамках компонентной модели COM (Component Object Model). Эта архитектура была разработана Microsoft как универсальный способ взаимодействия программных компонентов независимо от языка их реализации. COM обеспечивает двоичный стандарт интерфейсов, позволяющий одному компоненту вызывать методы другого без знания внутренней структуры или исходного кода. В контексте Visual Basic 6 каждая форма, элемент управления или пользовательский модуль может выступать как COM-объект, реализующий определённые интерфейсы и предоставляющий свойства, методы и события.

Событийная модель лежит в основе всей логики приложения. Пользовательское взаимодействие с интерфейсом — нажатие кнопки, ввод текста, перемещение мыши — генерирует события, которые перехватываются соответствующими обработчиками. Разработчик не описывает последовательность действий сверху вниз, а определяет реакции на внешние стимулы. Такой подход идеально подходит для графических приложений, где поток управления определяется действиями пользователя, а не предопределённой логикой. Среда разработки Visual Basic 6 автоматически связывает события элементов управления с процедурами-обработчиками, что значительно ускоряет создание интерфейсов.

Архитектура проекта в Visual Basic 6 строится вокруг понятия проекта (Project), который объединяет формы (Form), модули (Module), классы (Class Module) и другие ресурсы. Формы содержат визуальные элементы управления и связанную с ними логику. Модули служат для размещения глобальных процедур и функций, доступных из любого места проекта. Классы позволяют инкапсулировать данные и поведение, но не поддерживают наследование — это ограничение, характерное для ранних версий языка. Тем не менее, за счёт механизма интерфейсов (через Implements) достигается определённая степень полиморфизма.

Компиляция проекта Visual Basic 6 приводит к созданию исполняемого файла (EXE) или динамической библиотеки (DLL). Исполняемый файл содержит машинный код, сгенерированный компилятором, а также метаданные, необходимые для работы с COM-компонентами. При запуске приложение загружается в память операционной системы и напрямую взаимодействует с API Windows через вызовы Win32. Управление памятью осуществляется вручную или с помощью встроенных механизмов подсчёта ссылок (reference counting), предусмотренных моделью COM. Каждый COM-объект хранит счётчик активных ссылок на себя; когда счётчик достигает нуля, объект освобождает занимаемую память.

Взаимодействие с внешними компонентами происходит через регистрацию этих компонентов в системном реестре Windows. Реестр содержит информацию о CLSID (Class Identifier) и IID (Interface Identifier), необходимых для создания экземпляров объектов и вызова их методов. Эта зависимость от реестра делает развёртывание приложений сложным и чувствительным к состоянию операционной системы — проблема, получившая название «DLL Hell». Несмотря на эти недостатки, Visual Basic 6 остаётся популярным в унаследованных корпоративных системах благодаря своей простоте, скорости разработки и глубокой интеграции с экосистемой Windows.


Visual Basic .NET: Объектно-ориентированная архитектура и управляемая среда выполнения

Visual Basic .NET представляет собой фундаментальную переработку языка, осуществлённую в рамках платформы Microsoft .NET. Эта версия языка отказывается от прямой зависимости от COM и Win32 API в пользу унифицированной среды выполнения — Common Language Runtime (CLR). CLR обеспечивает управление памятью, безопасность типов, обработку исключений, поддержку многопоточности и другие системные функции, которые ранее реализовывались разрозненно или требовали ручного контроля. Архитектура Visual Basic .NET строится на принципах полной объектной ориентации, включая наследование, полиморфизм, инкапсуляцию и абстракцию, что делает его равноправным участником экосистемы .NET наряду с C# и другими языками.

Все элементы программы в Visual Basic .NET являются объектами, производными от единого корневого типа Object. Каждый класс, структура, перечисление, делегат и даже примитивный тип, такой как Integer или Boolean, имеет общую метаинформацию и поведение, определённые в базовой библиотеке классов .NET (Base Class Library, BCL). Это позволяет использовать единые механизмы для работы с любыми данными: сериализация, сравнение, преобразование типов, рефлексия. Язык предоставляет полную поддержку интерфейсов, абстрактных классов, виртуальных методов и свойств, что открывает возможности для построения гибких, расширяемых и тестируемых архитектур.

Исходный код Visual Basic .NET компилируется не в машинный код, а в промежуточное представление — Microsoft Intermediate Language (MSIL), также известный как Common Intermediate Language (CIL). Этот код сохраняется в сборке (Assembly), которая может быть исполняемым файлом (.exe) или библиотекой (.dll). Сборка содержит не только IL-код, но и метаданные, описывающие типы, члены, зависимости и версионность. При первом запуске приложения или вызове метода Just-In-Time (JIT) компилятор CLR преобразует соответствующий фрагмент IL-кода в нативный машинный код, оптимизированный под текущую аппаратную платформу. Такой подход обеспечивает переносимость между архитектурами процессоров и операционными системами, где доступна реализация .NET (включая .NET Core и .NET 5+).

Управление памятью в Visual Basic .NET полностью автоматизировано. Объекты создаются в управляемой куче (managed heap), а их освобождение выполняется сборщиком мусора (Garbage Collector, GC). Сборщик мусора периодически анализирует граф ссылок между объектами и освобождает память, занятую теми, на которые больше нет активных ссылок. Это устраняет необходимость ручного вызова Set Nothing или аналогичных конструкций, характерных для VB6, и предотвращает распространённые ошибки, такие как утечки памяти или двойное освобождение.

Фреймворки пользовательского интерфейса: WinForms, WPF, ASP.NET

Архитектура пользовательского интерфейса в Visual Basic .NET развивается параллельно с эволюцией самой платформы .NET. Наиболее ранним и широко используемым фреймворком стал Windows Forms (WinForms). Он предоставляет объектную обёртку над нативными элементами управления Windows (Win32 controls), сохраняя знакомую событийную модель, но реализуя её в рамках управляемой среды. Каждая форма в WinForms — это полноценный класс, наследуемый от System.Windows.Forms.Form, содержащий визуальные элементы как поля и логику обработки событий как методы. WinForms остаётся популярным благодаря простоте, зрелости и богатой поддержке в инструментах разработки, таких как Visual Studio.

Следующим этапом стал Windows Presentation Foundation (WPF) — современный фреймворк для создания настольных приложений с богатым пользовательским интерфейсом. WPF основан на векторной графике, поддерживает сложные анимации, стилизацию через XAML (Extensible Application Markup Language), привязку данных (data binding), шаблоны управления (control templates) и декларативное описание интерфейса. Архитектура WPF строится на принципе разделения представления и логики, что способствует применению паттернов проектирования, таких как MVVM (Model-View-ViewModel). Visual Basic .NET полностью поддерживает разработку WPF-приложений, позволяя писать бизнес-логику на VB, а интерфейс описывать в XAML.

Для веб-разработки Visual Basic .NET интегрируется с ASP.NET — фреймворком для создания динамических веб-сайтов и веб-приложений. В ранних версиях ASP.NET использовалась модель Web Forms, имитирующая событийную архитектуру WinForms, но поверх HTTP-протокола. Позже появились более современные подходы: ASP.NET MVC (Model-View-Controller) и, впоследствии, ASP.NET Core, который является кроссплатформенным, модульным и высокопроизводительным. Visual Basic .NET может использоваться во всех этих моделях, хотя сообщество чаще выбирает C# для веб-разработки. Тем не менее, архитектурные возможности языка позволяют создавать полноценные серверные приложения, RESTful API и микросервисы на VB.NET в рамках ASP.NET.

Таким образом, архитектура Visual Basic .NET представляет собой гармоничное сочетание объектно-ориентированного языка, управляемой среды выполнения и богатой экосистемы фреймворков. Она обеспечивает высокую степень абстракции от аппаратных деталей, упрощает управление ресурсами, поддерживает современные практики проектирования и позволяет разрабатывать приложения для различных платформ — от настольных до веб- и облачных.


Структура проекта: от форм к сборкам

Архитектурные различия между Visual Basic 6 и Visual Basic .NET проявляются не только на уровне выполнения, но и в самой организации исходного кода и ресурсов. В Visual Basic 6 проект представляет собой совокупность файлов с расширениями .frm (формы), .bas (стандартные модули), .cls (класс-модули), .vbp (файл проекта) и дополнительных ресурсов — изображений, значков, пользовательских элементов управления (OCX). Файл проекта .vbp содержит метаданные: список всех компонентов, ссылки на внешние библиотеки (в основном COM-объекты), параметры компиляции и настройки окружения. Эта модель проста и линейна, но обладает рядом ограничений: отсутствует поддержка пространств имён, нет встроенного механизма версионирования зависимостей, а управление ресурсами осуществляется вручную через редактор свойств.

В Visual Basic .NET структура проекта переходит на модель, принятую в экосистеме .NET. Проект описывается файлом с расширением .vbproj, который является XML-документом, соответствующим формату MSBuild. Этот файл определяет все исходные файлы (обычно с расширением .vb), зависимости от других сборок, целевую платформу (.NET Framework, .NET Core, .NET 5+), параметры компиляции, включённые ресурсы, настройки отладки и публикации. Все файлы кода объединены в единое логическое пространство имён, которое может быть явно задано в каждом файле или унаследовано от имени проекта. Такой подход обеспечивает чёткую иерархию типов, предотвращает конфликты имён и упрощает реорганизацию кодовой базы.

Ресурсы — строки, изображения, звуки, файлы — интегрированы в сборку как внедрённые данные. Они доступны во время выполнения через автоматически генерируемые классы, такие как My.Resources, что исключает необходимость хранения путей к внешним файлам или работы с Win32 API для загрузки ресурсов. Это повышает переносимость приложения и защищает его от повреждения из-за отсутствия внешних файлов.

Жизненный цикл приложения и модель выполнения

В Visual Basic 6 приложение запускается с точки входа, обычно определяемой как Sub Main или первая загружаемая форма. Управление передаётся операционной системе, которая вызывает обработчики событий по мере поступления сообщений из очереди Windows. Разработчик может вручную управлять циклом сообщений, хотя это редко требуется. Завершение приложения происходит либо явным вызовом End, либо закрытием последней формы. При этом освобождение ресурсов зависит от корректности реализации подсчёта ссылок в COM-компонентах. Ошибки в управлении ссылками приводят к зависанию объектов в памяти или аварийному завершению.

В Visual Basic .NET точка входа — это статический метод Main, который создаёт основную форму или запускает службу, веб-приложение или консольный процесс. Цикл сообщений для настольных приложений управляется фреймворком (например, Application.Run() в WinForms), а не разработчиком. Завершение приложения инициируется через вызов Application.Exit() или выход из метода Main. После этого среда CLR инициирует фазу завершения: вызываются финализаторы объектов, выполняется очистка потоков, освобождаются неуправляемые ресурсы через интерфейс IDisposable, если он реализован. Сборщик мусора гарантирует, что вся управляемая память будет освобождена до полного завершения процесса.

Для веб-приложений на ASP.NET жизненный цикл управляется веб-сервером (IIS или Kestrel). Каждый HTTP-запрос порождает новый экземпляр контроллера или страницы, обрабатывается в отдельном контексте и завершается после отправки ответа клиенту. Visual Basic .NET позволяет реализовывать сложную логику обработки запросов, кэширования, аутентификации и авторизации, полностью интегрируясь в конвейер ASP.NET.

Взаимодействие с внешним миром: от COM к .NET Interop и REST

Visual Basic 6 полагается на технологию COM для интеграции с другими компонентами. Любой внешний объект — база данных через ADO, документ Microsoft Office через Automation, сторонняя DLL — должен предоставлять COM-интерфейс и быть зарегистрирован в системе. Это создаёт жёсткую привязку к операционной среде и затрудняет развёртывание «из коробки». Тем не менее, COM остаётся мощным механизмом для глубокой интеграции с Windows-приложениями, и многие корпоративные системы до сих пор используют его.

Visual Basic .NET сохраняет возможность взаимодействия с COM через механизм COM Interop. Среда CLR автоматически генерирует обёртки (Runtime Callable Wrapper, RCW) для COM-объектов, позволяя вызывать их методы так, будто они являются обычными .NET-типами. Обратная связь — вызов .NET-компонентов из COM-приложений — обеспечивается через COM Callable Wrapper (CCW). Однако основной акцент в современной архитектуре сделан на стандартизированные протоколы: HTTP, JSON, XML, gRPC. Visual Basic .NET предоставляет богатые средства для работы с веб-API, включая классы HttpClient, сериализаторы JsonSerializer, поддержку LINQ to XML и интеграцию с Entity Framework для доступа к базам данных через ORM.

Эта эволюция от двоичных интерфейсов к текстовым протоколам и облачным сервисам отражает общемировую тенденцию к микросервисной архитектуре, где компоненты взаимодействуют через чётко определённые контракты, а не через разделяемую память или системный реестр.