4.5. Имена гнезд и модулей
Как уже упоминалось, в производственных многовариантных программах, решающих задачи вычислительного эксперимента, обычно содержится от нескольких десятков до нескольких сотен вариантных гнезд. Для задания конкретной конфигурации программы необходимо, вообще говоря, каждому вариантному гнезду назначить размещаемый в нем сменный модуль. В простейших случаях такое назначение выполняется посредством множества предложений вида (1) или (2), рассмотренных в предыдущем разделе. Однако нередко оказываются полезными и другие языковые конструкции.
При проектировании средств описания конкретных конфигураций многовариантной программы необходимо прежде всего выработать соглашения об именах гнезд и сменных модулей. Отдельные соглашения такого рода уже рассматривались ранее, но в более узком контексте: применительно к оформлению одиночного варианта (разд. 1.8.4) и к компонентам многосвязных гнезд и модулей (разд. 3.6.2). Большинство приведенных там соображений применимо к случаю многовариантных программ, однако здесь имеются и некоторые особенности.
Разработчик многовариантной программы практически не может позволить себе не именовать гнезда или сменные модули, как это допускалось в случае оформления единичного варианта. Ведь если имен нет, то при задании конкретной конфигурации многовариантной программы придется многократно спускаться на уровень исходного текста, вспоминая предназначение очередного гнезда, и подыскивать для гнезда сменный модуль, опять-таки перебирая исходные тексты модулей. В то время как для одного-двух вариантных гнезд с двумя-тремя сменными модулями подобная схема иногда оказывается удобной, для многовариантных программ, где счет и гнездам, и сменным модулям идет на десятки и сотни, она становится неприемлемо трудоемкой.
Строго говоря, для того чтобы избавиться от обращений к уровню исходного текста, гнезда именовать не обязательно достаточно присвоить имена только сменным модулям. Поскольку каждый сменный модуль всегда приписан к некоторому гнезду, можно полностью описать конкретную конфигурацию, указывая только имена модулей вместо назначений «гнездо < модуль». Однако схема с именованными гнездами и назначениями «гнездо < модуль» представляется более удобной и наглядной. Кроме того, при наличии именованных гнезд не требуется уникальности имен сменных модулей по отношению ко всему архиву программных материалов (см. разд. 1.8.4), что также нередко оказывается немаловажным.
Разумеется, широкое использование имен отнюдь не означает, что разработчик, составляющий описание конкретной конфигурации многовариантной программы, должен быть принудительно отгорожен от исходных текстов. Напротив, создавая специализированные средства поддержки процесса задания конкретной конфигурации, желательно предусмотреть возможность просмотра (а иногда и редактирования) сопутствующих фрагментов исходного текста: и окрестностей местоположения очередного заполняемого гнезда, и текстов сменных модулей, предназначенных для подстановки в данное гнездо, и даже результата подстановки модуля в гнездо. Но к обращениям на уровень исходных текстов прибегают все же относительно редко задание содержимого основной массы вариантных гнезд производится обычно на уровне имен.
Имена вариантных гнезд записываются прямо в исходном тексте содержащих их программ, например, с помощью предложений #VARIANT вида
#VARIANT имя_гнезда
|
Если требуется разместить вариантное гнездо внутри строки, то для того, чтобы конструкция не слилась с окружающим текстом, можно имя_гнезда заключить в скобки:
. . . #VARIANT ( имя_гнезда ) . . .
Для односвязных компонентов многосвязного гнезда также можно воспользоваться предложениями #VARIANT, задавая в них составные имена:
#VARIANT имя_многосвязного_гнезда . имя_компонента
Сходным образом именуются и компоненты сменных многосвязных модулей (см. разд. 3.6.2):
имя_многосвязного_модуля . имя_компонента
Такой способ именования многосвязных гнезд и модулей позволяет при задании конкретной конфигурации применять не только для односвязного, но и для многосвязного случая уже не раз встречавшуюся конструкцию назначения
имя_гнезда < имя_сменного_модуля
|