Проектирование является одной из основных фаз жизненного цикла программного обеспечения. Задачей этапа проектирования является исследование структуры системы и логических взаимосвязей ее элементов. На этапе проектирования создается структура будущей программы.
Современный подход к проектированию программ основан на декомпозиции задачи, которая в свою очередь основана на использовании абстракций. Целью при декомпозиции является создание модулей, которые представляют собой небольшие, относительно самостоятельные программы, взаимодействующие друг с другом. Если эта цель достигнута, то разработка отдельных модулей может осуществляться различными людьми независимо друг от друга, при этом объединенная программа будет функционировать правильно.
Сначала производится проектирование архитектуры программной системы. Это предполагает первичную стадию проектирования структуры системы.
Следующим шагом является детальное проектирование. На этом этапе происходит процедурное описание программы, выбор и оценка алгоритма для реализации каждого модуля.
Для проектирования модульных программ применяются два основных метода: нисходящего и восходящего проектирования.
В соответствие с методом нисходящего проектирования сначала кодируются, тестируются и отлаживаются модули самого высокого уровня.
Применение метода нисходящего проектирования основано на пошаговой детализации решения задачи. Начиная с верхних, самых общих шагов, на каждом следующем происходит все большее уточнение функций, выполняемых программой, до полной их реализации.
Метод нисходящего проектирования позволяет обнаружить и исправить ошибки взаимосвязи блоков и логические ошибки на более ранних этапах программирования, когда внесение изменений еще не приводит к коренной перестройке всей программы.
Основная идея метода нисходящего проектирования – не пытаться программировать сразу. Пошаговая детализация автоматически заставляет программиста формировать понятную ему же структуру программы. Аккуратное проектирование приводит к тому, что программист хорошо представляет себе работу каждой конкретной подзадачи, ее входные и выходные данные, и потому в состоянии протестировать именно ее. Также упрощается и последующая отладка – при получении неверного результата программа может быть протрассирована, и проверка результата на очередном шаге сведется к пониманию, верно или неверно отработала очередная подзадача.
Достоинства метода пошаговой детализации:
• сохраняется целостность программы: от сложного к простому;
• проектирование программы, кодирование, проверку и документирование можно делать параллельно;
• в каждый момент времени, даже в начале разработки имеется работающий вариант программы.
По методу восходящего проектирования в первую очередь разрабатываются модули самого нижнего уровня. Эти модули, работоспособность которых уже проверена, включаются в разрабатываемые модули более высокого уровня.
Методу восходящего проектирования присущ ряд недостатков:
1) выявление ошибок алгоритма и сопряжений блоков осуществляется в конце разработки, что усложняет процесс внесения изменений;
2) при переходе на новый уровень требуются новые тестовые данные, что увеличивает трудоемкость разработки;
3) затрудняется процесс отладки, т.к. на каждом новом уровне тестированию подвергается все большее число блоков и связей.
Оба метода обладают как достоинствами, так и недостатками. При нисходящем проектировании до его завершения остаются неизвестными размер программы и ее эксплуатационные характеристики, так как они определяются в основном модулями нижнего уровня. А в методе восходящего проектирования принципиальные ошибки в проекте модулей нижнего уровня будут выявлены лишь на заключительной стадии работы.
На практике наилучшие результаты дает сочетание обоих методов. В таких случаях первый шаг разработки программы заключается в создании общей логической структуры, а затем общих модулей при котором сначала создаются модули верхних уровней и самые критичные модули нижнего уровня, которые наиболее часто используются, после чего применяется метод проектирования «сверху-вниз».