С.В. Орлик
Группа Пользователей Delphi, редактор русскоязычного электронного издания Delphi Interactive Journal. FidoNet 2:5020/87.46
1. Проблема масштабируемости приложений.
Одной из наиболее "горячих" тем последних лет в области компьютерной обработки информации и баз данных (БД) стала проблема масштабируемости1) приложений, работающих с БД.
"Масштабируемость" - способность системы адаптироваться к расширению предъявляемых к ней требований и возрастанию объемов решаемых ею задач. В применении к приложениям, работающим с БД, понятие масштабируемости подразумевает возможность перехода на качественно более мощные СУБД с минимумом изменений в самих приложениях. В подавляющем большинстве случаев это перенос desktop-приложений в архитектуру клиент-сервер (Upsizing). В силу отличия традиционных концепций desktop-БД и серверных-БД этот процесс вызывает множество споров и вопросов. В чем же состоят основные проблемы переноса приложений в архитектуру клиент-сервер ?
В то время как desktop-БД подразумевают отношения между "записями" и "полями", основой серверной концепции является "множество" данных (set-oriented databases). Отсутствие единого структурированного языка построениия запросов в одном случае, и навигационных методов доступа, в другом, сильно усложняют upsizing. А если вспомнить о том, что desktop-БД не имеют средств поддержания целостности данных (в несколько меньшей степени это относится к Paradox), а тем более возможностей гибких средств управления полномочиями пользователей (security access level), становится понятным, что идеология desktop-приложений коренным образом отличается от идеологии клиент-серверных приложений.
Понятие масштабируемости тесно связано и со свойством интероперабельности. Что же это такое в применении к приложениям БД ? Интероперабельность таких систем предполагает работу с гетерогенными данными, то есть с данными, хранящимися в разных форматах или на разных SQL-серверах. Причем данные необязательно должны храниться в традиционных БД (примером может служить оболочка Lotus Notes или специализированные геоинформационные системы).
Становится очевидным, что масштабирование (в широком смысле слова) большинства существующих desktop-систем представляет отнюдь не тривиальную задачу.
Решению этих проблем посвящена технология, предлагаемая фирмой Borland. Ниже мы рассмотрим средство создания Windows-приложений - Borland Delphi.
Прежде чем говорить о создании frontend-приложений2) в Delphi, кратко познакомимся с общими возможностями этого продукта без привязки к базам данных.
2. Подход Delphi к разработке Windows-приложений
Borland Delphi относится к классу RAD-систем (Rapid Application Development - среда быстрой разработки приложений).В основе этого продукта лежит компилятор с языка третьего поколения Object Pascal (семейство языков программирования Turbo Pascal). Визуальные средства программирования "two-way tools"3) позволяют, в свою очередь, создать работающее многофункциональное приложение, практически не написав ни единой строки кода.
Ядром визуальных средств программирования Delphi является Visual Component Library (VCL) - объектно-ориентированная библиотека компонентов ( их в стандартной поставке более 75 ), предназначенная для создания пользовательского интерфейса и доступа к системным ресурсам как операционной системы (DOS), так и графической оболочки (Windows), а также для работы с БД.
Рассмотрим особенности процесса разработки приложения в Delphi.
"Компонентная" архитектура приложений Delphi предоставляет интуитивно понятный подход к программированию в Windows. Этот подход, в первую очередь, заключается в визуальном конструировании GUI-форм4) приложения посредством помещения в формы тех или иных системных и интерфейсных объектов ( из так называемой "палитры компонент" ) и установке их свойств и поведения. Те читатели, которые хотя бы раз запускали Borland dBase for Windows или Paradox for Windows, увидят в Delphi знакомое средство - Object Inspector. Этот инструмент позволяет несколькими нажатиями кнопки мыши установить или изменить основные свойства компонент, а также привязать к событиям, на которые может реагировать выбранный объект, код, выполняющий те или иные действия. Компонентная архитектура, основывающаяся на объектно-ориентированном подходе, является одним из решений проблемы повторного использования кода.
Любую форму или все приложение можно сохранить в качестве шаблона (template) и повторно использовать в новых проектах. Для этого Вы сможете воспользоваться так называемой "галереей" Delphi (см. Рис. 1)
Рисунок 1.
Экономии времени при разработке приложения можно достичь использованием так называемых "экспертов". "Эксперт" представляет собой встраиваемый в среду Delphi программный блок (например, реализованный в виде DLL - библиотеки динамической компоновки Windows), который, после диалога с разработчиком, генерирует исходный код и формы уже с развитыми функциональными возможностями. Для создания новых "экспертов" Delphi предоставляет ряд модулей VCL (см. Рис. 2)
Рисунок 2.
В процессе разработки интерфейса и наращивания функциональности приложения программист может, не выходя из среды Delphi, проверять синтаксис исходных текстов и проводить их компиляцию и отладку.
Для просмотра иерархии классов, получения информации о модулях, а также объявлениях типов, констант, переменных и функций предназначено средство визуальной среды разработки Delphi - Object Browser(см. Рис. 3).
Рисунок 3.
Безусловно стоит упомянуть и о поддержке со стороны Delphi таких средств групповой разработки как, например, Intersolv PVCS (версии 5.1).
Такая интеграция с внешними продуктами может заинтересовать тех читателей, которые занимаются созданием крупных программных комплексов.
Так как речь идет о Delphi как о профессиональном инструменте, следует отметить несколько важных особенностей языка Object Pascal.
В этом языке реализован ряд расширений основных объектно-ориентированных признаков - инкапсуляции и полиморфизма. С введением понятия свойства (property) стала стираться грань между данными объекта и методами доступа к этим данным. Поля процедурного типа используются для динамического изменения поведения экземпляров объектов на этапе выполнения приложения. Механизм RTTI (RunTime Type Information) и функции классов позволяют программисту более гибко определять параметры объектов.
Возможности создания новых визуальных компонент за счет расширения стандартной иерархии классов, наряду со средствами настройки палитры компонент, существенно повышают производительность работы в Delphi (в варианте Delphi Client/Server большинство модулей VCL представлено в исходных текстах).
Объектно-ориентированные средства обработки исключительных ситуаций (exception) крайне важны для тех приложений, которые особенно "критичны" к сбоям. К таким системам как раз и относятся приложения для работы с БД.
3. Borland Database Engine - инструмент доступа к данным
В основе взаимодействия Delphi с БД лежит Borland Database Engine. Этот инструмент представляет из себя набор функций для работы с БД различных форматов - IDAPI, драйверы наиболее распространенных форматов БД и утилиту настройки драйверов и псевдонимов. Остановимся на этих составных частях BDE более подробно. (см. Рис. 4)
Рисунок 4.
IDAPI (Integrated Database Application Program Interface) насчитывает более 150 функций для доступа к БД. Механизм, лежащий в основе этого API, позволяет единообразно работать как с локальными, так и с удаленными (SQL) данными. В основе этого механизма лежит понятие "курсора". Курсоры позволяют, с одной стороны, работать с удаленными данными, используя навигационные методы, с другой - обращаться к локальным данным через SQL. За счет такой идеологии стираются принципиальные различия в построении desktop-приложений и клиентских приложений. Как следствие, разработчики, использующие IDAPI для доступа к данным, могут позволить себе в одном и том же приложении обращаться к разным форматам данных, формируя "гетерогенные" запросы (heterogeneous joins).
Пример.
Следующее SQL-выражение показывает как связать три таблицы разных форматов (Paradox, Interbase и Sybase) между собой:
select distinct c.cust_no, c.state, o.order_no, i.price from ":Local_alias:customer.db" c, :IB_alias:order o, :SYB_alias:lineitem i where o.cust_no = c.cust_no and o.oder_no = i.order_no
IDAPI не ограничен минимальным набором функций. Общее для разных БД функциональное подмножество расширено в соответствии с возможностями и особенностями каждого из доступных форматов, как локальных, так и удаленных.
Набор функций IDAPI включает в себя также, средства вторичного уточнения результатов запросов - фильтры. Фильтры BDE позволяют динамически ограничивать объемы информации, связанные с курсорами. Функционируя на уровне клиентского приложения, фильтры позволяют уменьшить сетевой траффик при работе с удаленными данными, так как вся информация о фильтруемых данных уже связана с соответствующим курсором клиентского приложения. Фильтры IDAPI поддерживают сложные логические условия, построенные в виде дерева триад5). (см. Рис. 5)
Рисунок 5.
Логика построения фильтра IDAPI
Для реализации единообразия доступа к данным, вне зависимости от их формата, BDE работает со всеми данными через так называемые "драйверы". Разработчику приложений не требуется знание механизма взаимодействия динамических библиотек IDAPI с драйверами. Достаточно лишь уметь их настраивать с помощью утилиты настройки BDE.
Утилита настройки - BDE Configuration Utility - позволяет сконфигурировать такие параметры драйверов, как используемый национальный языковой драйвер, режим разделения при совместном доступе к данным, представления даты, времени и чисел, псевдонимы соединений и многое другое (см. Рис. 6).
Рисунок 6.
Важной составной частью BDE является технология Idapter, разработанная Borland совместно с компанией Q+E Software. Она заключается в трансляции IDAPI-вызовов в вызовы стандартных методов интерфейса ODBC. Это позволяет существенно расширить ряд доступных СУБД.
В BDE поддерживаются два языка запросов - SQL и QBE, опять-таки для всех форматов БД, включая ODBC-драйверы. Кроме того, IDAPI содержит функции для реструктуризации данных.
Стоит упомянуть, что BDE как основа взаимодействия с данными, кроме Delphi, используется в Borland Paradox for Windows и dBase for Windows.
4. Архитектура database - компонент Delphi
Доступ к базам данных из инструментов разработки Borland не ограничивается набором API-функций. Напротив, именно объектно-ориентированная надстройка над IDAPI является основой взаимодействия клиентских приложений с базами данных. В Delphi такой надстройкой являются Visual Data Objects (VDO) - часть VCL, ориентированная на работу с БД.
В соответствии с логикой Visual Component Library компоненты VDO (их более 25) разделены на две основные группы: Data Access components и Data Control components. Как следует из названий этих групп, первая из них является "системной", то есть компоненты, входящие в нее отвечают за организацию доступа к БД, вторая группа отвечает за ввод и отображение данных.
Прежде чем говорить о принципах использования VDO, перечислим основные компоненты VDO.
Компоненты доступа к данным:
- TDatabase - "база данных";
- TTable - таблица БД;
- TQuery - SQL-запрос;
- TStoredProc - хранимая процедура;
- TDataSource - источник данных;
- TReport - "отчет", взаимодействующий с run-time ReportSmith (см. ниже) через механизм DDE.
Визуальные компоненты:
- TDBNavigator - компонента предоставляющая возможности навигации по "множеству данных";
- TDBEdit, TDBGrid, TDBListBox, TDBComboBox, TDBImage и др. - наследники стандартных и расширенных интерфейсных элементов Windows (в иерархии VCL), которые ориентированы на работу с БД.
Компоненты TTable и TQuery не отображаются во время выполнения приложения, но они обеспечивают связь с БД через BDE, являясь, по идеологии VDO, рабочим "множеством данных" (dataset). В иерархии классов VDO эти компоненты, вместе с TStoredProc, имеют общего предка - TDBDataSet - "множество данных".
Отображаемые компоненты (Data Control) ссылочно (через свойства экземпляров) связаны с TTable и TQuery и так называемым "источником данных" - TDataSource. Такая инфраструктура стирает различия между работой пользователя с таблицей БД и результатами запроса, не требуя дополнительного программирования передачи данных между интерфейсными элементами и БД.
Интересной особенностью среды визуальной разработки Delphi является возможность работы с "живыми" данными (live-data). Такая возможность подразумевает отображение реальных данных в Data Controls еще на этапе конструирования форм (design-time). Такое свойство среды Delphi облегчает работу по размещению видимых компонентов на форме, в зависимости от формата отображения данных, так как программист, не компилируя и не запуская приложение, может увидеть окончательный результат.
В остальном идеология работы с VDO-компонентами ни чем не отличается от обычных компонентов VCL Delphi.
5. Дополнительные инструментальные средства, входящие в Delphi
Как любое развитое средство разработки приложений, Delphi, кроме среды разработчика, включает в себя и другие инструменты. Остановимся на тех из них, которые связаны с базами данных6).
SQL Links (*) - набор IDAPI-драйверов для связи приложений с удаленными SQL-серверами БД, например Oracle, Sybase,InterBase и Informix.
Генератор отчетов ReportSmith, в зависимости от варианта (Delphi for Windows или Delphi Client/Server) предоставляет соответствующие возможности доступа к данным и обеспечивает интерфейс для создания отчетов с использованием "live-data conception" (просмотр реальной информации из БД на этапе конструирования отчета). Запросы, перекрестные таблицы, графики, шаблоны и мн. др. - все это без ограничений объема получаемого отчета.
ReportSmith Run-Time - среда для доступа к отчетам из приложений, написанных на Delphi, реализованная в виде Windows MDI-приложения. Взаимодействие с приложениями осуществляется через DDE-обмен с приложением (см. выше TReport - Data Access Component).
Local InterBase Server представляет из себя однопользовательский, работающий в среде MS Windows, "desktop"-SQL-сервер, для построения и тестирования Delphi- приложений с последующим масштабированием их на промышленные БД, например Oracle, Sybase, Informix или Interbase. Обладает практически всеми возможностями реального InterBase Workgroup Server 4.0, включая перенос созданных БД на промышленный вариант сервера (см. статью П. Красюка "Borland InterBase ..." , СУБД N 2/1995).
Windows ISQL (WinISQL)-интерактивный SQL. Средство, позволяющее строить и выполнять с клиентских, Windows-рабочих мест SQL-запросы к локальному и удаленному InterBase-серверу. С помощью WinISQL вы можете, без написания специальных SQL-скриптов, получить полную информацию по метаданным БД, например триггерам, доменам, хранимым процедурам и т.п.
Interbase Server Manager - клиентское Windows-приложение, предназначенное для администрирования баз данных Interbase 4.0, как локальных, так и серверных.
Database Expert - "эксперт" Delphi, облегчающий построение скелета приложения, работающего с БД.
Visual Query Builder (*) - средство среды Delphi, позволяющее без знания SQL визуально строить сложные запросы к БД, с последующей генерацией текста запроса на SQL.
Database Desktop (DBD), являясь "минимальным" ядром Borland Paradox for Windows, предоставляет возможности по созданию, изменению структуры, построению запросов к удаленным и локальным данным.
6. Delphi: от настольных систем - к архитектуре клиент-сервер
В большинстве случаев Delphi-приложения, созданные для работы с локальными данными, могут получить доступ к данным на удаленном сервере, с минимумом изменений самого приложения. Если конгруэнтный (сравнимый по структуре таблиц) источник данных (data source) настроен на SQL-сервер, вы можете "перенаправить" приложение, имевшее раньше доступ к локальным данным, всего лишь изменив свойство DatabaseName компонент TTable или TQuery. А если, разрабатывая desktop-приложение, вы планировали в перспективе переход на более высокий уровень технологии (upsizing), затраты на перенос системы в архитектуру клиент-сервер могут заключаться только в настройке псевдонимов соединений BDE.
Следует, однако, понимать, что при переходе к технологии клиент-сервер, вы захотите использовать все предоставляемые этой технологией возможности, сложив с клиентских приложений на сервер БД часть функциональности, отвечающую за поддержание целостности данных (триггеры), часто повторяющихся вычислений (хранимые процедуры) и т. п. В этом случае, масштабирование7) системы повлечет за собой только уменьшение исходного кода. Хотя очевидно, что там где больше возможностей, еще больше запросов (уже не в смысле SQL-выражений) ...
1) Так как русскоязычная терминолошия в этой обдасти компьютерных технологий еще не сложилась окончательно в статье будут использоваться также англоязычные термины.
2) "Frontend" (в отличие от desktop-приложений) - клиентские приложения, работающие с данными в архитектуре клиент-сервер
3) "two-way tools" - визуальные средства программирования, позволяющие синхронизировать процесс конструирования интерфейсных форм и изменение исходных текстов разрабатываемой программы.
4) GUI - Graphic User Interface, стандарт польовательского интерфейса в оконных графических средах.
5) Триады - понятие теории синтаксического анализа. Под триадой подразумевается конструкция: два параметра и их отношение. В конструкции "CustomerNo" > 2000" параметрами являются "CustomerNo" и константа "2000", а отношением - операция сравнения ">"
6) В данном случае рассматривается Delphi в варианте Client/Server. Инструменты, не входящие в desktop-версию Delphi for Windows, помечены (*).
7) В данном контексте под "масштабированием" понимаестя как-таковой процессс переноса приложений, работающих с локальными данными, в архитектуру клиент-сервер.