Pzl-Компонента: различия между версиями
Строка 2: | Строка 2: | ||
Любой класс, порождающий объекты (имеющий интерфейс), может быть признан компонентой, если | Любой класс, порождающий объекты (имеющий интерфейс), может быть признан компонентой, если | ||
#Имя интерфейса и имя класса различаются; | #Имя интерфейса и имя класса различаются; | ||
#Интерфейс класса поддерживает интерфейс ''pzlComponent''; | #Интерфейс класса поддерживает интерфейс ''pzlComponent''; | ||
#Интерфейс класса включает декларации констант: | #Интерфейс класса включает декларации констант: | ||
Строка 10: | Строка 9: | ||
##''componentMetaInfo_C'' с типом ''core::namedValue*''. | ##''componentMetaInfo_C'' с типом ''core::namedValue*''. | ||
##''сomponentDescriptor_C'' с типом ''pzlDomains::pzlComponentInfo_D''; | ##''сomponentDescriptor_C'' с типом ''pzlDomains::pzlComponentInfo_D''; | ||
#Декларация класса содержит единственный конструктор ''new(object ИспользуемыйОбъект)''; | |||
#Имплементация класса наследует от класса ''pzlComponent''; | #Имплементация класса наследует от класса ''pzlComponent''; | ||
#Пакетный файл деклараций класса (.PH) включает файл ''"System\Packs\pzlcomponent\pzlcomponent.ph".'' | #Пакетный файл деклараций класса (.PH) включает файл ''"System\Packs\pzlcomponent\pzlcomponent.ph".'' |
Версия 10:36, 19 октября 2007
Необходимые условия признания класса pzl-компонентой
Любой класс, порождающий объекты (имеющий интерфейс), может быть признан компонентой, если
- Имя интерфейса и имя класса различаются;
- Интерфейс класса поддерживает интерфейс pzlComponent;
- Интерфейс класса включает декларации констант:
- componentID_C с типом pzlDomains::entityUID_D
- componentAlias_C с типом string
- componentRunAble_C с типом core::booleanInt
- componentMetaInfo_C с типом core::namedValue*.
- сomponentDescriptor_C с типом pzlDomains::pzlComponentInfo_D;
- Декларация класса содержит единственный конструктор new(object ИспользуемыйОбъект);
- Имплементация класса наследует от класса pzlComponent;
- Пакетный файл деклараций класса (.PH) включает файл "System\Packs\pzlcomponent\pzlcomponent.ph".
Ниже приведены фрагменты различных составляющих компоненты, удовлетворяющей перечисленным выше условиям.
Декларация класса содержит коструктор new(...) и имя интерфейса отличается от имени класса. При этом класс содержит единственный конструктор new:(object UsingObject)
class сomponentExample:iComponentExample constructors new:(object UsingObject). end class
Интерфейс класса содержит квалификатор supports pzlComponent и декларацию констант
- componentID_C
- componentAlias_C
- componentRunAble_C=b_True
- componentMetaInfo_C
- componentDescriptor_C
interface iComponentExample supports pzlComponent open core constants componentDescriptor_C:pzlDomains::pzlComponentInfo_D=pzlDomains::pzlComponentInfo ( componentAlias_C, componentID_C, componentRunAble_C, componentMetaInfo_C ). componentID_C:pzlDomains::entityUID_D=pzlDomains::str("ComponentExample"). componentAlias_C="ПримерКомпоненты". componentRunAble_C=b_True. componentMetaInfo_C:namedValue_List=[]. predicates show:(). end interface iComponentExample
Имплементация класса содержать директиву наследования inherits pzlComponent и содержит клаузу для конструктора new(UsingObject)
implement componentExample inherits pzlComponent clauses new(UsingObject):- pzlComponent::new(), ... clauses show():- ... end implement componentExample
Файл деклараций пакета ComponentExample.PH содержит директиву включения файла PzlComponent.ph
#requires ... #include @"System\Packs\pzlcomponent\pzlcomponent.ph" #include @"pfc\core.ph"
Предопределенные константы интерфейса pzl-компоненты
Константа componentID_С
Константа сomponentID_С определяет идентификатор компоненты, который (по-возможности) должен быть уникальным в глобальном смысле. То есть две программы в глобальном информационном пространстве (не говоря уже об одном копьютере), использующие компоненты с одним и тем же идентификатором могут быть уверены, что они используют точно одну и ту же pzl-компоненту. Этого можно добиться, если использовать способ, аналогичный способу, применяемому Microsoft для идентификации COM-компонент. Для этого в pzl-технологии используется структура с функтором uid:
uid( core::unsigned32 Unsigned, core::unsigned16 Short1, core::unsigned16 Short2, core::unsigned8 Byte1, core::unsigned8 Byte2, core::unsigned8 Byte3, core::unsigned8 Byte4, core::unsigned8 Byte5, core::unsigned8 Byte6, core::unsigned8 Byte7, core::unsigned8 Byte8).
что, на самом деле является полным аналогом структуры core::nativeGuid системы Visual Prolog. Идентификатор ComponentID используется в двух случаях:
- Он является идентификатором, под которым в реестре Windows или в файле регистрации приложения записывается регистрационная информация о компоненте
- Он является идентификатором, под которым эта компонента зарегистрирована в pzl-контейнере
Поскольку идентификатор в форме uid является громоздкой последовательностью цифр и букв, то применять его в процессе освоения технологии неудобно. С целью упрощения процесса освоения имеется вторая версия представления идентификатора - строковая - в форме str(string). Естественно, уникальность строкового представления обеспечить крайне трудно, но в процессе освоения, можно пожертвовать глобальной уникальностью и контролировать только уникальность идентификатора на данном компьютере. В результате мы получаем две альтернативные формы представления идентификатора в объявлении домена entityUID_D:
entityUID_D= str(string); uid(unsined16,...).
Константа componentAlias_C (Условное имя)
Наряду с уникальным идентификатором, pzl-технология предоставляет воможность присвоить каждой компоненте условное, содержательное имя, являющееся строкой символов. Для этого выбранное имя должно быть присвоено константе ComponentAlias_C. Однако уникальность Условного Имени (Alias) не является жестким требованием.
Так, Вы можете создать несколько текстовых редакторов с различными свойствами, которые поддерживают одни и те же интерфейсы. Каждый из этих текстовых редакторов будет иметь уникальный идентификатор типа entityUID_D и, возможно каждый из них будет иметь свое имя базового класса. Но все они могут иметь одно и то же условное имя "Текстовый Редактор". Тогда Ваша программа (подчеркнем, не зная имени класса), может при создании экземпляра pzl-компоненты использовать имя "Текстовый Редактор" и будет создаваться экземпляр той компоненты, которая в данный момент зарегистрирована на Вашем компьютере. Перерегистрировав новый редактор, вместо старого, Ваша программа будет использовать новый редактор с другими свойствами.
Однако не следует забывать, что все коллизии, связанные с возможной неуникальностью условных имен, должны разрешаться программистом.
Условное имя может использоваться различными средствами pzl-технологии для идентификации компонент как на экране, так и в сообщениях об ошибках.
Константа componentRunable_C
Эта константа сообщает о возможности запуска данной компоненты путем вызова предиката spbRun:(string UserInfo). Предикат spbRun декларируетс в одноименном интерфейсе spbRun.
Соответственно, компонента должна поддерживать интерфейс spbRun, если возможность вызова предиката spbRun предусматривается.
Если интерфейс spbRun компонентой поддерживается, то константа componentRunable_C должна иметь значение core::b_true и core::b_false - если не поддерживается.
Предикат spbRun - это, по крайней мере, один предикат в pzl-компоненте, который может этой компонентой поддерживаться и имя этого предиката известно.
Предикат spbRun имеет единственный входной параметр UserInfo типа string, назначение которого определяется создателем компоненты.
Если данная компонента может быть вызвана с помощью предиката spbRun, это означает, что в приложении для данной компоненты всегда имеются условия, которые позволяют этой компоненте выполнить какую-то функциональную задачу.
Это несколько напоминает функцию раздела GOAL - точка начала работы программы, но в случае с предикатом spbRun этот предикат может быть вызван, а может быть и не вызван.
Если приложение основано на использовании графического пользовательского интерфейса (pfc/GUI или pfc/VPI), то возможность запуска компоненты предикатом spbRun может означать, что будет создана какая-то форма на экране и эта форма далее позволит сделать что-то значимое (не обязательно полезное).
Если пользовательский интерфейс не используется, то предикат spbRun может быть использован и для других целей по усмотрению программиста.
Предикат spbRun:(string UserInfo) объявлен в интерфейсе spbRun, где он является единственным. Если компонента поддерживает интерфейс spbRun, то это декларируется стандартным способом:
interface componentInterface supports pzlComponent supports spbRun constants ... ComponentRunable_C = b_true. ... end interface componentInterface
либо один из интерфейсов, поддерживаемых базовым интерфейсом компоненты, должен поддерживать интерфейс spbRun, как показано ниже
interface componentInterface supports pzlComponent supports textEditor constants ... componentRunable_C = b_true. ... end interface componentInterface interface textEditor supports spbRun ... end interface textEditor
Константа componentMetaInfo_C
Константа componentMetaInfo_C имеет тип core::namedValue* и представляет список именованных данных, относящихся к данной компоненте - метаинформация о компоненте.
pzl-Система никак эту метаинформацию не обрабатывает, но при соотвествующем запросе к контейнеру данные этого списка доступны программисту.
В частности, метаинформация может быть получена с помощью предиката интерфейса pzlComponent getComponentMetaInfo()->namedValue*.
Если метаинформация о компоненте отсутствует, то константа componentMetaInfo_C все равно должна быть определена и должна представлять пустой список.
constants componentMetaInfo_C = [].
Константа Описания Компоненты сomponentDescriptor_C
Константа сomponentDescriptor_C включает описания важнейших свойств компоненты перечисленные выше:
- ComponentID_C,
- ComponentAlias_C,
- ComponentRunable_C
- ComponentMetainfo_C
Константа сomponentDescriptor_C соответствует домену pzlDomains::pzlComponentInfo_D, объявленному в интерфейсном файле pzlDomains:
pzlComponentInfo_D=pzlComponentInfo ( string Alias, entityUID_D ComponentID, booleanInt Runable, core::namedValue_List UserDefinedInfo ).
Пример описания констант pzl-компоненты
В реальной компоненте константы описания могут выглядеть так:
constants componentDescriptor_C:pzlDomains::pzlComponentInfo_D=pzlDomains::pzlComponentInfo ( componentAlias_C, componentID_C, componentRunAble_C, componentMetaInfo_C ). componentID_C:pzlDomains::entityUID_D=pzlDomains::str("ComponentExample"). componentAlias_C="ПримерКомпоненты". componentRunAble_C=b_True. componentMetaInfo_C:namedValue_List=[].