Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Методы организации модульности программного обеспечения СТДМ АДК-СЦБ






 

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

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

 

Объявлением простого xml-объекта является xml-элемент следующего вида:

< TAG NAME=”имя” CLASS=”класс” …>

< /TAG>

Здесь атрибуты NAME и CLASS являются зарезервированными ключевыми словами и определяют соответственно имя xml-объекта и имя класса, реализующего некоторый интерфейс и соответствующего этому объекту в программной реализации.

Рассмотрим пример:

< MYOBJ NAME=”1-й” CLASS=”IMyObject” MYATTR=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAMA A=”1” B=”2” C=”3”/>

< /MYOBJ>

 

Такая конструкция объявляет xml-объект с именем «1-й» класса «IMyObject» и фактически говорит приложению о том, что для загрузки этого xml-объекта необходимо создать экземпляр класса «IMyObject», связать его с именем «1-й» и дать ему возможность загрузить свои параметры из этого xml-элемента. В качестве этих параметров в данном примере выступают: значение атрибута MYATTR, содержимое xml-элементов с именами тегов PARAM1 и PARAMA.

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

Необходимо отметить, что объявление xml-объекта позволяет не только создать экземпляр нужного класса из нужной библиотеки, но и выполнить конфигурирование этого экземпляра.

Для объединения некоторых параметров xml-объектов в группы используется ключевой атрибут FROM. При этом необходимые параметры выделяются в отдельный xml-элемент. Важно при этом, что этот xml-элемент должен содержать атрибут NAME для организации в xml-объекте ссылки на него. Рассмотрим пример объявления xml-объекта со ссылкой на данные из другого xml-элемента:

Xml-элемент, группирующий параметры:

< MYTYPE NAME=”BaseParams” ATTR1=”123” ATTR2=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

Xml-объект, использующий параметры из этого xml-элемента:

< MYOBJ NAME=”2-й” FROM=”BaseParams” CLASS=”IMyType” ATTRNEW=”321”>

< PARAMNEW A=”1” B=”2” C=”3”/>

< /MYOBJ>

 

Такая конструкция объявляет объект с именем «2-й». Атрибут FROM является зарезервированным ключевым словом и определяет ссылку на xml-элемент, данные которого наследует xml-объект. В этом случае приложение должно обеспечить загружаемому объекту доступ к данным так, как будто объект имеет дело только с одним xml-элементом следующего формата:

< MYOBJ NAME=”1-й” CLASS=”IMyType” ATTRNEW=”321” ATTR1=”123” ATTR2=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< PARAMNEW A=”1” B=”2” C=”3”/>

< /MYOBJ>

 

Таким образом, можно выделить более общие объявления xml-объектов следующего вида:

< TAG NAME=”имя” CLASS=”класс” [FROM=”ссылка”] …>

< /TAG>

или

< TAG NAME=”имя” FROM=”ссылка” [CLASS=”класс”] …>

< /TAG>

Атрибут CLASS может быть необязательным, если его значение определено в xml-элементе, на который организована ссылка.

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

При xml-наследовании возможны ситуации, когда данные xml-объекта совпадают с данными в xml-элементе, на который организована ссылка. Рассмотрим пример:

Xml-элемент, группирующий параметры:

< MYTYPE NAME=”BaseParams1” ATTR1=”123” ATTR2=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

Xml-объект, использующий параметры из этого xml-элемента:

< MYOBJ NAME=”2-й” FROM=”BaseParams1” CLASS=”IMyType” ATTR1=”333”>

< PARAM1 A=”3” B=”3” C=”3”/>

< /MYOBJ>

 

В этом случае приложение должно обеспечить загружаемому объекту доступ к данным так, как будто объект имеет дело только с одним xml-элементом следующего формата:

< MYOBJ NAME=”2-й” CLASS=”IMyType” ATTR1=”333” ATTR2=”123”>

< PARAM2 A=”1” B=”2” C=”3”/>

< PARAM1 A=”3” B=”3” C=”3”/>

< /MYOBJ>

 

Из примера видно, что для xml-объекта должны использоваться более поздние значения данных. Так, значение атрибута ATTR1 берется из элемента для xml-объекта, и xml-элемент с именем тега PARAM1 тоже используется из элемента для xml-объекта. Считается, что xml-элементы с одинаковыми именами тегов и одинаковыми значениями атрибутов NAME являются одинаковыми параметрами, и поэтому должно выбираться наиболее позднее определение. При этом, если атрибут NAME не определен, то его значением считается пустая строка. Однако, xml-элементы с одинаковыми именами тегов, но разными значениями атрибутов NAME, являются разными данными. Приведем пример, отражающий эту особенность.

< MYTYPE NAME=”BaseParams2” CLASS=”IMyType” ATTR1=”123” ATTR2=”123”>

< PARAM A=”1” B=”2” C=”3”/>

< PARAM NAME=”Apar” A=”1” B=”2” C=”3”/>

< PARAM NAME=”Bpar” A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

< MYOBJ NAME=”1-й” FROM=”BaseParams2” ATTR1=”333”>

< PARAM NAME=”Apar” A=”3” B=”3” C=”3”/>

< PARAM NAME=”Zpar” A=”3” B=”3” C=”3”/>

< /MYOBJ>

 

В этом случае приложение должно обеспечить загружаемому объекту доступ к данным так, как будто объект имеет дело только с одним xml-элементом следующего формата:

< MYOBJ NAME=”1-й” CLASS=”IMyType” ATTR1=”333” ATTR2=”123”>

< PARAM A=”1” B=”2” C=”3”/>

< PARAM NAME=”Bpar” A=”1” B=”2” C=”3”/>

< PARAM NAME=”Apar” A=”3” B=”3” C=”3”/>

< PARAM NAME=”Zpar” A=”3” B=”3” C=”3”/>

< /MYOBJ>

 

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

Цепочка наследования xml-элементов, группирующих параметры:

< MYTYPE NAME=”BaseParams1” ATTR1=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

< MYTYPE NAME=”BaseParams2” FROM=”BaseParams1” ATTR2=”123”>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

< MYTYPE NAME=”BaseParams3” FROM=”BaseParams2” ATTR3=”123”>

< PARAM3 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

Xml-объект, использующий параметры целой цепочки xml-элементов:

< MYOBJ NAME=”3-й” FROM=”BaseParams3” CLASS=”IMyType” ATTRNEW=”321”>

< PARAMNEW A=”1” B=”2” C=”3”/>

< /MYOBJ>

 

В этом случае приложение должно обеспечить загружаемому объекту доступ к данным так, как будто объект имеет дело только с одним xml-элементом следующего формата:

< MYOBJ NAME=”3-й” CLASS=”IMyType” ATTRNEW=”321” ATTR3=”123” ATTR2=”123” ATTR1=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< PARAM3 A=”1” B=”2” C=”3”/>

< PARAMNEW A=”1” B=”2” C=”3”/>

< /MYOBJ>

 

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

Особым параметром при объявлении xml-объекта является атрибут CLASS. Как уже говорилось, значение этого атрибута – это имя класса, соответствующего этому объекту в программной реализации. Как и для любого другого параметра при xml-наследовании для атрибута CLASS используется наиболее позднее определение. Нужно отметить, что при вынесении этого атрибута из определения xml-объекта в отдельный xml-элемент этот xml-элемент по определению сам становится xml-объектом. Таким образом, получается возможным xml-наследование xml-объектов, а также объявление xml-объекта без определения имени класса. Важно при этом, чтобы класс определялся в одном из xml-элементов в цепочке наследования. Приведем пример объявления xml-объекта без определения класса:

Цепочка наследования xml-элементов, группирующих параметры:

< MYTYPE NAME=”BaseParams1” ATTR1=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

< MYTYPE NAME=”BaseParams2” FROM=”BaseParams1” ATTR2=”123”>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

Это уже не просто xml-элемент, группирующий параметры, а фактически xml-объект:

< MYTYPE NAME=”BaseParams3” CLASS=”IMyType” FROM=”BaseParams2” ATTR3=”123”>

< PARAM3 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

Xml-объект, использующий параметры цепочки xml-элементов, без определения класса:

< MYOBJ NAME=”3-й” FROM=”BaseParams3” ATTRNEW=”321”>

< PARAMNEW A=”1” B=”2” C=”3”/>

< /MYOBJ>

 

В этом случае приложение должно обеспечить загружаемому объекту доступ к данным так, как будто объект имеет дело только с одним xml-элементом следующего формата (при этом используется имя класса из xml-элемента или xml-объекта BaseParams3):

< MYOBJ NAME=”3-й” CLASS=”IMyType” ATTRNEW=”321” ATTR3=”123” ATTR2=”123” ATTR1=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< PARAM3 A=”1” B=”2” C=”3”/>

< PARAMNEW A=”1” B=”2” C=”3”/>

< /MYOBJ>

Поиск реализации класса/интерфейса, указанного в объявлении xml-типа или xml-объекта, является задачей приложения. Имя класса можно записывать следующими способами: < имя интерфейса> или < имя библиотеки>? < имя интерфейса>, указывая имя библиотеки, в которой следует искать реализацию класса. Здесь < имя библиотеки> – это либо путь к файлу самой библиотеки, либо объявленный специальным образом синоним библиотеки. < имя интерфейса> – это либо имя интерфейса, объявленное в списке динамических библиотек, либо имя класса. Приведем пример определения имени класса:

< CONFIGURATION>

<! —объявление динамически подключаемых библиотек -->

< DYNLIBS NAME=”ViewDll” FROM=”Main? BaseDll”>

< LIBRARY NAME=" MenuClasses" AUTOLOAD=" 1" >

< INTERFACE NAME=" IMenu" CLASSNAME=" CMenu" />

< INTERFACE NAME=" IExMenu" />

< /LIBRARY>

 

< LIBRARY NAME=" ToolBarClasses" PATH=" ToolBarClasses.dll" AUTOLOAD=" 0" >

< INTERFACE NAME=" IToolBar" CLASSNAME=" CToolBar" />

< INTERFACE NAME=" IAnother" CLASSNAME=" CAnother" />

< /LIBRARY>

< /DYNLIBS >

 

<! -- объекты -->

< MYTYPE NAME=”BaseType1” CLASS=” IMenu” ATTR1=”123” ATTR2=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

< MYTYPE NAME=”BaseType2” CLASS=”ToolBarClasses? IToolBar” ATTR1=”123” ATTR2=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

 

< MYTYPE NAME=”BaseType2” CLASS=”ToolBarClasses.dll? CToolBar” ATTR1=”123” ATTR2=”123”>

< PARAM1 A=”1” B=”2” C=”3”/>

< PARAM2 A=”1” B=”2” C=”3”/>

< /MYTYPE>

< /CONFIGURATION>

 

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

< MYOBJ NAME=”3-й” CLASS=”CMyClass” NEXTOBJ=”Objects/1СП”>

< PREVRC REF=”Objects/3СП”/>

< /MYOBJ>

 

Здесь атрибут NEXTOBJ и атрибут REF xml-элемента PREVRC являются объектными ссылками. При этом то, что это действительно объектные ссылки, определяет разработчик класса CMyClass, то есть слова NEXTOBJ, REF, PREVRC не являются зарезервированными. Для получения указателя или ссылки на объекты 1СП и 3СП разработчик должен пользоваться функциональностью объектного загрузчика по разрешению объектных ссылок по их значению.

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

 

<! -- приложение -->

< App NAME=”Application” CLASS=” CApp” Log=”log.dat” >

< Form NAME=”Основная форма” CLASS=”CMainForm” … >

< Form NAME=”Текущее состояние” CLASS=”CCurStateForm” …>

< /Form>

< Form NAME=”Архив” CLASS=”CArhStateForm” …>

< /Form>

< /Form>

< Form NAME=”About” CLASS=”CArmAboutForm”/>

< /App>

 

В приведенном примере xml-объекты «Application» и «Основная форма» являются коллекциями и выполняют загрузку дочерних объектов. Таким образом, если xml-объект «Application» является точкой входа для загрузчика, то он обеспечит загрузку объекта «Основная форма», который в свою очередь загрузит объекты «Текущее состояние» и «Архив». И так будут загружены все xml-объекты, входящие в иерархию.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.