Назад Оглавление Вперед
На головную страницу М.М.Горбунов-Посадов
 
РАСШИРЯЕМЫЕ ПРОГРАММЫ
 

 Г л а в а  3
ПАКЕТ ПРОГРАММ
 
3.2. Цепочечный подход
 

 

3.2. Цепочечный подход

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

      3.2.1. Конвейер в системе UNIX. Последний и наиболее массовый всплеск интереса к цепочечному подходу был связан с появлением и повсеместным распространением операционной системы UNIX. В теоретическом базисе, лежащем в основании UNIX, важное место занимало понятие конвейера (pipeline). В конвейере модули, входящие в цепочку, подвергают последовательной обработке («фильтрации») некоторый файл. По мере того как файл перетекает от модуля к модулю, он постепенно обретает черты искомого результата. Одним из важных достоинств конвейера является возможность распараллеливания: когда модуль обработал очередную запись файла и передал ее дальше по цепочке, он освобождается и может, вообще говоря, параллельно прочитать и начать обрабатывать следующую запись.
      Приведем пример небольшой программы, которая могла бы быть построена в пакете учета кадров. Пусть в пакете содержатся следующие модули: выдача списка фамилий сотрудников, сортировка в обратном порядке, разбиение текста на страницы, печать. Из них очевидным образом составляется цепочка, решающая задачу «распечатать на страницах список фамилий сотрудников в обратном порядке» (рис. 3.2).


 
Рис. 3.2.  Цепочка, решающая задачу «распечатать на страницах список фамилий сотрудников в обратном порядке»

В данной цепочке средние модули — сортировка и разбиение на страницы — выступают в роли фильтров, т. е. процедур, читающих данные из стандартного источника ввода и направляющих результаты в стандартный канал вывода.
      При проектировании системы UNIX фильтрам и формируемым из них конвейерам было уделено особое внимание. В распоряжение пользователя была предоставлена специальная языковая конструкция, позволяющая описывать конвейер предельно компактно и наглядно. Предполагалось, по-видимому, что конвейер станет одной из наиболее широко используемых общих конфигураций.
      Действительно, несколько типовых сервисных задач, подобных упомянутой выше, удачно вписалось в конвейерную схему. Более того, предпринимались небезынтересные попытки (в частности, [Кемпф, 1987]) приспособить конвейер для численных расчетов. Но с течением времени стало ясно, что область применимости конвейера не так широка, как ожидалось, и интерес к нему постепенно угас. Дело дошло до того, что в одном из популярных практических руководств по системе UNIX [Готье, 1985] понятие конвейера просто не упоминается.

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

      3.2.3. Безболезненность и сфера применимости. В рассмотренных выше задачах подразумевалось, что цепочки модулей составляются пользователем пакета вручную. В этом предположении цепочечный подход обеспечивает безболезненность пополнения программного фонда пакета. В самом деле, пусть к пакету подключен некоторый новый модуль. Его появление позволит, вероятно, составить множество новых цепочек. Но существующие модули и цепочки это событие никак не затронет, и, следовательно, здесь не может быть утрачена работоспособность отлаженных ранее программ.
      Помимо безболезненности развития пакета к безусловным достоинствам цепочечного подхода следует отнести также простоту реализации и наглядность. Все эти обнадеживающие свойства, к сожалению, во многом обесцениваются бедностью цепочки модулей как конфигурационного ориентира (см. разд. 2.5). Современные представления о рациональной модульной структуре тяготеют к понятиям объектно-ориентированного программирования, где программа мыслится как совокупность взаимодействующих между собой объектов, каждый из которых включает в себя некоторое подмножество данных и обслуживающих их процедур, методов. Ни сами объекты, ни присущие им процедуры не выстраиваются в цепочки; механизмы их взаимодействия, как правило, существенно богаче. В частности, весьма продуктивным оказывается совместное выполнение процедур (называемых в этом случае сопрограммами — coroutine), которое никак не вписывается в рамки цепочечного подхода.
      Таким образом, успешное использование цепочечного подхода для построения конкретного пакета программ следует рассматривать не как правило, а скорее как счастливое исключение. Поэтому если вдруг обнаружилось, что интересующая вас предметная область допускает цепочечный подход, то считайте это крупной удачей, попытайтесь не упустить свой шанс и построить эффективный пакет. В то же время не стоит сильно огорчаться, если такая попытка не удалась, — всерьез рассчитывать на применимость цепочечного подхода для достаточно сложной предметной области было бы нереалистично.
      Цепочечный подход был бы обречен на прозябание на задворках арсенала разработчика пакетов, если бы не одна важная особенность, неизменно подогревающая интерес к нему. Дело в том, что в ряде случаев сравнительно легко удается передоверить составление цепочки системным средствам пакета, избавив пользователя от этой скучной обязанности. Организации такого автоматического составления цепочки посвящен следующий раздел.

Далее

Рейтинг@Mail.ru