По мере развития вычислительной техники сложность программ постоянно возрастала: они становились слишком громоздкими для того, чтобы их можно было охватить и представить как единое целое. Поэтому стало целесообразным применить к этому вопросу общий принцип дробления сложной задачи на мелкие подзадачи, установления между ними связей и решения каждой подзадачи независимо от других.
В программировании общее признание получил принцип построения программ из отдельных программных модулей. Каждый модуль представляет собой завершенную программу, в которой решается часть общей задачи. Для установления связей между модулями в каждом из них определяют, какие данные поступают на вход и какие данные формируются в результате выполнения.
При таком подходе программа представляется в виде иерархии модулей. Модули верхнего уровня выполняют более общие функции и вызывают модули нижних уровней, в которых детализируется решение задачи.
Для проектирования модульных программ существуют два основных метода: нисходящее и восходящее проектирование.
а) Нисходящее проектирование
Шаг 1. Проработка головной программы
Шаг 2. Детализация программы
Шаг N. Законченная программа
В данном методе сначала кодируются, тестируются и отлаживаются модули самого высокого уровня. При этом, чтобы как можно раньше начать проверку работоспособности системы, вместо модулей нижнего уровня, ещё детально не разработанных, используются заглушки. Заглушка ― это очень простой по структуре модуль, в котором входные и выходные данные соответствуют замещаемому модулю, но алгоритм обработки данных очень упрощён. Часто в заглушке помимо описания входных и выходных данных присутствует лишь один оператор печати, сообщающий, что в этом месте программы вызывается заглушка.
Применение метода нисходящего проектирования основано на пошаговой детализации решения задачи. Начиная с верхних, самых общих шагов, на каждом следующем происходит всё большее уточнение функций, выполняемых программой, до полной их реализации.
В приведённом примере на 1 шаге детально прорабатывается головная программа, которая использует функции из 2х модулей. Вместо них разработаны две заглушки. На втором шаге детализируется первый модуль, вызывающий, в свою очередь, два других модуля. Вместо них подставляются заглушки 1.1 и 1.2. На последнем шаге все заглушки заменяются полноценными модулями. На каждом шаге происходит тестирование и отладка разрабатываемой программы.
б) Восходящее проектирование
Шаг 1. Разработка модулей нижних уровней
Шаг 2. Разработка модулей верхних уровней
Шаг 3. Разработка конечной программы
По методу восходящего проектирования, наоборот, в первую очередь разрабатываются модули самого нижнего уровня. Эти модули, работоспособность которых уже проверена, включаются в разрабатываемые модули более высокого уровня. Здесь необходимость в написании программ-заглушек отпадает, но зато работоспособность программы в целом можно проверить лишь на самом последнем этапе.
В данном примере сначала создаются модули 1.1, 1.2 и 2.1, которые проверяются на работоспособность по одному. На их базе проектируются вызывающие их модули 1 и 2, которые также проверяются независимо друг от друга, но совместно с вызываемыми модулями 1.1, 1.2 и 2.1. Последней создается головная программа.
Оба метода обладают как достоинствами, так и недостатками. При нисходящем проектировании до его завершения остаются неизвестными размер программы и её эксплуатационные характеристики, так как они определяются в основном модулями нижнего уровня. Помимо этого, на последних этапах проектирования может возникнуть необходимость в структурных изменениях, требующих пересмотра уже разработанных модулей верхнего уровня. Недостатком восходящего проектирования является то, что принципиальные ошибки в проекте модулей нижнего уровня будут выявлены лишь на заключительной стадии работы.
На практике наилучшие результаты дает сочетание обоих методов, при котором сначала создаются модули верхних уровней и самых критичных нижних уровней с использованием заглушек для имитации менее существенных модулей.