Общий обзор
Реализация объектно-ориентированного подхода
Открытость
Заключение

Во втором квартале 1996 года выпущена новая версия одного из самых популярных средств разработки приложений - PowerBuilder 5.0 компании Powersoft, входящей в корпорацию Sybase. Изначально задуманный в 1991 году как визуальное средство создания приложений в архитектуре клиент-сервер, PowerBuilder быстро стал лидером в своей области; однако в последнее время был незаслуженно оттеснен на второй план такими средствами, как Delphi (Borland) и Visual Basic (Microsoft). И появившаяся пятая версия в полной мере развила преимущества подхода, заложенного в предыдущих версиях PowerBuilder - объектно-ориентированную направленность, открытость, многоплатформенность. Наиболее существенными новшествами пятой версии я бы назвал наличие компилятора в машинный код, возможность генерировать распределенные приложения, а также появление новой библиотеки классов PowerBuilder Foundation Class Library. Опыт работы с коммерческим релизом позволяет сделать вывод о том, что он является мощным открытым инструментарием для создания сложных приложений, работающих не только в традиционной двухуровневой архитектуре клиент-сервер, но и в трехуровневой (three-tier), а также в многоуровневой архитектурах, - и, таким образом, сочетает в себе быстроту и удобство разработки с возможностью генерации компилируемых распределенных приложений.

Общий обзор

Так что же такое PowerBuilder? Power-Builder - это профессиональный объектно-ориентированный графический инструментарий построения приложений, работающих с базами данных в различных архитектурах как через прямые драйверы, так и через драйверы стандарта ODBC. Он относится к классу RAD-средств (средств быстрой разработки), поскольку позволяет значительно сократить время разработки самых сложных продуктов. PowerBuilder позволяет одному или нескольким разработчикам строить графические приложения, работающие с локальными, удаленными и распределенными базами данных. PowerBuilder отличается продуманным интерфейсом, удобной средой, широким выбором инструментов, открытостью, наращиваемостью и, как уже упоминалось, многоплатформенностью. PowerBuilder - это больше, чем просто инструментарий, - это среда разработки, в которой разработчик может не только создавать приложения, но и производить реструктурирование и любые модификации баз данных, а также перекачивать данные из одних источников в другие.

Среди основных черт PowerBuilder 5.0 можно выделить следующие:

  • наличие набора средств, называемых мастерскими (painters), обеспечивающих графическую, в стиле "укажи и щелкни", среду для создания окон, меню, функций и других объектов;
  • объектно-ориентированный язык программирования - PowerScript - для построения управляемой событиями логики приложения;
  • поддержка всех классов Windows;
  • наличие специального объекта, называемого DataWindow, для всех манипуляций с базами данных, а также генерации отчетов;
  • компилируемый 32-разрядный код, позволяющий увеличить производительность приложений;
  • особые классы для создания распределенных приложений;
  • полная переносимость кода между платформами Windows (Windows 3.x, Windows 95, Windows NT (Intel), Windows NT (Alpha)), основными платформами Unix (Sun Solaris, AIX, Digital Unix) и MacOS;
  • открытая интеграция с популярными системами управления версиями (PVCS, Endevor, LBMS), а также собственная система - ObjectCycle;
  • поддержка динамических библиотек (DLL);
  • поддержка динамического обмена данными (DDE), объектного встраивания и связывания (OLE 2.0), управляющих элементов OLE (OCX), автоматических OLE-клиентов (OLE Automation), а также возможность создания автоматических OLE-серверов;
  • поддержка управляющих элементов ActiveX (переименованной технологии OLE) для построения Internet-приложений;
  • поддержка импорта и экспорта файлов наиболее популярных форматов (Text, Excel, DBF, WMF, WKS...);
  • обширная справочная система.
  • Давайте поближе рассмотрим PowerBuilder 5.0 в трех его аспектах - объектно-ориентированной направленности, открытости и многоплатформенности.

Реализация объектно-ориентированного подхода

Концепции объектно-ориентированной методологии

Поскольку PowerBuilder является объектно-ориентированной системой, дадим краткое толкование основных терминов и понятий объектно-ориентированного подхода, который включает в себя объектно-ориентированный анализ (object-oriented analysis, OOA), объектно-ориентированное проектирование (object-oriented design, OOD) и собственно объектно-ориентированное программирование (object-oriented programming, OOP). Реальный мир представлен в виде совокупности объектов, взаимодействующих тем или иным образом друг с другом и обладающих различными наборами свойств. Структурный подход, применявшийся до объектно-ориентированного подхода, "заставлял" отделять данные от действий, оперирующих этими данными. В результате получались системы, которые было сложно поддерживать и нелегко модифицировать. Объектно-ориентированный подход позволяет сопоставить объекты реального мира классам и объектам системы программирования, а их свойства и действия - атрибутам и методам этих классов. Такой подход позволяет избавиться от промежуточных "системных" преобразований и обеспечивает ряд преимуществ, а именно:

  • устойчивость к изменениям;
  • гибкость;
  • повторное использование кода и, вследствие этого, высокую скорость разработки;
  • совместимость с системами клиент-сервер;
  • улучшенное взаимодействие между объектами.

PowerBuilder является истинной объектно-ориентированной системой - и поэтому он в полной мере обладает этими преимуществами.

Итак, что же такое объект? Объект - это особый опознаваемый предмет (блок или сущность), имеющий важное функциональное назначение в данной предметной области. Класс - это множество объектов, связанных общностью структуры и поведения. Таким образом, объект всегда является экземпляром какого-либо класса. Каждый класс обладает набором атрибутов, характеризующих его свойства и состояние, и набором операций (методов), с помощью которых он воздействует на другие классы или изменяет свое состояние. В событийно-управляемых средах классы могут "откликаться" на ряд предопределенных событий, инициируемых системой или пользователем (эти события также относятся к методам классов), и посылать различные сообщения. Между классами (и объектами) существуют различные виды отношений - отношения использования, отношения включения, отношения наследования. В PowerBuilder разработчик имеет возможность создавать каждый из этих элементов, просто используя среду разработки, включающую в себя различные мастерские. Более того, поскольку PowerBuilder базируется на объектно-ориентированных принципах, все эти конструктивные блоки создаются как бы "за сценой", независимо от того, специально ли вы разрабатываете объектно-ориентированное приложение или нет. Если ваша цель состоит в разработке именно объектно-ориентированного приложения, PowerBuilder имеет возможность использовать различные виды полиморфизма (способности экземпляра класса допускать различные типы, или возможности манипулировать экземплярами без знания их типов), а именно: операционный полиморфизм и полиморфизм включения, а также инкапсуляцию (заключение данных и поведения в единый программный модуль).

Анатомия классов PowerBuilder

Приложение PowerBuilder является коллекцией взаимодействующих объектов. Эти объекты, в общем случае, являются экземплярами нескольких различных классов: Application, Window, Menu, Transaction и т. д. На рисунке 1 представлен верхний уровень иерархии классов PowerBuilder, на котором отображены классы, составляющие основу визуального интерфейса пользователя с приложением.

Picture 1

Рисунок 1.
Верхний уровень иерархии классов PowerBuilder включает в себя предков для всех визуальных и невизуальных классов.

Родоночальником всех классов Power-Builder является класс PowerObject. От него наследуются классы Application, Func-tion_Object, GrAxis, GrDispAttr, непосредственно имеющие экземпляры в приложении, а также абстрактные классы GraphicObject, NonVisualObject и Structure, у которых имеется развитая иерархия классов-наследников. Например, класс GraphicObject представляет собой основу всех визуальных классов - Menu, Window и WindowObject. От этих классов путем наследования разработчик получает свою иерархию, которая позволяет ему реализовать потребности конкретного приложения и строить более общие оболочки. Menu и Window - это классы, от которых наследуются все пользовательские меню и окна (по команде New в соответствующих мастерских). Кроме того, для создания классов, являющихся наследниками уже существующих абстрактных или конкретных классов, разработчик может воспользоваться механизмом визуального наследования. Для этого следует использовать команду Inherit. От класса WindowObject наследуются классы, которые реализуют все внутренние механизмы интерфейса пользователя: Draw-Object, DragObject и MDIClient. Класс Draw-Object конкретизируется в классах, "отвечающих" за рисование графических примитивов (Line, Oval, Rectangle, RoundRectangle). Класс DragObject конкретизируется в классах, осуществляющих работу с элементами управления (CheckBox, CommandButton, DataWindow control, DropDownListBox, Graph, GroupBox, HScrollBar, ListBox, ListView, MultiLineEdit, OmControl, Picture, RadioButton, RichTextEdit, SingleLineEdit, Statictext, Tab, TreeView, UserObject control, VScrollBar). Если спускаться еще ниже по этой ветви иерархии, то мы обнаружим классы PictureButton, DropDown PictureListBox, PictureListBox, EditMask, OLECustomControl и OLEControl, которые являются наследниками второй очереди от соответствующих "родителей". Класс MDIClient представляет собой область внутри внешней "рамки" (MDI frame), в которой отображаются все дочерние окна при использовании стандарта MDI ("многодокументный интерфейс").

Абстрактный класс NonVisualObject является "родителем" всех невизуальных классов, служащих для разработки бизнес-логики приложения и управления системными ресурсами. К ним относятся такие классы, как ConnectObject, CPlusPlus, DataStore, Mail-Session, Message, PipeLine, RemoteObject, Tran-saction и др.

Полное рассмотрение иерархии классов PowerBuilder - тема отдельной статьи, поэтому укажем лишь, что эта иерархия доступна через новый консолидированный Object Browser, который позволяет просматривать не только наименования классов и их положение в иерархии, но и информацию об их атрибутах, событиях и функциях.

Библиотека классов PowerBuilder Foundation Class Library

В развитие объектно-ориентированного подхода к построению приложений, Power-Builder 5.0 включает в себя новую библиотеку классов, пришедшую на смену Application Library, - PowerBuilder Foundation Class Library (PFC). PFC опирается на существующую иерархию классов PowerBuilder и представляет собой ряд классов (User Objects), которые вы можете настраивать и использовать в разработке собственных классов при построении приложений.

PFC поддерживает три базовых принципа объектно-ориентированного подхода - наследование, инкапсуляция и полиморфизм, причем в последнем случае - оба вида полиморфизма (операционный полиморфизм, когда в отдельных, не связанных классах определены методы с одинаковыми именами; и полиморфизм включения, когда для различных классов в цепочке иерархии определены методы с одинаковыми именами, но с различным числом аргументов и различными возвращаемыми значениями). В случае использования полиморфизма включения широко применяются механизмы "перезаписи" функций (function overriding) и "перегрузки" функций (function overloading).

PFC использует передовую методологию написания кода и реализована в виде логически связанных типов обработки, называемых сервисами. Сервисная ориентация гарантирует, что ваше приложение будет использовать минимальное количество ресурсов компьютера. В состав PFC включены такие сервисы, как сервис приложений, оконный сервис, файловый сервис, сервис, обрабатывающий даты и времена, строковый сервис, сервис Data-Window, сервис баз данных, а также сервис, связанный с разбором SQL-выражений. Кроме того, каждый из сервисов разделен на два уровня: базовый и расширенный. Как следует из названия, базовый уровень включает в себя базовые, абстрактные классы, от которых наследуются классы, входящие в расширенный уровень. В целях совместимости с последующими версиями рекомендуется модифицировать только классы, входящие в расширенный уровень. Такая сервисная ориентация отражает концепцию делегирования, которая позволяет разбивать главный класс и его реализации на несколько объектных иерархий. При этом PFC использует два типа отношений для делегирования: отношения использования и отношения включения, что соответствует концепции объектно-ориентированного подхода, принятой многими ведущими учеными в данной области (James Rumbaugh, Bertrand Meyer, Peter Coad, Edward Yourdon, Ivar Jacobson).

Например, класс u_dw является предком для всех управляющих элементов DataWindow и включает в себя ряд предопределенных событий, функций и невизуальных пользовательских объектов, реализующих практически все мыслимые варианты действий с данными: фильтрацию, сортировку, поиск, нахождение связей, одновременное обновление нескольких таблиц, работу с буферами и т. п.

На мой взгляд, благодаря своей логичной организации, продуманности деталей и широкому охвату различных сторон создания приложений, библиотека PFC будет играть такую же роль для разработчиков приложений PowerBuilder, как в свое время библиотеки Turbo Vision и Object Windows Library компании Borland или Microsoft Foundation Classes корпорации Microsoft.

Сближение понятий "событие" и "функция"

Не меняя базового смысла понятий "событие" и "функция", создатели PowerBuilder существенно расширили трактовку этих терминов. Теперь события могут иметь аргументы, а функции - не только вызываться непосредственно, но и ставиться в очередь на выполнение. Таким образом, оба эти элемента могут принимать аргументы и возвращать некоторое значение, оба состоят из конструкций языка PowerScript, оба могут быть вызваны и инициированы непосредственно или поставлены в очередь. Для этого синтаксис их вызова приведен к единому общему виду, включающему в себя множество частных случаев:

{objectname.}{type} {calltype}
        {when} functionname 
        ({argumentlist})

где objectname - имя объекта, в котором определены функция или событие (или имя наследника этого объекта); type - ключевое слово, указывающее, что, собственно, вызывается - FUNCTION (значение по умолчанию) или EVENT; calltype - ключевое слово, определяющее тип вызова - STATIC (значение по умолчанию), когда проверка адресов производится во время компиляции, или DYNAMIC, когда проверка адресов производится во время выполнения; when - ключевое слово, указывающее, должны ли функция или событие выполняться немедленно (TRIGGER, значение по умолчанию) или по завершении выполнения текущего скрипта (POST); functionname - имя объектной функции или события; argumentlist - значения, которые вы хотите передать вызываемой функции или событию.

Например, два вызова функции wf_calculate эквивалентны, поскольку используются значения по умолчанию:

Parent.FUNCTION STATIC TRIGGER 
        wf_calculate( )
Parent.wf_calculate( )

Следующий пример показывает, как поставить в очередь на выполнение событие DoubleClicked текущего управляющего элемента:

This.EVENT POST DoubleClicked 
        (xpos, ypos, row, dwo)

Таким образом, разработчик имеет возможность выбора: старый способ инициирования событий (через CALL или через функции TriggerEvent и PostEvent) и новый - равноправны, что обеспечивает совместимость со всеми старыми разработками.

Новые классы для распределенных приложений

Как уже упоминалось, одним из наиболее примечательных новшеств пятой версии PowerBuilder явилось введение специальных классов, обеспечивающих практическое разделение приложения на части.

Распределенная обработка - это естественный результат развития сетевых вычислительных систем, работающих в клиент-серверной архитектуре, в которой традиционная двухуровневая разработка и сопровождение сложных приложений сталкиваются со значительными трудностями, особенно для больших организаций. Очень часто бизнес-логика приложения реализуется на каждой клиентской машине, что делает процесс поддержания частей приложения в согласованном состоянии весьма трудоемким. То же самое можно сказать относительно надежности всего приложения и авторизации доступа. При росте числа клиентов, имеющих одновременное соединение с сервером баз данных, возрастает нагрузка на сеть, хотя, во многих случаях, запросы клиентов "пересекаются" друг с другом. Кроме того, необходимость иметь реализацию всей бизнес-логики приложения на каждой клиентской машине приводит к концепции "сильного клиента", а это, в свою очередь, ведет к повышению требований к аппаратной части клиента.

Picture 2

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

Распределенная обработка решает многие проблемы, связанные с построением клиент-серверных приложений. Разрешая приложению распределять свои "функции" между различными узлами сети, в частности между клиентами и сервером, распределенная вычислительная среда предлагает естественный способ для отделения пользовательского интерфейса от бизнес-логики приложения. Централизация бизнес-логики на сервере приложения позволяет значительно уменьшить сетевой трафик, уменьшить нагрузку на машину клиента, а также управлять доступом к информации. В распределенной вычислительной среде клиентские приложения изолированы от внутренних изменений, производимых в бизнес-логике, реализованной на сервере. Аналогично, на бизнес-логику не влияют изменения пользовательского интерфейса, совершаемые в клиентских приложениях.

Распределенная вычислительная среда в PowerBuilder 5.0 может быть реализована как с использованием технологии удаленной работы с OLE, так и с применением собственного набора классов. Именно второй подход представляет наибольший интерес, поскольку позволяет организовать распределенную обработку с наименьшими затратами ресурсов и более простым способом.

Распределенная вычислительная среда PowerBuilder использует сервисы двух раздельных приложений, расположенных на различных компьютерах:

  • приложение-сервер;
  • приложение-клиент.

Как правило, приложение-клиент управляет всеми взаимодействиями с пользователем, в то время как приложение-сервер обеспечивает фоновый сервис для клиента. Физическое расположение компонентов приложения прозрачно для пользователя. Обеспечивая фоновый сервис для одного или нескольких клиентов, приложение-сервер может также функционировать как клиент. Другими словами, приложение-сервер может взаимодействовать как клиент с другим приложением-сервером, которое, в свою очередь, может быть клиентом для другого сервера - и т. д.

Рассмотрим строение приложения-сервера. Приложение-сервер имеет два главных компонента (рисунок 3):

  • удаленные объекты;
  • объект Transport.

Picture 3

Рисунок 3.
Приложение-сервер включает в себя один или несколько удаленных объектов и объект Transport.

В распределенном приложении клиент может вызвать сервис, предоставляемый так называемыми удаленными объектами (Remote objects). Удаленный объект - это экземпляр невизуального настраиваемого пользовательского класса (custom class user object), расположенный на удаленном сервере. Клиент может вызвать методы (функции и события), связанные с удаленным объектом, точно таким же образом, как если бы они были определены для локального объекта. Например, очень удобно в качестве удаленного объекта для операций с данными использовать объект DataStore, представляющий собой невизуальный вариант управляющего элемента DataWindow и обладающий всей его функциональностью. Класс DataStore был введен в PowerBuilder 5.0 прежде всего с целью использования его в распределенных приложениях.

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

Класс Transport, являющийся потомком класса ConnectObject, предоставляет возможность приложению-серверу устанавливать соединения с приложениями-клиентами и обрабатывать запросы клиентов на выполнение сервисов. Атрибуты объекта данного класса обеспечивают приложение PowerBuilder всей необходимой информацией. Например, этот объект может идентифицировать приложение-сервер и коммуникационный драйвер для связи, а также задать способ передачи информации по сети.

Обратимся теперь к приложению-клиенту. Приложение-клиент состоит из трех главных компонентов (рисунок 4):

  • пользовательский интерфейс;
  • объект Connection;
  • Proxy-объекты.

Picture 4

Рисунок 4.
Приложение-клиент включает в себя пользовательский интерфейс, один или несколько Proxy-объектов и объект Connection.

Пользовательский интерфейс содержит в себе все окна и меню, а также методы, необходимые для взаимодействия пользователя с приложением. Экземпляр класса Connection, являющегося потомком класса ConnectObject, предоставляет возможность клиенту связываться с приложением-сервером и запрашивать необходимый сервис. Например, этот объект может задать приложение-сервер, компьютер, на котором находится приложение-сервер, и коммуникационный драйвер для связи. Кстати, о драйверах. PowerBuilder обеспечивает несколько коммуникационных драйверов.

  • WinSock, осуществляющий связь по протоколу TCP/IP через Windows Socket;
  • NamedPipes, осуществляющий связь через Named Pipes;
  • OpenClientServer, осуществляющий связь через интерфейс Sybase Open Client/Server;
  • Local, позволяющий распределенным приложениям выполняться локально (это удобно, в частности, для отладки).

Наибольший интерес представляют Proxy-объекты. Каждый удаленный объект, содержащийся в приложении-сервере, имеет соответствующий Proxy-объект в приложении-клиенте. Другими словами, Proxy-объект является как бы отображением удаленного объекта на локальный компьютер, позволяющим манипулировать удаленным объектом так, как будто он сохранен локально. Таким образом, вся работа с серверными объектами осуществляется через Proxy. Proxy не является типом - это лишь общее название локального отображения удаленных объектов. В противоположность удаленным объектам, с которыми связаны объекты Proxy, эти локальные объекты сами по себе не имеют никаких методов. Они не могут также непосредственно редактироваться. Для изменения определения Proxy-объекта необходимо редактировать соответствующий удаленный объект. После того как в среде PowerBuilder задано соответствие удаленного объекта и Proxy (т. е. указано его имя), PowerBuilder генерирует код для внутреннего определения Proxy-объекта, который и делает возможным использование удаленного объекта. Вот, например, как выглядит использование Proxy-объекта po_customer:

This.EVENT POST DoubleClicked 
        (xpos, ypos, row, dwo)

Первая часть данного примера создает экземпляр класса Connection и устанавливает связь через драйвер WinSock с сервером MyServer, находящемся на компьютере Eugene, с использованием функции ConnectToServer. Вторая часть примера принимает значение строки редактирования sle_customer, инициирует Proxy-объект po_customer на клиентской машине и удаленный объект на сервере (вызовом функции SetConnect), а затем вызывает метод удаленного объекта compute_max путем ссылки на Proxy, передавая ему в качестве параметра принятое значение строки редактирования.

Таким образом, разработчик, используя новый состав классов PowerBuilder, имеет возможность создавать приложения, распределенные по узлам сети. Частным случаем такого распределения является возможность создавать серверы приложений, управляющие работой множества клиентов и осуществляющие связь с базой данных непосредственно или через Web.

Открытость

Рассмотрим теперь другой важный аспект PowerBuilder - открытость. Принцип открытости, заложенный создателями PowerBuilder еще в ранних версиях, полностью себя оправдал - и поэтому в пятой версии он получил дальнейшее развитие. На мой взгляд, целесообразно отдельно рассмотреть характеристики языка и особенности среды.

Открытость языка

Напомним, что язык PowerScript является языком четвертого поколения. Однако он включает в себя многие возможности языков третьего поколения, что делает его мощным и гибким. Открытости языка способствует возможность создавать:

  • пользовательские объекты (user objects);
  • пользовательские функции (user functions);
  • пользовательские события (user events).

Все эти категории сущностей могут быть написаны как на языке PowerScript, так и на языке С++, а также на любом другом языке, способном генерировать динамические библиотеки DLL. Это обеспечивается тем, что в языке PowerScript имеется возможность декларировать внешние функции, находящиеся в динамических библиотеках, и вызывать их как свои собственные. С языком С++ связь гораздо более тесная. Используя PowerBuilder, программисты получают полный доступ к библиотекам классов С++ (Watcom C/C++, Optima++) и могут:

  • создавать функции С++ внутри Power-Builder;
  • генерировать код С++ из PowerBuilder;
  • получать доступ к функциям С++ из PowerBuilder.

Благодаря механизму декларирования внешних функций имеется возможность вызова функций Windows API и Windows SDK (на Windows-платформах) и передачи им информации через функцию Handle и класс Message. Эти возможности в пятой версии усилены за счет введения новых ключевых слов и конструкций языка.

В PowerBuilder встроена почтовая система Microsoft MAPI, благодаря чему можно легко создавать приложения, работающие с почтой и обеспечивающие обмен информацией с удаленными пользователями. Кроме того, имеется ряд функций для работы с реестром Windows 95 и Windows NT.

Чрезвычайно важной для создания гибких динамичных программ представляется возможность доступа к информации времени выполнения (RTTI) - через функции ClassName, TypeOf, а также через переменные This, Parent, ParentWindow, Super.

Большую пользу разработчикам, создающим современные приложения, принесет возможность обмена информацией созданных ими приложений с "внешним миром" при помощи механизмов DDE и OLE Custom Controls (OCX) - на Windows-платформах, разумеется. О поддержке механизма OLE заявили уже некоторые производители Unix-платформ. Объект OLE Custom Control представляет собой объект с оперативными возможностями активации, имеющий три набора атрибутов: свойства, события и методы. PowerBuilder теперь имеет возможность генерировать не только OLE-контейнеры, но и OLE-серверы. Таким образом, любое приложение, поддерживающее OLE Automation, может создать у себя экземпляр данного объекта и получить доступ к его свойствам или вызвать его методы.

С помощью OCX (ActiveX) PowerBuilder имеет возможность создавать собственные реализации, встраиваемые в Netscape (applets). При этом страничка Web становится окном PowerBuilder с полной его функциональностью. Но об этом - чуть ниже...

Упомяну еще об одной важной возможности, способствующей открытости - интернализации. PowerBuilder "умеет" использовать различные кодировки, поддерживает Unicode, ориентацию справа-налево и соответствующее выравнивание. Это позволяет создавать легко локализуемые приложения.

Открытость среды

Обратимся теперь к характеристикам среды, отвечающим парадигме открытости. Во-первых, это возможность работы с любыми СУБД, поддерживающими стандарт ODBC, а также наличие прямых драйверов для связи со всеми крупнейшими СУБД (Oracle, Sybase, Informix, MS SQL Server, Progress, DB2 и т. д.). В новую версию включены высокопроизводительные 32-разрядные драйверы, но в то же время поддерживаются и 16-разрядные. Во-вторых, наличие репозитория, в котором хранятся так называемые расширенные атрибуты полей (форматы редактирования, форматы отображения, правила валидации, дополнительные выражения). Репозиторий может быть размещен не только в штатно поставляемой вместе с PowerBuilder СУБД Sybase SQL Anywhere (кстати, полностью совместимой с Sybase SQL Server 11 и с Sybase Replication Server 11), но и в других СУБД, выбранных по желанию разработчика. Структура репозитория открыта и хорошо документирована - это позволяет работать с ним не только из среды PowerBuilder, но и с помощью других средств. С выходом нового визуального инструментария Optima++, основанного на языке С++, появилась возможность разделять (share) объект DataWindow, осуществляющий всю работу с данными в PowerBuilder, между PowerBuilder и Optima++. Это позволяет создавать еще более эффективные приложения в более сжатые сроки. Важную роль для обмена информацией с другими СУБД играет новый интеллектуальный объект Data Pipeline, упрощающий миграцию данных как на уровне языка, так и на уровне среды.

Имеется также программный интерфейс к библиотекам PowerBuilder - ORCA (Open Repository Case API). Сейчас этот программный интерфейс чаще называют просто - Open Library API. Он используется не только для связи CASE-средств (например S-Designor или ERwin/ERX) с библиотеками PowerBuilder, но и служит "мостиком" для доступа ко всем внутренним объектам библиотек. Известны реализации работы с библиотеками PowerBuilder, например, из Delphi. PowerBuilder имеет интерфейсы к наиболее популярным средствам коллективной работы (в частности PVCS компании Intersolv), и в то же время в PowerBuilder 5.0 Enterprise входит собственная универсальная система контроля версий ObjectCycle. Кроме того, для участников программы CODE (Client/server Open Development Environment) доступны интерфейсы всех внутренних модулей PowerBuilder, что позволяет им встраивать свои собственные средства в среду PowerBuilder. Вообще, PowerBuilder имеет возможность работать с большим количеством средств третьих фирм (СУБД, генераторы отчетов, распределенная обработка, CASE, библиотеки классов, графика, текстовые процессоры, звук, видео, генераторы прототипов, системы автоматического тестирования). Еще раз упомяну о великолепной совместимости с CASE-средством S-Designor, позволяющем не только моделировать информационные потоки и проектировать структуру базы данных, но и генерировать приложения Power-Builder 5.0.

Усовершенствования DataWindow

В PowerBuilder 5.0 значительно обновлен основной объект для работы с базами данных - DataWindow. Улучшен "интерьер" самой мастерской DataWindow, упрощена и стала более логичной работа в DataWindow. Увеличена производительность при выборке, вставке и модификации данных за счет дополнительных интеллектуальных механизмов. Упрощена работа с SQL, в том числе и с встроенным SQL. Язык PowerScript сейчас поддерживает прямое манипулирование объектами внутри DataWindow, включая автоматизацию OLE-контейнеров. В дополнение к имевшимся девяти стилям представления данных DataWindow (Grid, Tabular, FreeForm, Group, N-Up, Label, CrossTab, Composite, Graph) появились два новых: OLE 2.0 и Rich Text. Именно они обеспечивают открытые механизмы взаимодействия приложения PowerBuilder с внешней средой. Стиль представления OLE 2.0 позволяет непосредственно использовать поля таблиц, которые содержат OLE-данные, с активацией OLE-серверов через механизм автоматизации OLE. Стиль представления Rich Text представляет собой полноценный текстовый редактор в формате RTF. Его ценность - не столько в том, что он позволяет создавать свои текстовые процессоры, сколько в том, что с его помощью можно осуществлять слияние информации, находящейся в базе данных, с прекрасно оформленным шаблоном. Эта возможность весьма полезна, например, при рассылке факсов заказчикам вашей фирмы...

Поддержка Internet

Вышедший во втором квартале 1996 г. релиз PowerBuilder 5.0 позволял использовать два подхода для построения Internet-приложений: статический и динамический.

Статический подход подразумевает использование возможности сохранять содержимое DataWindow в формате HTML. Этим механизмом можно воспользоваться как в среде разработки, так и в run-time. Для этого в среде разработки используется команда Save Rows As (в режиме просмотра результатов), в run-time применяется функция класса DataWindow control - SaveAs:

dwcontrol.SaveAs(filename, saveastype, colheading)

где filename - имя файла, куда сохранять; saveastype - тип сохраняемого файла (в данном случае - HTMLTable!); colheading (необязательный параметр) - булево значение, определяющее, следует ли включать заголовки столбцов DataWindow в начало файла (по умолчанию - TRUE).

Для задач периодической публикации статических данных в Internet такой подход позволяет легко создавать HTML-страницы и размещать в них отчеты любой сложности без знания языка HTML. При этом для работы с такими данными на компьютере-клиенте не требуется устанавливать среду PowerBuilder - достаточно одного лишь Web-браузера.

Динамический подход основан на использовании управляющих элементов ActiveX различных фирм (в том числе и Sybase), реализующих богатые возможности просмотра, навигации и т. п. для Web. В начальном релизе доступен управляющий элемент ActiveX - WebViewer подразделения Visual Components корпорации Sybase. Он позволяет осуществлять просмотр и навигацию для узла Web. Используя WebViewer, разработчик может кодировать пользовательские события, способные автоматически инициировать извлечение информации из Web. В дополнение к управляющему элементу WebViewer, разработчики могут использовать управляющие элементы для передачи файлов (FTP, HTTP и др.), подсоединения клиент-серверных приложений к Web-серверам, управления поведением стандартных браузеров, таких как Netscape Navigator и Microsoft Internet Explorer и т. п. Кроме того, доступен также ActiveX-компонент Formula One/NET, представляющий собой Internet-реализацию Excel-совместимой электронной таблицы.

В настоящее время доступен пакет дополнений, включающий в себя кроме указанных выше возможностей следующие:

DataWindow Plug-in - для отображения корпоративных отчетов в Internet;

Window Plug-in - для запуска приложений PowerBuilder в Web-браузере;

Web.PB - для построения серверов приложений, работающих с любым Web-сервером.

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

DataWindow Plug-in позволяет отображать на Web-странице файл Powersoft Report (PSR), который может быть просмотрен с использованием Netscape Navigator или Microsoft Internet Explorer версии 3.0. Созданный в PowerBuilder или InfoMaker отчет вы можете сохранить в виде PSR-файла с учетом форматов представления данных, который затем и помещается на HTML-страницу командой EMBED языка HTML (my_report.psr - имя PSR-файла с данными):

Window Plug-in является очень мощной технологией для переноса клиент-серверных приложений в Internet. Window Plug-in позволяет выполнять приложения PowerBuilder в браузере Netscape (или в любом браузере, поддерживающем Netscape Navigator Plug-in - как, например, Microsoft Internet Explorer версии 3.0). Это означает, что вы имеете возможность открыть дочернее окно PowerBuilder, в котором допускается размещение любых элементов управления PowerBuilder, таких как кнопки, списки, графики, строки редактирования, Tab-странички, деревья, OLE-объекты и т. п. Приложение может использовать технологию DataWindow для соединения с базой данных через "родные" драйверы или через драйверы стандарта ODBC. Более того, Window Plug-in может взаимодействовать с распределенными частями приложения, располагающимися на различных платформах - например на Unix или Windows NT. Такое окно PowerBuilder содержится в динамической библиотеке PowerBuilder (pbd или dll) на Web-сервере и загружается Web-браузером с помощью следующей команды:

Здесь my_windows.dll - имя динамической библиотеки PowerBuilder, содержащей дочернее окно w_detail. Таким образом, разработчик получает возможность выполнять стандартные дочерние окна PowerBuilder внутри Web-браузера, что устраняет необходимость написания HTML-кодов и CGI-программ. Кроме того, устраняются ограничения HTML по пользовательскому интерфейсу и имеется возможность использовать богатейшую функциональность DataWindow.

Web.PB - это совершенно новая технология, позволяющая создавать распределенные приложения с использованием Web-сервера. Web.PB обеспечивает доступ любого Web-браузера к ресурсам сервера приложений PowerBuilder. Такая методология использует полную функциональность PowerBuilder, включая DataWindow, огромные возможности языка PowerScript и объектно-ориентированный подход для построения распределенного приложения. Созданный разработчиком сервер приложений имеет возможность динамически, "на лету", генерировать HTML-страницы и посылать их Web-браузеру через Web-сервер. При этом могут использоваться протоколы CGI, NSAPI или ISAPI (см. рисунок 5). Такой подход полностью соответствует архитектуре тонкого клиента, где единственным требованием к клиентскому компьютеру является наличие Web-браузера. Данная схема обеспечивает полный доступ из браузера к атрибутам и методам любых невизуальных объектов на сервере приложения, вплоть до передачи аргументов.

Picture 5

Рисунок 5.
Архитектура Web.PB связывает сервер приложений, построенный с помощью PowerBuilder, с Web-сервером и, далее, через него - с Web-броузером.

По информации от разработчиков Power-Builder, в следующей, шестой, версии, работе с Internet будет уделено еще более пристальное внимание.

Многоплатформенность

Многоплатформенность - это традиция PowerBuilder, начавшаяся с четвертой версии. Уже эта версия обладала совместимостью на уровне кода для Windows 3.x, Unix (Sun Solaris, AIX) и MacOS. Версия 5.0 доступна на всех Windows-платформах (Windows 3.x, Windows 95, Windows NT (Intel), Windows NT (Alpha)), на основных Unix-платформах (Sun Solaris, AIX, Digital Unix), а также на платформе MacOS. Такая доступность продукта на большом числе платформ и операционных систем дает разработчикам уникальную возможность создавать легкие, открытые, переносимые, масштабируемые приложения. Это приобретает особую актуальность в распределенной вычислительной среде, поскольку не обременяет заказчика необходимостью соблюдать однородность в выборе платформ. А в наш век разнообразия вычислительной техники это - согласитесь - немаловажное обстоятельство...

Заключение

Подводя итог всему сказанному, хотелось бы еще раз акцентировать внимание читателя на тех новшествах, которые были введены в пятую версию PowerBuilder. Обычно компании-разработчики приводят десятку лучших черт своих продуктов. Последуем такой традиции и мы. Итак, горячая десятка PowerBuilder 5.0.

  • 32-разрядный быстрый компилятор в машинный код.
  • Генерация распределенных приложений.
  • Новая библиотека классов PowerBuilder Foundation Class Library.
  • Расширенная поддержка OLE 2.0 (ActiveX).
  • Поддержка GUI Windows 95 (и не только на самой Windows 95!).
  • Наличие средства многоверсионной групповой разработки ObjectCycle.
  • Новый DataWindow.
  • Новый консолидированный объектный браузер Object Browser.
  • Значительно улучшенный редактор языка PowerScript.
  • Генератор дистрибутивов Install Builder.

Евгений Шадрин,
системный аналитик
Glencore International AG Moscow
тел.: (095) 258-2100,
e-mail: eug@glencore.msk.ru