6. Модульность программ
В FoxPro предусмотрена широкая возможность использования процедур, которые могут быть как внешними (в виде отдельных программных файлов), так и внутренними (внутри программы). Частным случаем процедуры является процедура-функция.
Эти средства удобно использовать для реализации некоторых одинаковых процессов обработки данных. Тогда такой процесс программируется один раз в виде одного из перечисленных выше средств и вызывается в системе по мере необходимости.
Кроме того, модульное программирование позволяет разработчику гораздо лучше ориентироваться в своей системе, а также сделать более эффективным процесс ее написания и отладки.
Встречая обращение к процедуре, FoxPro ищет ее в следующей последовательности:
1. В текущей процедуре;
2. В процедурном файле, если он подключен;
3. Снизу вверх в старших процедурах относительно текущей, если они есть;
4. На диске в виде отдельной программы. Рассмотрим средства структурирования.
Внешние процедуры
Внешняя процедура - это совокупность команд, осуществляющих обычно какие-то законченные действия по обработке данных и образующих отдельный командный файл, т.е. отдельную программу (модуль).
Обращение к процедуре выполняется командой DO:
• DO <имя командного файла> [WITH <список параметров>] [IN <файл>]
Если не указано расширение имени файла, процедура ищется СУБД на диске в следующей последовательности: сначала в ЕХЕ, затем в АРР, FXP и, наконец, в PRG-файле. Процедура вообще может находиться внутри другого IN <файла> как его внутренняя процедура.
В процедуру могут быть переданы и из нее получены некоторые величины, указанные в списке параметров после слова WITH. Этими величинами могут быть не только переменные и константы, но любые разрешенные выражения. В таком случае первой командой в вызываемой процедуре должна быть команда, воспринимающая их:
• PARAMETERS <список параметров>
Параметры, указанные в команде DO после слова WITH в вызывающей программе, как принято в алгоритмических языках, называются фактическими, а соответствующие им параметры в вызываемой процедуре (в команде PARAMETERS) - формальными. Программист должен заботиться о том, чтобы передаваемые параметры по типу соответствовали друг другу. Число формальных и фактических параметров может и не совпадать. Если формальных параметров больше, избыточные параметры получают значения .F., если меньше, последует сообщение об ошибке.
Распознать число фактических параметров можно с помощью функции
• PARAMETERS()
Завершаются файлы-процедуры одним из следующих образов:
1. Достижением последней команды файла - осуществляется возврат в старшую вызвавшую программу или на командный уровень, если это самый старший модуль;
2. Командой RETURN - возврат в старшую программу;
3. Командой CANCEL - выход на командный уровень;
4. Командой QUIT - выход из FoxPro в DOS.
Команда RETURN может содержать опции
• RETURN [ТО MASTER/<Пpoцeдypa>/<выp>]
Здесь фраза RETURN TO MASTER указывает на переход к самому верхнему уровню вызывающих процедур, a RETURN TO <Процедура> - возврат на процедуру с указанным именем. Элемент <выр> применяется для передачи в вызывающую программу результата, если процедура используется как процедура-функция.
В первом и втором случаях возврат в старшую программу выполняется на команду, следующую за той, от которой произошел вызов подпрограммы. Однако, при некоторых обстоятельствах бывает желательно вернуться именно на команду вызова. Это можно сделать командой
• RETRY
Подчиненность модулей в общем довольно условна. В FoxPro допускаются даже рекурсии, т.е. обращение процедуры к самой себе.