В этой связи расширяемость занимает одно из самых почетных мест в ряду достоинств программного кода. Можно перечислить некоторые качества программы, в той или иной мере способствующие расширяемости: модульность, наглядность, объектная ориентированность и т.п. Однако сегодня, к сожалению, не существует ни общепринятого определения расширяемости, ни четкого свода правил построения расширяемого кода. Книга «Расширяемые программы», недавно вышедшая в издательстве «Полиптих», в известной степени восполняет этот пробел.

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

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

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

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

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

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

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

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

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

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

Наборная схема организации иллюстрируется в книге множеством примеров из различных предметных областей: вычислительные задачи, автоматизация проектирования, язык HTML, среда Borland Delphi. В заключительной главе разбирается несколько типовых практических ситуаций, где применение предлагаемой техники построения расширяемых программ выглядит наиболее убедительно. Значительную часть этих примеров автор уже публиковал на страницах нашего журнала [1-3].

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

Книгу можно заказать в Web-магазине http://www.bolero.ru.

Литература

[1] Горбунов-Посадов М.М. Безболезненное развитие программы // Открытые системы., 1996, № 4. С.65-70. http://www.osp.ru/os/1996/04/65.htm
[2] Горбунов-Посадов М.М. Система открыта, но что-то мешает // Открытые системы., 1996. № 6. С.36-39. http://www.osp.ru/os/1996/06/36.htm
[3] Горбунов-Посадов М.М. Облик многократно используемого компонента // Открытые системы., 1998. № 3. С.45-49. http://www.osp.ru/os/1998/03/45.htm