Программные модули и схема модуляризации
Модуль — это какая-либо процедура или функция, написанная '.етствии с определенными правилами. Модуль разрабатыва-• последовательность [ораторов, ограниченных точкой '[кой выхода.'icpHoro ящика", которая
"Черный ящик" — ,[, выходы и функция, : льно, как реализован
сам процесс, т.е. "черный ящик" может быть использован без понимания его содержания.
Модуль должен обладать следующими свойствами:
1. Каждый модуль представляет одну логическую задачу.
2. Модуль замкнутый и простой.
3. Модуль дискретен и обозрим.
4. Модуль отдельно тестируется и отлаживается.
5. Каждый модуль реализуется применительно к одной независимой функции программы.
6. Каждый модуль имеет одну точку входа и одну точку выхода.
7. Модули могут объединяться в более крупные модули без знания особенностей их внутреннего содержания.
8. Модули должны иметь хорошо определенные интерфейсы, при этом управляющие связи осуществляются через их точки входа и выхода.
Разделение программы на модули — один из эффективных путей управления сложностью и способ построения структурных программ. Структурная программа, построенная по модульному принципу, обладает определенными свойствами:
1. Программа разделяется на ряд модулей, упорядоченных иерархически в соответствии с их логическими связями и связями по последовательности выполнения.
2. Последовательность (поток) выполнения программы от модуля к модулю ограничивается жесткой схемой: управление должно передаваться к модулю в единственную его точку входа и покидать модуль в его точке выхода и всегда должно возвращаться к вызывающему модулю.
3. Конструкция модуля стандартизуется в соответствии с традиционными правилами модуляризации, а в качестве составных блоков в модуле должны использоваться только последовательность, выбор и повторение (цикл). Оператор безусловного перехода GO TO целесообразно использовать только для перехода непосредственно в точку выхода.
4. Структурная программа должна быть документирована, т.е. содержать информацию о модуле в тексте исходного кода в виде комментариев. Описание общей функции программы, пояснение функций каждого модуля, описание структур данных, а также связей модуля с другими модулями программы обязательно.
При построении модульной программы важным представляется выбор размера модуля. В качестве грубого руководящего указания используется размер модуля в строках кода или в числе операторов. В разных источниках приводятся разные оценки, обобщая их, можно сказать, что модуль не должен содержать более 50 строк кода. (Иногда предлагают ограничивать число строк размером экрана видеотерминала.)
Мера сложности модуля также играет важную роль. Существует несколько подходов к количественной оценке сложности. Одна из наиболее удобных и распространенных — оценка с помощью так называемого цикломатического числа, равного числу путей выполнения программы. Таким образом, сложность программы или модуля равна числу операторов IF + 1. Если в условном операторе используется сложное логическое выражение, то подсчитывается число простых операций сравнения-
Структура взаимосвязей модулей программы называется схемой модуляризации. На рис. 1 представлен пример возможной трехуровневой схемы распределения модулей программы. Главная цель модуляризации — получение хорошей схемы, которая должна быть адекватной составным частям решаемой проблемы. Качество схемы модуляризации оценивается простотой и эффективностью ее реализации. Разработка схемы модуляризации — процесс эвристический, позволяющий получить несколько вариантов решения, среди которых должен быть выбран наилучший.
1-й уровень иерархии
2-й уровень иерархии
3-й уровень иерархии
Модуль А вызывает модули В, С, D
Модуль А является родительским по отношению к модулям В, С, D, которые являются дочерними по отношению к А
Рис. 1.
Схема модуляризации
Естественное требование модульного программирования — иерархическое упорядочение модулей.
Иерархическая организация модулей определяется следующим образом (см. рис. I):
1. Первый уровень содержит один модуль, который называется корневым. Он представляет общую функцию программы на высшем уровне.
2. Второй уровень иерархии содержит модули, которые более подробно определяют функцию корневого модуля.
3. Каждый последующий уровень модулей в иерархии создает более детальное описание функций, выполняемых программой.
4. Схема взаимосвязей модулей определяет потоки управления в структурной программе.
Между модулями существуют отношения активизации, т.е. один модуль может вызывать другой. Так, если модуль А вызывает модуль В, то это означает, что управление передается от модуля А к модулю В. Модуль А называется вызывающим, или родительским, а модуль В — вызываемым, или дочерним. Иногда их называют соответственно "отец — сын". В структурной программе существуют следующие правила для потока управления:
1. Выполнение программы начинается с корневого модуля.
2. Модуль выполняется только тогда, когда он вызывается родительским модулем.
3. Дочерний модуль не может вызывать родительский и не может вызывать сам себя.
4. Управление программой должно входить в модуль в точку входа и покидать модуль в точке выхода.
5. Управление всегда возвращается к вызывающему модулю, когда вызванный модуль выполнит свою функцию.
6. Наименьшая программа состоит из единственного корневого модуля, все остальные содержат один корневой и один или более модулей другого уровня. За исключением корневого, все остальные модули должны иметь, по крайней мере, одного родителя. Если модуль имеет несколько родительских модулей, то он называется общим.
7. Каждая ветвь иерархической схемы модуляризации заканчивается терминальным модулем.
Как и всякая иерархическая структура, схема модуляризации характеризуется глубиной — числом уровней иерархии, и широтой — числом модулей на определенном уровне. Важной характеристикой,
определяющей сложность программ и качество схемы модуляризации, является понятие веера управления, который равен числу дочерних модулей, вызываемых родительским модулем.Очень высокие или низкие значения веера управления в схеме модуляризации служат показателями плохой схемы модуляризации. В общем случае веер управления не должен превышать 10, а в качестве близкого к оптимальному на практике рассматривают число 7. Целесообразно строить схему модуляризации, в которой веер управления имеет небольшие отклонения от этого числа для всех родительских модулей.