82. Модульное программирование
Модульность - организация
программы в виде относительно независимых частей -
программных модулей. Модульность тем выше, чем больше независимость модулей
друг от друга. Использование модульной структуры программ упрощает их
разработку,
отладку и
тестирование.
Модулем обычно называют совокупность связанных процедур и тех
данных, которыми они управляют
Программный модуль – программа или функционально
завершенный фрагмент программы, предназначенный для: хранения, трансляции,
объединения с другими программными модулями и загрузки в оперативную память.
Различают: стандартные модули, входящие в язык
программирования и пользовательские модули, предназначенные для упрощения
работы программистов.
Модульное программирование – метод разработки
программ, предполагающий разбиение программы на независимые модули.
Модульное программирование основано на понятии
модуля - логически взаимосвязанной совокупности функциональных
элементов, оформленных в виде отдельных программных модулей
Модули содержат определение доступных для обработки данных,
операции обработки данных, схемы взаимосвязи с другими модулями.
Каждый модуль состоит из спецификации и тела.
Спецификации определяют правила использования модуля, а тело - способ реализации
процесса обработки.
Модульная структура программных продуктов
Принципы модульного программирования программных продуктов во
многом сходны с принципами нисходящего проектирования. Сначала определяются
состав и подчиненность функций, а затем - набор программных модулей, реализующих
эти функции.
Однотипные функции реализуются одними и теми же модулями.
Функция верхнего уровня обеспечивается главным модулем; он управляет
выполнением нижестоящих функций, которым соответствуют подчиненные
модули.
При определении набора модулей, реализующих функции
конкретного алгоритма, необходимо учитывать следующее:
1. каждый модуль вызывается на
выполнение вышестоящим модулем и, закончив работу, возвращает управление
вызвавшему его модулю;
2. принятие основных решений в
алгоритме выносится на максимально "высокий" по иерархии уровень;
3. для использования одной и
той же функции в разных местах алгоритма создается
один модуль, который вызывается на выполнение по мере необходимости. В
результате дальнейшей детализации алгоритма
создается функционально-модульная схема
(ФМС) алгоритма приложения, которая является
основой для программирования.
Состав и вид программных модулей, их назначение и характер
использования в программе в значительной степени определяются инструментальными
средствами. Например, применительно к средствам СУБД отдельными модулями могут
быть:
1. экранные формы ввода и/или
редактирования информации базы данных;
2. отчеты генератора отчетов;
3. макросы;
4. стандартные процедуры
обработки информации;
5. меню, обеспечивающее выбор
функции обработки и др.
В качестве модульной структуры программы принято использовать
древовидную структуру, включая дерево со сросшимися ветвями. В узлах такого
дерева размещаются программные модули, а направленные дуги (стрелки) показывают
статическую подчиненность модулей, т.е. каждая дуга показывает, что в тексте
модуля, из которого она исходит, имеется ссылка на модуль, в который она входит.
Другими словами, каждый модуль может обращаться к подчиненным ему модулям, т.е.
выражается через эти модули. При этом модульная структура программы, в конечном
счете, должна включать и совокупность спецификаций модулей, образующих эту
программу. Спецификация программного модуля содержит,
во-первых, синтаксическую спецификацию его входов, позволяющую построить на
используемом языке программирования правильное обращение к нему (к любому его
входу), и, во-вторых, функциональную спецификацию модуля (описание семантики
функций, выполняемых этим модулем по каждому из его входов).
Основные характеристики программного модуля
Размер модуля измеряется числом содержащихся в
нем операторов (строк). Модуль не должен быть слишком маленьким или слишком
большим. Маленькие модули приводят к громоздкой модульной структуре программы и
могут не окупать накладных расходов, связанных с их оформлением. Большие модули
неудобны для изучения и изменений, они могут существенно увеличить суммарное
время повторных трансляций программы при отладке программы. Обычно рекомендуются
программные модули размером от нескольких десятков до нескольких сотен
операторов.
Прочность модуля - это мера его внутренних
связей. Чем выше прочность модуля, тем больше связей он может спрятать от
внешней по отношению к нему части программы и, следовательно, тем больший вклад
в упрощение программы он может внести. Самой слабой степенью прочности обладает
модуль, прочный по совпадению. Это такой модуль, между элементами
которого нет осмысленных связей. Такой модуль может быть выделен, например, при
обнаружении в разных местах программы повторения одной и той же
последовательности операторов, которая и оформляется в отдельный модуль.
Необходимость изменения этой последовательности в одном из контекстов может
привести к изменению этого модуля, что может сделать его использование в других
контекстах ошибочным. Такой класс программных модулей не рекомендуется для
использования.
Функционально прочный модуль - это модуль, выполняющий
(реализующий) одну какую-либо определенную функцию. При реализации этой функции
такой модуль может использовать и другие модули. Такой класс программных модулей
рекомендуется для использования.
Информационно прочный модуль - это модуль, выполняющий
(реализующий) несколько операций (функций) над одной и той же структурой данных
(информационным объектом), которая считается неизвестной вне этого модуля. Для
каждой из этих операций в таком модуле имеется свой вход со своей формой
обращения к нему. Такой класс следует рассматривать как класс программных
модулей с высшей степенью прочности. Информационно-прочный модуль может
реализовывать, например, абстрактный тип данных.
Сцепление модуля - это мера его зависимости по
данным от других модулей. Характеризуется способом передачи данных. Чем слабее
сцепление модуля с другими модулями, тем сильнее его независимость от других
модулей.
Рутинность модуля - это его независимость от
предыстории обращений к нему. Модуль будем называть рутинным, если
результат (эффект) обращения к нему зависит только от значений его параметров (и
не зависит от предыстории обращений к нему). Модуль будем называть зависящим
от предыстории, если результат (эффект) обращения к нему зависит от
внутреннего состояния этого модуля, храняшего следы предыдущих обращений к нему.
Порядок разработки программного модуля
При разработке программного модуля целесообразно
придерживаться следующего порядка:
1) изучение и проверка спецификации модуля, выбор языка
программирования;
2) выбор алгоритма и структуры данных;
3) программирование модуля;
4) шлифовка текста модуля;
5) проверка модуля;
6) компиляция модуля.
Первый шаг разработки программного модуля в
значительной степени представляет собой смежный контроль структуры программы
снизу: изучая спецификацию модуля, разработчик должен убедиться, что она ему
понятна и достаточна для разработки этого модуля. В завершении этого шага
выбирается язык программирования.
На втором шаге разработки программного модуля
необходимо выяснить, не известны ли уже какие-либо алгоритмы для решения
поставленной и/или близкой к ней задачи. И если найдется подходящий алгоритм, то
целесообразно им воспользоваться. Выбор подходящих структур данных, которые
будут использоваться при выполнении модулем своих функций, в значительной
степени предопределяет логику и качественные показатели разрабатываемого модуля,
поэтому его следует рассматривать как весьма ответственное решение.
На третьем шаге осуществляется построение текста
модуля на выбранном языке программирования. Обилие всевозможных деталей, которые
должны быть учтены при реализации функций, указанных в спецификации модуля,
легко могут привести к созданию весьма запутанного текста, содержащего массу
ошибок и неточностей. Искать ошибки в таком модуле и вносить в него требуемые
изменения может оказаться весьма трудоемкой задачей.
Следующий шаг разработки модуля связан с
приведением текста модуля к завершенному виду в соответствии со спецификацией
качества ПС. При программировании модуля разработчик основное внимание уделяет
правильности реализации функций модуля, оставляя недоработанными комментарии и
допуская некоторые нарушения требований к стилю программы. При шлифовке текста
модуля он должен отредактировать имеющиеся в тексте комментарии и, возможно,
включить в него дополнительные комментарии с целью обеспечить требуемые
примитивы качества. С этой же целью производится редактирование текста программы
для выполнения стилистических требований.
Шаг проверки модуля представляет собой ручную
проверку внутренней логики модуля до начала его отладки (использующей выполнение
его на ЭВМ), реализует общий принцип, сформулированный для технологии
программирования.
И, наконец, последний шаг разработки модуля
означает переход к процессу отладки модуля.
Контроль структуры программы.
Для контроля структуры программы можно использовать три
метода:
• статический
контроль,
• смежный контроль,
• сквозной
контроль.
Статический контроль состоит в оценке структуры
программы сточки зрения хорошо ли программа разбита на модули с учетом значений
рассмотренных выше основных характеристик модуля.
Смежный контроль сверху - это контроль со
стороны разработчиков архитектуры и внешнего описания ПС. Смежный контроль
снизу - это контроль спецификации модулей со стороны разработчиков этих
модулей.
Сквозной контроль - это мысленное прокручивание
(проверка) структуры программы при выполнении заранее разработанных тестов.
Является видом динамического контроля так же, как и ручная имитация
функциональной спецификации или архитектуры ПС.
Следует заметить, что характер осуществления этих методов
контроля зависит от выбранного метода разработки структуры программы: при
классическом подходе они применяются до начала программирования модулей, а при
конструктивном и архитектурном подходах - в процессе программирования модулей (в
подходящие моменты времени).