Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
06 Технологии программирования.doc
Скачиваний:
4
Добавлен:
04.09.2019
Размер:
228.86 Кб
Скачать

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

Программирование - это искусство. Тем не менее можно обобщить и систематизировать накопленный профессиональный опыт.

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

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

  1. проектирование программы;

  2. построение модели;

  3. разработка алгоритма;

  4. реализация алгоритма;

  5. анализ алгоритма и его сложности;

  1. тестирование программы;

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

Краткое описание этих этапов.

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

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

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

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

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

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

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

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

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

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

Чтобы приступить к решению задачи, необходимо точно ее сформулировать. В первую очередь, это означает определение исходных и выходных данных, т.е. ответы на вопросы:

а) что дано?

б) что нужно найти?

Дальнейшая детализация постановки задачи представляет собой ответы на серию вопросов такого рода:

  • как определить решение?;

  • каких данных не хватает и все ли они нужны?;

  • какие сделаны допущения? и т. п.

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

Модуль - небольшая, относительно самостоятельная программа, взаимодействующая с другими модулями по определенным правилам.

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

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

Функциональная определенность состоит в том, что модуль выполняет функции, свойственные только ему одному.

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

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

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

• облегчается контроль хода разработки, так как появляются отдельные «контрольные точки»;

• упрощается проектирование программы и внесение в нее изменений.

Недостатки:

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

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

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

1. Модуль может транслироваться отдельно от остальной программы, он является отдельной программной единицей.

2. Модуль может активироваться (выдаваться) другим модулем или средствами операционной системы.

3. К модулю можно обращаться по имени.

4. Из одного модуля возможны обращения к другим модулям.

5. Модуль имеет один вход и один выход. Добавить картинки для пояснения!!!

6. После выполнения модуль возвращает управление в точку вызова.

7. Модуль может вызываться многократно и не должен сохранять историю предыдущих вызовов.

8. Модуль обладает единственной функцией.

9. Модуль пишется на одном языке программирования (обладает лексической однородностью).

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

Обычно текст модуля занимает не более двух страниц.

Так как модуль является независимой программной единицей, на него составляют паспорт (краткое описание функций и интерфейсов) и включают описание модуля в документацию.

Спецификация модуля включает:

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

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

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

  • вход/выход — формальные и фактические параметры, глобальные, локальные и связанные переменные;

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

формальные параметры -

фактические параметры -

локальные переменные

глобальные переменные -

связанные переменные - общие для ряда модулей

Проектирование программы - это процесс преобразования постановки задачи в план решения (алгоритм).

Этапы проектирования:

- определение состава модулей,

- определение функций модулей,

- разработка алгоритмов модулей.

Методы проектирования программ:

- нисходящее проектирование или проектирование «сверху вниз»

- восходящее проектирование или проектирование «снизу вверх»

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

На рис 4.2 представлены: а) начальный уровень; б) выделение функций второго уровня; в) функции третьего уровня.

Рис. 4.2 Метод нисходящего проектирования

А где рис. 4.1?????

Нисходящее проектирование

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

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

Есть объяснение проще.

Допустим в языке программирования имеется оператор, реализующий решаемую задачу. Тогда для решения поставленной задачи достаточно вызвать этот оператор: Call operator(параметры)

Так как такого оператора нет – задачу следует разбить на несколько самостоятельных частей (модулей) и для каждой из этих частей следует найти оператор языка программирования. Если такого оператора нет – следует продолжить разбиение на более мелкие модули (модули более низкого уровня), пока для каждого из модулей не будут выделены функции, реализация которых не вызовет затруднений.

Схема, показанная на рис. 4.3 называется структурной схемой программы. Структурная схема программы отражает подчиненность модулей.

Правила разработки схемы:

    1. допускается вызов любого подчиненного модуля своей ветви;

    2. запрещается вызов вышестоящих модулей и модулей своего уровня;

    3. управление всегда возвращается вызывающему модулю.

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

После построения варианта структуры выполняется критический анализ, в ходе которого проверяется:

  1. все ли функции предусмотрены;

  2. есть ли функции, реализация которых рассредоточена по нескольким модулям;

  3. есть ли модули, реализующие несколько функций.

По результатам анализа структурная схема дорабатывается.

После разработки структурной схемы приступают к разработке модулей. На этом этапе применяют два метода: восходящей или нисходящей разработки.

Восходящая разработка

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

Нисходящая разработка

Метод нисходящей разработки призван ликвидировать эту проблему. Программирование модулей начинается сверху, т.е. сначала программируется модуль самого верхнего уровня, а затем — более низкого. Для того чтобы мог быть отлажен модуль верхнего уровня, используют «заглушки» вызываемых им модулей более низкого уровня. Заглушка — фиктивный модуль, который после обращения к нему (вызова) возвращает допустимое значение. Фактически заглушка содержит операторы, оформляющие заголовок и конец модуля и несколько простейших операторов присваивания.

Преимущества метода:

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

Недостаток метода:

- дополнительные расходы на создание различных вариантов заглушек для отладки программы.

На практике обычно применяют некое компромиссное решение.

Этап программирования является одним из наиболее трудоемких. На этапе программирования осуществляется разработка алгоритмов модулей и их кодирование методом структурного программирования.

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

  • повышение производительности труда программистов;

  • улучшение «читаемости» и «понятности» программы;

  • облегчение и ускорение отладки программы.

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

Перечень стандартных структур рассматривается в п. 6.3.

В любом языке программирования есть средства (операторы), реализующие эти структуры. Каждая структура имеет один вход и один выход. Любой блок в этих структурах может быть заменен на любую структуру, не изменяя остальные части программ. Замена любой стандартной структуры в программе одним блоком также не оказывает влияния на остальную часть программы. Разработка алгоритма программы начинается с представления ее одним функциональным блоком, затем этот блок заменяется одной из канонических структур (детализируется) и т.д. до тех пор, пока каждому блоку не будет соответствовать один оператор языка программирования.

Рекомендации по записи текста программы:

  • в каждой строке записывается один оператор;

  • операторы записываются с использованием отступов — так, чтобы по тексту программы были видны «вложенные» операторы по каждому уровню.

Любая программа создается для обработки данных. Входные и выходные данные известны перед началом разработки. Решение о составе и структуре внутренних (рабочих) данных принимаются в процессе проектирования и разработки. В вычислительных задачах вариантов представления данных немного: скаляры, векторы, матрицы. В экономической сфере проектирование структур данных является специальной задачей, и ее удачное решение определяет эффективность созданной программы. Изменение структур данных неизбежно приводит к изменению алгоритмов обработки и, следовательно, к изменению программ. Изменение структур данных может быть вызвано уточнением постановки задачи, изменением объектов предметной области, которые эти данные описывают. Например, объектом реального мира является документ «Накладная»; потребовалось удалить/внести в этот документ какие-либо реквизиты. В результате должны быть внесены изменения в структуры данных, алгоритм и текст программы. Возможно, изменения затронут не один модуль, а цепочку модулей.

Во многом проблемы такого вида призвано решать объектно-ориентированное программирование.