СТАТЬЯ
19.12.01

Объектно-ориентированное программирование в CTD - мощный инструмент для базы типовых проектных решений при построении информационных систем

© С. А. Большаков

В данной статье дано краткое описание особенностей объектно-ориентированного программирования (ООП) на базе популярных средств разработки информационных систем CTD2000 - Centura Team Developer 2000. ООП в CTD обеспечивает необходимый профессионализм программных проектов, высокий уровень взаимозаменяемости и основу для создания типовых проектных решений при разработке и реализации информационных систем самой высокой сложности. Надеемся, что данный материал позволит создать правильное представление о возможностях программного продукта и выбрать его для решения своих задач в сфере информационных технологий.

Введение

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

Стандартные и пользовательские классы, и создаваемые на их базе объекты (визуальные и интерфейсные), предназначены для повышения технологичности процесса создания информационных систем, упрощения процесса их сопровождения и построения библиотек типовых проектных решений для дальнейшего применения. Фирма Centura/Gupta во всех своих решениях, о чем я говорил и в других статьях, и здесь нашла компромисс ("золотую середину") между сложностью использования и широкими возможностями ООП. Несмотря на наличие всех теоретических атрибутов ООП (наследование, инкапсуляция и полиморфизм) найдены конструктивно простые решения, которые позволяют эффективно применять эти механизмы, как пользователю новичку, так и опытному программисту, причем последний будет обладать всеми необходимыми средствами для решения любых поставленных задач. Это достигается, в частности, за счет того, что проведено предварительное разделение классов по типам (выделены: функциональные, оконные и дочерние классы - см. ниже), а также используется структуризация описаний классов и объектов.

Основы ООП в CTD

Язык SAL и система разработки CTD поддерживают все типовые механизмы ООП:

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

Классы CTD и их типы

Следствием специализации в CTD стало выделение трех типов классов:

Все классы приложения описываются в разделе глобальных описаний (Global Declarations - Class Definitions), что показано в примере ниже на фрагменте OUTLINE:

В данном примере описаны (подробное описание скрыто): функциональный класс - cls1; оконные классы соответствующих подтипов - clsMDIFrame1, clsDataEntryForm и clsDlgStandard; дочерний оконный класс - clsDatabaseField и главный оконный класс - clsAbstract. Специализация типов классов в CTD позволяет упростить описание интерфейса и применение механизмов наследования. В частности: новый ОК может создаваться только на базе уже описанного ГОК или другого ОК. Можно также для включения новых функций использовать и ФК.

Описание класса в CTD

Описание класса в CTD структурировано и зависит от типа класса. Ниже приведено описание ОК типа Form Window Class (оконные классы имеют множество стандартных подтипов):

Имя класса задается в заголовке (clsDBWindow), в дальнейшем оно используется для описания и создания объектов данного класса. Раздел Derived From определяет список базовых классов для наследования. В части Menu, Tool Bar и Contents определяются известные для SAL элементы описания окна. В разделе Class Variables задаются переменные класса, а разделе Instance Variables задаются индивидуальные переменные каждого экземпляра объекта данного класса. В части Functions и Message Actions задаются функции-методы класса и обработчики сообщений. Для стандартных типов классов структуризованное содержание может отличаться.

Наследование классов в CTD

Различают следующие виды наследования:

При наследовании порожденный класс "впитывает" в себя все функции и обработчики сообщений из базовых классов. Пример множественного наследования показан ниже:

Пример множественного наследования для класса cDesktopListBox. Он наследуется от классов cOutline и cListBoxExtension. К сожалению, ограниченные рамки данной статьи не позволяют показать все возможности и особенности наследования в CTD.

Перегрузка функций и событий

Перегрузка функций и событий подразумевает использование в классе наследнике возможности изменения алгоритмов заложенных в функции или реакции на сообщения (события). В CTD, однако, существует еще дополнительная возможность перегрузки функций и событий: в самом объекте при его описании (оно тоже структурировано на основе структуры используемого класса) также можно выполнить перегрузку, задав новую реакцию на такое же сообщение (messages actions) или задать функцию с тем же именем, что и в классе.

Кроме того, обеспечивается возможность совместного выполнения базовой функции и перегруженной, за счет явного вызова функции класса и передачи сообщения для обработки в классе (последнее выполняется за счет SALSendMessage). Ниже приведен пример простой перегрузки реакции на сообщение.


Из данного описания видно, что для объекта dfObect реакция на сообщение SAM_Validate перегружена, и для работы используется новый код, указанный в реакции объекта. При необходимости с помощью квалифицированной ссылки можно вызвать и первоначальный обработчик из класса.

Области видимости переменных объектов и классов

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

Ссылка на переменную объекта может быть выполнена через класс и указатель на окно:

Ссылка на переменную объекта может быть выполнена и через объект:

Переменные класса являются общими для всех объектов класса и могут разделяться всеми объектами этого класса, они представляются в единственном экземпляре (это аналог статического атрибута класса). Пример описания таких переменных дан ниже:

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

Если обьект может получать значения (например, поле данных в окне), то можно воспользоваться стандартной переменной - MyValue. Она должна использоваться, так как в классах недоступны имена будущих объектов. Поэтому нужно писать:

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

Так как переменная df1 еще не известна при описании класса.

Функциональные классы - ФК

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

Переменные класса (Class Variables) разделены между всеми создаваемыми объектами классов. Функции класса (Functions) доступны только при создании объекта класса. Переменные объектов (Instance Variables) непосредственно представляют данные объекта. ФК могут быть базовыми для других ФК или для оконных классов и для ГОК. В последнем случае будут наследоваться и функции класса и переменные.

Оконные классы ОК и главные оконные классы

Оконный класс является стандартным классом WINDOWS. Он может быть базовым для другого оконного класса (причем, типы оконных классов должны совпадать) и быть наследником ФК. Пример описания ОК был уже приведен выше. В отличие от ФК в нем присутствует раздел описания реакций на сообщения - Message Action, в котором описываются действия при поступлении сообщений к данному объекту (SAM_*). Типы оконных классов: формы, MDI формы, таблицы данных, окна диалога, дочерние классы (все стандартные типы объектов).

В SAL предусмотрено создание главных оконных классов (General Window Class). От ОК эти классы не обязательно представляют визуальные объекты, однако могут обрабатывать сообщения. Пример описания ГОК приведен ниже:

ГОК может быть базой для другого ГОК и для ОК. Он похож на ФК, но в отличие от него может обрабатывать сообщения и события. ГОК может наследоваться от ФК, но не может быть для него базовым. Создавать объекты на основе ГОК нельзя. ГОК обеспечивает множественное наследование в цепочках классов. Можно наследовать от него ОК и только потом создавать объекты. Главные оконные классы используются как вспомогательные для иерархического наследования. В общепринятом смысле это абстрактные классы.

Подключение классов в приложение (APL)

Классы можно описать непосредственно в приложении в разделе глобальных описаний Classes. Классы могут быть описаны в любом порядке. Можно подключать классы также из библиотек - APL (APD). В этом случае CTD автоматически их располагает в нужных разделах, причем распределяются все части библиотек. Библиотека может быть создана в среде CTD или сгенерирована с помощью АХ Explorer. Библиотека подключается в глобальном разделе описания, например:

В данном случае библиотека классов интерфейса (Visual Toolchest) подключается в программу, а все классы, описанные в ней, автоматически переносятся в раздел классов - Classes.

Создание и описание объектов

В зависимости от типа класса объекты могут быть описаны разных разделах программы. Объекты функциональных классов могут быть описаны в любом разделе типа Variables (глобальном, окна, функции, параметров функции и окна). Объекты классов, созданные на основе ОК общего вида (окна, формы, окна диалога) помещаются в разделах Windows глобального описания или создаются динамически с помощью функции SalCreateWindow. Дочерние оконные объекты описываются в разделе Contents оконных объектов общего вида. Общий синтаксис описания и пример приведены ниже.

Синтаксис описания объектов на основе новых классов:

<ClassName>: <ObjectName>

Примеры описания дочерних оконных, функциональных и общих оконных объектов:

При описании объектов ОК становятся доступными все разделы описания, соответствующие данному типу класса. Кроме того, становятся доступными для редактирования общие атрибуты, а если была предусмотрена специальная класс-DLL для редактирования других параметров объекта, то вызываются специальные окна диалога для редактирования свойств объектов данного конкретного класса, которые фиксируются в OUTLINE. Последнее в большей степени характерно для АХ объектов.

Для работы с объектами классов в CTD предусмотрены специальные функции:

Возможности динамического описания окон и дочерних объектов

В CTD нет прямых механизмов динамического создания дочерних объектов окон. В некоторых системах это необходимо для построения динамического интерфейса приложения. Однако существуют приемы, которые обеспечивают такие возможности. Их мы поясним ниже. Объекты же функциональных классов могут создаваться динамически с помощью оператора new. Пример такого создания показан ниже:

Над однородными переменными функциональных классов допустимы также операции присваивания:

Оконные объекты могут быть динамически созданы с помощью известной функции SalCreateWindow. В этом случае достаточно указать тип создаваемого окна. Можно в таком случае создавать несколько экземпляров окон одного и того же типа.

Для обеспечения динамики создания дочерних объектов существует два способа:

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

Далее задача сводится к известной, так как окна можно создавать динамически (см. выше). Последний способ не является изящным, но все-таки является выходом для решения проблемы.

Функции класса

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

Разные варианты вызова функций классов через класс и объекты:

В последнем примере вызов выполняется через текущий объект и для последнего наследника в цепочке, при перегрузке функций. Существуют простые правила определения порядка вызова функций при различных способах наследования классов.

Автоматизация создания классов в CTD

В CTD предусмотрены средства автоматизированного создания новых классов. С помощью Wizards вы можете выбрать базовые классы для нового класса, настроить при необходимости параметры. Серия автоматически вызываемых окон поможет вам это сделать. После завершения автоматизированного создания класса его можно править вручную. Так как при наследовании важен тип новых классов будет автоматически произведена проверка правильности созданного вновь класса.

АХ и СОМ в CTD

В CTD встроены специальные механизмы создания и подключения AX и СОМ объектов. С помощью специальной утилиты (АХ Explorer) вы можете подключить и использовать все объекты, установленные на вашем компьютере. Для создания СОМ объектов и их регистрации также вы можете воспользоваться мастером подсказок, причем генерация описания и всех необходимых новых классов выполняется в автоматическом режиме. Более подробно об использовании этих режимов вы можете узнать в статье на нашем сайте (статья по AX и СОМ на сайте).

Типовые проектные решения на базе ООП

Классы и объектно-ориентированное программирование могут эффективно использоваться для создания системы типовых проектных решений при создании информационных систем самой различной сложности. Я уже отмечал, что CTD (а ранее и SQLWindows) изначально были спроектирована как объектно-ориентированная система программирования. В ее первые версии были включены (и до сих пор используются) библиотеки классов Quick Objects (QO), механизмы построения шаблонов, библиотека Visual Toolchest (VT). Далее при развитии CTD система дополнялась также через наборы и механизмы классов: WEB Developer реализован на их основе; подключены библиотеки доступа к интернет (mail, HTTP и т.д.); реализованы репликации в БД - Replication Agent. Думаю, что дальнейшее развитие CTD будет продолжаться в таком же направлении: подключение новых классов и библиотек их поддерживающих.

Для каждого определенного класса систем могут быть созданы библиотеки и подключены в приложения с помощью интерфейса классов и объектов. Это может быть реализовано в рамках даже небольших фирм, выполняющих проекты по разработке и сопровождению информационных систем. Естественно, первоначальные затраты на разработку типовых проектных решений будут больше, однако следует ожидать быстрой окупаемости при таком подходе. В качестве примеров можно указать создание специальных классов для работы с БД, взаимодействия с интернет, организации динамического интерфейса и формирования выходных документов. Примеры удачного применения типовых решений на базе ОПП в CTD существуют.

Что лучше универсальное и специализированное ООП?

Несомненно, что изложенная в данном материале информация ограничена рамками статьи и не может обеспечить полное представление по использованию ООП в CTD. Кроме того, несомненно, найдутся такие программисты, которым не понравиться подходы к ООП реализованные в продуктах Centura. Я даже ожидаю волну критики тех, кто не очень детально знаком с возможностями продукта. Тем не менее, могу утверждать, что, несмотря на отсутствие полной универсальности в CTD, такой вариант применения ООП является во многом предпочтительным, особенно для случая массового производства информационных систем, необходимости одновременного сопровождения нескольких проектов. С этих позиций считаю, что такой подход к ООП, основанный на специализации во многих случаях более эффективен, чем универсальный. Даже во многих универсальных системах программирования сейчас пытаются разделить описания визуальных и не визуальных объектов, опрощая способы этого описания и наглядность использования ООП. Не буду приводить примеры и называть системы, опасаясь необоснованной критики, хотя уверен, что в ближайшее время во многих системах будут предприняты шаги для упрощения описания классов и объектов для конкретных областей применения.

Заключение

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

Дополнительная информация

P>Дополнительную информацию Вы можете получить в компании Interface Ltd.

Обсудить на форуме Seagate Software
Отправить ссылку на страницу по e-mail


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 19.12.01