Цель модульного программирования. Основные характеристики программного модуля. Методы разработки структуры программы.

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

Модульное программирование цель:и обеспечение независимости компонент системы, и использование иерархических структур

2. Основные характеристики программного модуля.Для оценки приемлемости выделенного модуля используются некоторые критерии. Так, Хольт предложил следующие два общих таких критерия: хороший модуль снаружи проще, чем внутри;хороший модуль проще использовать, чем построить.

Майерс предлагает использовать более конструктивные характеристики программного модуля для оценки его приемлемости:размер модуля;прочность модуля;сцепление с другими модулями;рутинность модуля(независимость от предыстории обращений к нему).

Размер модуля измеряется числом содержащихся в нем операторов (строк). Модуль не должен быть слишком маленьким или слишком большим(неск.деся-сотен операторов)

Прочность модуля-это мера его внутренних связей.Чем выше прочность модуля,тем больше связей он может спрятать от внешнейпо отношению к нему части программы и,тем больший вклад в упрощение программы он может внести. Для оценки степени прочности модуля Майерс предлагает упорядоченный по степени прочности набор из семи классов модулей.Самой слабой степенью прочности обладает модуль,прочный по совпадению.Это такой модуль,м/д эл-ми кот нет осмысленных(упорядоченность по степени прочности классов модулей не совершенна)Однако, это не очень существенно,тк только два высших по прочности класса модулей рекомендуются для использованияФункционально прочный модуль-это модуль,выполняющий(реализующий)одну какую-либо определенную функцию.При реализации этой функции такой модуль может использовать и др модули.

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

Сцепление модуля-это мера его зависимости по данным от др модулей.Хар-ся способом передачи данных.Чем слабее сцепление модуля с др.модулями,тем сильнее его независимость от др.модулей.Для оценки степени сцепления Майерс предлагает упорядоченный набор из шести видов сцепления модулей. Худшим видом сцепления модулей является сцепление по содержимому(сцепление двух модулей,когда один из них имеет прямые ссылки на содержимое другого модуля)Такое сцепление модулей недопустимо. Не рекомендуется использовать также сцепление по общей области-это такое сцепление модулей,когда неск модулей используют одну и ту же область памяти.Рутинность модуля-это его независимость от предыстории обращений к нему.Модуль будем наз.рутинным,если результат обращения к нему зависит только от значений его параметров (и не зависит от предыстории обращений к нему).Модуль будем называть зависящим от предыстории,если результат обращения к нему зависит от внутреннего состояния этого модуля, храняшего следы предыдущих обращений к нему.

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

Метод восходящей разработкис-Сначала строится модульная структура программы в виде дерева.Затем поочередно программируются модули программы,начиная с модулей самого нижнего уровня(листья дерева модульной структуры программы),в таком порядке,чтобы для каждого программируемого модуля были уже запрограммированы все модули,к кот он может обращаться.После того,как все модули программы запрограммированы,производится их поочередное тестирование и отладка в принципе в таком же (восходящем) порядке,в каком велось их программирование. современная технология не рекомендует такой порядок разработки программы,тк1.для программирования какого-либо модуля совсем не требуется текстов используемых им модулей - для этого достаточно,чтобы каждый используемый модуль был лишь специфицирован,а для тестирования его возможно используемые модули заменять их заглушками,2.каждая программа в какой-то степени подчиняется некоторым внутренним для нее,но глобальным для ее модулей соображениям(принципам реализации, предположениям, структурам данных и т.п.),что определяет ее концептуальную целостность и формируется в процессе ее разработки.3.при восходящем тестировании для каждого модуля (кроме головного) приходится создавать ведущую программу (модуль),кот должна подготовить для тестируемого модуля необходимое состояние информационной среды и произвести требуемое обращение к нему.Это приводит к большому объему"отладочного" программирования и в то же время не дает никакой гарантии,что тестирование модулей производилось именно в тех условиях,в кот они будут выполняться в рабочей программе.

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

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