Проектирование программ

Современный подход к проектированию программ основан на декомпозиции задачи. Целью декомпозиции является создание модулей, которые представляют собой небольшие, относительно самостоятельные программы, взаимодействующие друг с другом по хорошо определенным и простым правилам.

Разработка любой программы или прикладной системы начинается с определения требований к ней для конкретного набора пользователей и заканчивается эксплуатацией системы этими пользователями.

По современным взглядам проектирование и разработку программ целесообразно разбить на ряд последовательных этапов:

1) постановка задачи;

2) проектирование программы;

3) построение модели;

4) разработка алгоритма;

5) реализация алгоритма;

6) анализ алгоритма и его сложности;

7) тестирование программы;

8) документирование.

При постановке задачи для крупных компьютерных программ необходимо провести следующие работы:

· выработать требования (свойства, качества и возможности), необходимые для решения проблемы или достижения цели (как правило, эта деятельность носит экспертный характер);

· разработать спецификации, включающие:

- цель программы;

- граничные условия;

- описание функций системы;

- спецификации входных и выходных данных;

- верификационные требования (установление тестовых случаев);

- тип и количество документов.

Проектирование программы осуществляется следующим образом. Сначала производится проектирование архитектуры программной системы. Это предполагает первичную (общую) стадию проектирования и заканчивается декомпозицией спецификаций в структуру системы. Обычно на модульном уровне разрабатывается спецификация каждого модуля:

· имя/цель — дается имя модулю и предложение о его функции с формальными параметрами;

· неформальное описание — обзор действий модуля;

· ссылки — какие модули ссылаются на него и на какие модули ссылается данный модуль;

· вход/выход — формальные и фактические параметры, глобальные, локальные и связанные (общие для ряда модулей) переменные;

· примечания — полезные комментарии общего характера по модулю.

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

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

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

Технология построения модели при индуктивном способе:

1) эмпирический этап (умозаключение, интуиция, предположение, гипотеза);

2) постановка задачи для моделирования;

3) оценка, количественное и качественное описание;

4) построение модели.

Разработка алгоритма — самый сложный и трудоемкий процесс, но и самый интересный в творческом отношении. Выбор метода разработки зависит от постановки задачи, ее модели. На этом этапе необходимо провести анализ правильности алгоритма, что очень непросто и трудоемко.

Наиболее распространенная процедура доказательства правильности алгоритма — это прогон его на множестве различных тестов. Однако это не гарантирует того, что не может существовать случая, в котором программа «не сработает».

На этапе реализации алгоритмапроисходят конструирование и реализация алгоритма, включающие кодирование, интеграцию, тестирование (сертификацию).

По сути, проводится перевод проекта в форму программы для конкретного компьютера, сборка системы и ее прогон при тестовых и нормальных условиях для подтверждения ее работы в соответствии со спецификациями системы.

Анализ алгоритма и его сложности необходим для оценки ресурсов компьютеров, на которых он будет работать, времени обработки конкретных данных, приспособления в работе в локальных сетях и телекоммуникациях. Хотелось бы также иметь для данной задачи количественный критерий для сравнения нескольких алгоритмов с целью выбора более простого и эффективного среди них.

Перед началом эксплуатации программы необходим этап ее отладки и тестирования.

Тестирование — это процесс исполнения программ с целью выявления (обнаружения) ошибок. Тестирование — процесс деструктивный, поэтому считается, что тест удачный, если обнаружена ошибка.

Существуют различные способы тестирования программ:

· тестирование программы как «черного ящика» — стратегия «черного ящика» определяет тестирование с анализом входных данных и результатов работы программы.

· тестирование программы как «белого ящика» заключается в стратегии управления логикой программы, позволяет использовать ее внутреннюю структуру.

Различают альфа- и бета-тестирование, производимое соответственно специалистами разработчика и заказчика программного изделия.

Основные типы ошибок, встречающихся при программировании:

· обращения к переменным, значения которым не присвоены или не инициализированы;

· выход индексов за границы массивов;

· несоответствие типов или атрибутов переменных величин;

· явные или неявные проблемы адресации памяти;

· ошибочные передачи управления;

· логические ошибки.

Есть золотое правило программистов — оформляй свои программы в том виде, в каком бы ты хотел видеть программы, написанные другими. К каждому конечному программному продукту необходимо документированное сопровождение в виде помощи (help), файлового текста (readme.txt).