Компонентно-ориентированное
программирование

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

Создание и поддержание в рабочем состоянии библиотеки компонентов требует некоторых дополнительных усилий, однако, в итоге приводит к значительной экономии времени и средств при создании новых программ. Кроме того, при разработке агентов Интернет поддержка этого способа программирования особенно важна, потому что способ доступа к некоторым ресурсам Сети время от времени изменяется, и тогда необходимо быстро внести исправления во все программы, использующие этот ресурс. Например, при каждом очередном изменении интерфейса какой-либо поисковой машины, необходимо вспомнить, какие агенты обращаются к ней во время работы, и внести в них соответствующие изменения. Для решения подобных проблем в Акторном Прологе реализованы синтаксические средства, поддерживающие компонентно-ориентированное программирование. Такими средствами являются пакеты и автоматическое подключение компонентов из SADT диаграмм.

1. Пакеты

Пакетом в Акторном Прологе называется набор классов, связанных по смыслу. Все классы, принадлежащие пакету, должны быть собраны в одном файле, оформленном следующим образом.

  1. В начале файла записывается заголовок пакета, состоящий из ключевого слова package, имени пакета и двоеточия ":". Имя пакета записывается в виде текстовой строки в кавычках. Обычно имя состоит из идентификаторов, разделённых косой чертой. Можно использовать как прямую "\\", так и обратную "/" косую черту, транслятор понимает оба варианта. Все вместе, идентификаторы составляют имя файла (без расширения), в котором записано содержимое пакета, например "Morozov/Web/Scanning/Analyzer". Таким образом, в заголовке пакета должен быть указан точный путь к файлу, в котором он хранится.
  2. После этого перечисляются имена классов, импортируемых в программу из других пакетов, и пакеты, из которых они импортируются. Каждая команда импорта состоит из ключевого слова import, имени класса, ключевого слова from, имени пакета и точки с запятой ";". В Акторном Прологе поддерживается импорт с переименованием, то есть импортированный класс может использоваться в программе под именем, отличающимся от того, под которым он был определён в своём пакете. В этом случае в команду импорта добавляется ключевое слово as, после которого записывается новое имя класса. Эта возможность языка имеет очень большое значение для реализации визуального компонентно-ориентированного программирования, о котором мы поговорим позже.
  3. Далее следуют классы, входящие в состав пакета. Здесь же может быть определёно целевое утверждение (проект) программы.

Основная программа оформляется по таким же правилам, но "заголовок пакета" можно не писать. Пакеты могут свободно импортировать классы, входящие в состав других пакетов. Поэтому в ходе трансляции программы транслятор автоматически загружает исходные файлы, указанные в командах импорта. Более того, если в том же каталоге, где находится пакет, расположен файл с определениями диалоговых окон (с тем же именем, но с расширением DLG), транслятор автоматически загрузит определения диалоговых окон.

Пример 1. Пример оформления пакета.

Рассмотрим пример Google4.A в каталоге Web.

----------------------------------------------------
-- An example of Actor Prolog program.            --
-- (c) 2002, Alexei A. Morozov, IRE RAS.          --
-- Retrieving Web information with the help       --
-- of Google search engine.                       --
----------------------------------------------------
import 'Google'  as 'Engine'
                 from "Morozov/Web/Engines/Google";
import 'Request' from "Morozov/Web/Engines/Request";
import 'List'    from "Morozov/Web/Browsing/List";
----------------------------------------------------
project: (('Main'))
----------------------------------------------------
class 'Main' specializing 'Report':
--
control = ('Request',
                engine=self);
--
engine  = ('Engine',
                engine_output=self,
                debug_output=self);
--
demo    = (('Demonstrator',
                suspending:results));
--
protecting:
results = engine ?? get_resource;
--
[
goal:-!,
        control ? show.
--
search(Keywords):-!,
        engine << search(Keywords),
        demo << show.
--
found_reference(URL):-!,
        writeln("Retrieved link: ",URL).
--
next_page(N,URL):-!,
        writeln("Next page (",N,"): ",URL).
]
----------------------------------------------------
class 'Demonstrator':
--
results;
--
dialog  = ('List',
                list_of_resources=results);
--
con     = ('Console');
--
[
goal:-!.
--
show:-!,
        dialog ? show.
]
----------------------------------------------------

Эта программа получает данные из поисковой системы Google. Для этого формируется запрос с ключевыми словами, указанными пользователем.



Рис. 1.1. Ввод ключевых слов.

Запрос посылается поисковой машине. Затем программа анализирует ответы, передаваемые поисковой машиной, и, если это необходимо, посылает дополнительные запросы. Собранные данные выводятся в виде списка:



Рис. 1.2. Результаты, полученные поисковой машиной.

Пользователь может выбрать любой ресурс из списка и просмотреть его, нажав кнопку "Show resource". При этом программа вызовет используемый по умолчанию браузер Интернет и передаст ему указанный адрес.



Рис. 1.3. Просмотр найденного ресурса.

Все эти функции реализованы в библиотеке компонентов, поставляемой вместе с примерами. Обратите внимание на оформление команд импорта классов из различных пакетов библиотеки компонентов.

Мы не будем подробно рассматривать устройство отдельных компонентов. В данном примере для нас важна только общая схема программы:



Рис. 1.4. Схема программы.

Диалоговое окно, в котором пользователь вводит ключевые слова для поиска, изображено в виде специального процесса, посылающего прямое сообщение start основному процессу. Основной процесс реализует взаимодействие с поисковой машиной Google. Он посылает запрос поисковой машине, анализирует ответ и, если поисковая машина сообщает о наличии дополнительных страниц, посылает сам себе прямое сообщение inspect_page, вызывающее новое взаимодействие с Google. Полученные результаты сохраняются во временной базе данных. Записи, занесённые во временную базу данных, собираются в список при помощи резидента и посылаются процессу 'Demonstrator'. Процесс 'Demonstrator' выводит список результатов на экран и по команде пользователя вызывает браузер Интернет.

Обратите внимание, что прямое сообщение inspect_page является не переключающим, а информационным. В соответствии с семантикой Акторного Пролога информационные сообщения имеют меньший приоритет, чем резиденты. Благодаря этому программа начинает выводить на экран полученные результаты ещё до того, как Google передаст полный список найденных ресурсов.

2. Автоматическое подключение компонентов из SADT диаграмм

Акторный Пролог поддерживает визуальное компонентно-ориентированное программирование. То есть для создания программы достаточно нарисовать SADT диаграмму и указать в комментариях к каждому блоку, какой компонент следует использовать для его реализации. Для этого просто напишите в тексте комментария к блоку команду #package с именем пакета в качестве параметра.



Рис. 2.1. Назначение компонента, реализующего блок.

SADT диаграмма будет оттранслирована в программу на Акторном Прологе, использующую указанные компоненты. При этом для устранения возможных конфликтов имён классов, принадлежащих различным компонентам, используется импорт классов с переименованием.

Рассмотрим пример Complex.A в каталоге Web.

Пример 2. Визуальное программирование агента Интернет на основе готовых компонентов.

Эта программа собирает данные с помощью двух поисковых машин одновременно - Google и Rambler. Ресурсы, найденные поисковыми машинами, подвергаются предварительному просмотру, чтобы уменьшить количество неверных ответов.



Рис. 2.2. Пример взаимодействия с двумя поисковыми машинами.

Общая схема программы подобна предыдущей. Пользователь вводит ключевую фразу (несколько слов). Программа взаимодействует с поисковыми машинами. Результаты выводятся на экран в виде списка и могут быть просмотрены браузером Интернет.



Рис. 2.3. Общая схема программы.

Списки адресов, собранные поисковыми машинами, подвергаются слиянию и фильтрации.



Рис. 2.4. Слияние и фильтрация результатов.

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



Рис. 2.5. Установка параметров поиска и фильтрации.

После того как параметры поиска и фильтрации установлены, введите ключевую фразу для поиска информации.



Рис. 2.6. Ввод ключевой фразы.

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



Рис. 2.7. Предварительный просмотр ресурсов Интернет.

Собранная информация выводится на экран в диалоговом окне.



Рис. 2.8. Вывод результатов поиска.

Так же как в предыдущем примере, найденный ресурс может быть просмотрен внешним браузером Интернет.



Рис. 2.9. Просмотр найденного ресурса Интернет.

Рассмотренный пример был целиком собран из подготовленных заранее компонентов. Фактически, процесс программирования был сведён к рисованию SADT модели разрабатываемого агента Интернет.

Оглавление