Нисходящий подход. Смешанный подход.
При нисходящем подходе и проектирование, и программирование происходит сверху вниз. Такой способ разработки помогает тщательно исследовать законченную программу, так как интеграция и тестирование идут непрерывно, в течение всей разработки. Так как программирование идет сверху вниз, то вместо модулей нижнего уровня используются программные заглушки (мини-программки, позволяющие корректно запускать и работать с незаконченной программой, в целях тестирования и проверки уже написанной части программы).
Наилучшим подходом при разработке программ является комбинация иерархического и операционного подходов. Правила этого подхода:
1)Должен существовать путь управления к программируемому модулю, то есть в уже написанной части программы должна быть такая цепь модулей, по которой возможно передать управление программируемому модулю.
2)Должны быть доступны все данные, требуемые от модулей или их заглушек, создающих или изменяющих эти данные.
6 факторов, которые стоит учитывать при создании модулей:
1)Зависимость по данным.
2)Доступные ресурсы.
3)Требование обеспечить выдачу результатов модулей, проверяемых раньше.
4)Необходимость, прежде всего обеспечить готовность вспомогательных модулей.
5)Сложность модулей – при прочих равных, стоит начинать со сложных модулей.
6)Обработка исключительных ситуаций, связанных с неправильными данными – модули, которые обрабатывают правильные данные, должны программироваться и тестироваться раньше модулей, работающих с неправильными данными.
Понятие о модульном программировании.
Модуль – это последовательность логически связанных фрагментов, оформленная как отдельная часть программы.Основными преимуществами модульного программирования являются:
1)Возможность разделения работы между несколькими программистами
2)Возможность создания библиотек модулей для их дальнейшего использования.
3)Увеличение числа контрольных точек, для наблюдения за ходом выполнения проекта.
4)Облегчение тестирования
5)Облегчения процесса внесения изменений в модуль, в особенности, если эти изменения вносятся другими программистами.
Модуль имеет 3 основных атрибута:
1)Он выполняет одну или несколько функций.
2)Обладает некоторой логикой.
3)Используется в одном или нескольких контекстах.
Функция – это внешнее описание модуля, описывает, что делает модуль, но не как это делается.
Логика – описывает внутренний алгоритм модуля, то есть как он выполняет свою функцию.
Контекст – описывает конкретное применение модуля.
Чтобы уменьшить сложность программы надо разбить ее на множество небольших, в высокой степени независимых модулей. Довольно высокой степени независимости можно достичь с помощью 2 методов оптимизации:
1)Усилением внутренних связей в каждом модуле.
2)Ослаблением взаимосвязи между модулями.
Нужно стремиться реализовать отдельные функции отдельными модулями (высокая прочность модуля) и ослаблять связь между модулями по данным (слабое сцепление модулей).
Прочность модулей.
Прочность модуля – это мера его внутренних связей.
1)Модуль прочный по совпадению – это модуль, между элементами которого нет осмысленных связей. Такие модули возникают при разбиении на модули уже после написания программы.
2)Модуль прочный по логике – при каждом вызове выполняет выбранную функцию из набора связанных с ним.
3)Модуль прочный по классу – последовательно выполняет набор связанных с ним функций.
4)Процедурно-прочный модуль – последовательно выполняет набор тех связанных с ним функций, которые непосредственно относятся к процедуре решения задачи.
5)Коммуникационно-прочный модуль – процедурно-прочный модуль, с одним дополнительным ограничением. Все его функции связаны по данным.
6)Информационно-прочный модуль – выполняет несколько функций, причем все они работают с одной и той же структурой данных и каждая представляется собственным кодом.
7)Функционально-прочный модуль – выполняет одну определенную функцию, которая характеризуется как способом передачи, так и свойствами самих этих данных.
Сцепление модулей.
Сцепление модулей – мера взаимодействия модулей по данным, которая характеризуется как способом передачи данных, так и свойствами самих этих данных.
1)Два модуля сцеплены по содержимому, если один прямо ссылается на содержимое другого.
2)Группа модулей сцеплена по общей области, если они ссылаются на одну и ту же глобальную структуру данных.
3)Группа модулей сцеплена по внешним данным, если они ссылаются на один и тот же глобальный элемент данных.
4)Два модуля сцеплены по управлению, если один явно управляет функционированием другого.
5)Группа модулей сцеплена по формату, если они ссылаются на одну ту же не глобальную структуру данных.
6)Двамодуля сцеплены по данным если один вызывает другой и все входные и выходные параметры вызываемого модуля – простые элементы данных.
Дополнение в 9-10 вопросам.
В дополнение к прочности и сцеплению есть и другие характеристики оказывающие воздействие на независимость модулей. Это:
•Размеры модуля (~ от 10 до 100 операторов языка программирования).
•Предсказуемость модуля (модуль не должен хранить следы своих состояний при последующих вызовах).
•Минимизация доступа к данным.
•Отсутствие внутренних процедур.
При проектировании структуры программы имеется несколько стратегий разбиения на модули. Причем эти стратегии применяются последовательно. Разбиение «исток – преобразование – сток» предполагает деление задачи на функции, занимающиеся получением данных, изменением их формы, и затем доставкой их в некоторую точку вне задачи.
Функциональное разбиение – это деление задачи на функции, выполняющие конкретные преобразования данных.