Информатика - Учебное пособие

Модульное программирование

 

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

В концепцию модульного программирования обычно включают следующие положения:

1) каждый модуль реализует узкоспециализированную независимую функцию;

2) каждый модуль имеет единственную точку входа/выхода;

3) чем меньше размер модуля, тем лучше;

4) каждый модуль может быть создан отдельными программистами бригады и по возможности отдельно отлажен;

5) вся программа строится из модулей.

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

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

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

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

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

В связи с этим, иногда говорят о блочном программировании, концепция которого практически идентична модульному.

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

При описании подпрограммы необходимо задать следующие основные компоненты:

- интерфейс подпрограммы, т. е., информацию, необходимую для обращения к ней;

- совокупность описаний, определений ("локальные" объекты);

- последовательность операторов, решающая задачу подпрограммы.

Все объекты, описанные в подпрограмме, являются локальными, т. е., действуют лишь в пределах данного блока. Они "не видны" из всех других модулей программы, за исключением тех, которые являются подпрограммами данного модуля. Для последних такие объекты являются "глобальными" и могут быть использованы в том смысле, в котором описаны.

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

Последнее связано с использованием механизма динамического распределения памяти под переменные. Дело в том, что переменная размещается в памяти лишь, пока выполняется тот модуль, в котором она объявлена. После завершения работы блока происходит перераспределение памяти под переменные следующего модуля. Исключение составляют лишь переменные, описанные в основной программе, которые существуют все время ее работы.

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

1)  имена  объектов,  описанных  в  некотором  блоке,  считаются  известными  в  пределах данного объекта, включая и все вложенные блоки;

2) имена описанных в блоке объектов должны быть уникальны в пределах данного блока, хотя могут и совпадать с именами объектов из других блоков;

3) если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного во внешнем блоке, последний становится недоступным в данном блоке. Иными

словами,  имя,  описанное в блоке,  как  бы "экранирует"  одноименные  объекты из внешних блоков.

Совокупность  объектов,  описанных  в  самом  внешнем  (основном)  блоке,  называется глобальным контекстом программы.

Приведенные выше правила характерны для таких блочно структурированных языков программирования как Си, Паскаль и создают определенные удобства при программировании. Так, можно выбирать имена объектов в подпрограмме без учета того, что в других блоках программы объекты с данными именами уже существуют.

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

Наиболее выгодно оформлять в виде подпрограммы некий набор действий, который в процессе выполнения программы повторяется несколько раз. Однако современный подход к программированию поощряет оформление в виде подпрограммы любого достаточно самостоятельного и законченного фрагмента программы. Размеры такого модуля определяются и возможностями человеческого восприятия. Считается оптимальным, если модуль насчитывает не более 20 - 40 строк и не более 8 - 10 параметров. Разбиение любой программы на такие модули облегчает отладку программы и способствует ее лучшему пониманию. Приведем набор положений, которые следует использовать при составлении программ с модульной структурой:

- выявление относительно самостоятельных фрагментов алгоритма;

- определение наиболее рационального описания подпрограммы ;

- формирование списка используемых параметров;

- установление мест программы, в которых необходимо предусмотреть обращение к подпрограммам;

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