ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.03.2025
Просмотров: 1277
Скачиваний: 1
СОДЕРЖАНИЕ
1.Основные понятия и подходы к тп
2. Приемы обеспечения технологичности программных продуктов
3. Определение требований к по и исходных данных для его проектирования
4. Анализ требований и определение спецификации по при структурном подходе
5. Проектирование программного обеспечения при структурном подходе
6. Анализ требований и определение спецификаций программного обеспечения при объектном подходе
7. Проектирование по при объектном подходе
8.1. Виды контроля качества разрабатываемого по.
8.2. Формирование тестовых наборов
8.4. Функциональное тестирование
8.5. Тестирования модулей и комплексное тестирование
9. Отладка программного обеспечения
9.2. Методы отладки программного обеспечения
Нисходящий подход. При использовании нисходящего подхода применяют иерархический, операционный и комбинированный методы определения последовательности проектирования и реализации компонентов. Иерархический метод предполагает выполнение разработки строго по уровню. Исключения допускаются при наличии зависимости по данным, то есть если обнаруживается, что некоторый модуль использует результаты другого, то его рекомендуется программировать после этого модуля. Основная проблема этого метода – большое количество достаточно сложных заглушек. Также основное количество модулей разрабатывается и реализуется в конце работы над проектом, что затрудняет распределение человеческих ресурсов. Операционный метод связывает последовательность разработки модулей с порядком их выполнения при запуске программы. Применение метода усложняется тем, что порядок выполнения модулей может зависеть от данных. Кроме этого модули вывода результатов (хотя они вызываются последними) должны разрабатываться вначале. С точки зрения распределения человеческих ресурсов сложным является начало работы, пока не закончены все модули, находящиеся на так называемом критическом пути. Комбинированный метод учитывает факторы, влияющие на последовательность разработки:
достижимость модуля (наличие всех модулей в цепочке вызова данного модуля),
зависимость по данным (модули, формирующие некоторые данные, должны создаваться раньше обрабатывающих),
обеспечение возможности выдачи результатов,
готовность вспомогательных модулей,
наличие необходимых ресурсов.
Нисходящий подход допускает нарушение нисходящей последовательности разработки компонентов в специально оговоренных случаях. Этот подход обычно используют и при ООП. Нисходящий подход обеспечивает:
максимально полное определение спецификации проектируемого компонента и согласованность компонентов между собой.
раннее определение интерфейса пользователя, демонстрация которого заказчику, позволяет уточнить требования к создаваемому ПО.
возможность нисходящего тестирования и комплексной отладки.
2.4.Структурное и неструктурное программирование. Средства описания структурных алгоритмов.
Структурное программирование – это один из способов обеспечения высокого уровня технологичности разрабатываемого ПО.
Существует три вида вычислительного процесса:
линейный, 2)разветвляющий, 3) цикличный.
Для реализации этих процессов в программировании используют соответствующие управляющие операторы. Для изображения схем алгоритмов таких программ был разработан ГОСТ 19.701-90.
После того, как в 60-х годах было доказано, что любой сколь угодно сложный алгоритм можно представить с использованием трех основных управляющих конструкций, в языках программирования высокого уровня появились управляющие операторы для реализации этих конструкций. К базовым конструкциям относятся:
1) следования,
2) ветвления,
3) цикл “пока”.
Кроме базовых процедурные языки программирования обычно используют еще три конструкции, которые можно составить из базовых:
выбор – case
цикл “до”
цикл for.
Любая дополнительная конструкция легко реализуется через базовые. Эти шесть конструкций были положены в основу структурного программирования.
1).
2).
3).
Дополнительные конструкции:
1).
2).
3).
Рис.2.7.
Слово структурное в данном случае подчеркивает тот факт, что при программировании используются только эти структуры.
Кроме схем для описания алгоритмов можно использовать псевдокоды, flow-диаграммы и диаграммы Насси - Шнейдермана. Все эти нотации базируются на тех же основных структурах, но допускают разные уровни детализации.
Псевдокод – это формализованное текстовое описание алгоритма. Текстовая нотация. В литературе предложено несколько вариантов псевдокодов.
Flow-диаграммы (формы) – графическая нотация описания структурных алгоритмов, которая иллюстрирует вложенность структур. Каждый символflow-формы соответствует управляющей структуре и изображается прямоугольником.
|
<g1> |
|
<g2> |
|
<g3> |
|
если <условие> |
|
|
то |
<g1> |
|
|
|
|
иначе |
<g2> |
|
|
|
|
пока <условие> |
|
|
|
<g1> |
|
|
|
|
|
|
|
|
<g1> |
|
до <условие> |
|
Рис.2.8.
Диаграммы Насси - Шнейдермана являются развитием flow-форм. Основное отличие в том, что область обозначений условий и вариантов ветвления изображается в виде треугольников.
Рис.2.9.
Общим недостатком flow-форм и диаграмм Насси - Шнейдермана является сложность построения изображений для больших алгоритмов.
2.5. Стиль оформления программ.
С точки зрения технологичности считают стиль оформления программы, обеспечивающий ее восприятие автором и другими программистами, наилучшим. Стиль оформления включает:
правила именования объектов программ
правила оформления модулей
стиль оформления текстов модулей.
Имя объекта должно соответствовать его содержанию, для визуального разделения имен используется знак подчеркивания. Следует избегать близких по написанию имен.
Правила оформления модуля
Каждый модуль должен иметь заголовок, который как минимум содержит название модуля, краткое описание его назначения, краткое описание входных и выходных параметров с указанием единиц измерения, список используемых вызываемых модулей, краткое описание алгоритма (метода и/или ограничений), ФИО автора, идентифицирующую информацию.
Пример:
{Функция: Length_Path (n: word; L: array of real)
Цель: определение суммарной длины отрезков.
Исходные данные:
n- количество отрезков,
L– массив длин отрезков (в метрах)
Результат: длина (в метрах).
Вызываемые модули: нет.
Описание алгоритма:
отрезки суммируются методом накопления,
n>=0
Дата: 9.11.2004
Версия: 1.01
Автор:
Исправления: нет }
Стиль оформления текстовых модулей
Определяет использование отступов, пропусков строк и комментариев. Обычно пропуски строк и комментариев используют для визуального разделения частей модуля. Для языков Pascal, C++, Java использование отступов позволяет прояснить структуру программы. Обычно дополнительный отступ обозначает вложение операторов языка. Сложнее обстоит дело с комментариями. Не нужно переводить с английского языка каждый оператор программы. Комментировать следует цели выполнения действий и группы операторов, связанные общим действием, то есть комментарий должен содержать дополнительную неочевидную информацию. Для языков низкого уровня стиль, облегчающий понимание, предложить труднее. Здесь целесообразно комментировать и блоки операторов, и каждый оператор. Например, цикл суммирования элементов массива.
2.6. Эффективность и технологичность.
Эффективными считают программы, требующие минимального времени выполнения и/или минимального объема оперативной памяти. Особое требование к эффективности ПО предъявляют при наличии ограничений (на время реакции системы, на объем оперативной памяти и т.д.). В случае, когда обеспечение эффективности не требует серьезных временных и трудовых затрат и не приводит к существующему ухудшению технологических свойств, это требование необходимо рассматривать в первую очередь.
Разумный подход к обеспечению эффективности разрабатываемого ПО состоит в том, чтобы в первую очередь оптимизировать те элементы программы, которые существенно влияют на характеристики эффективности. Для уменьшения времени выполнения программы в первую очередь следует проанализировать циклические алгоритмы с большим числом повторений. Необходимо помнить, что многие способы снижения временных затрат приводит к увеличению объема памяти и наоборот. Не следует “платить” за увеличение эффективности снижением технологичности ПО, исключения возможны только при очень жестких требованиях и наличии соответствующего контроля за качеством. Частично проблему эффективности программ решают за программиста компиляторы. Средства оптимизации, используемые компиляторами, делят на две группы:
машинно-зависимые (ориентированы на конкретный машинный язык; выполняют оптимизацию кодов на уровне машинных команд)
машинно-независимые (выполняют оптимизацию на уровне входного языка, например, вынесение константных выражений из циклов и т. д.).
Способы экономии памяти.
Принятие мер по экономии памяти предполагает, что в каких-то случаях память использовалась неэкономно. Учитывая, что анализировать имеет смысл только операции размещения данных, существенновлияющие на характеристику эффективности, следует обращать особое внимание на выделение памяти под данные структурных типов. Прежде всего, при наличии ограничений на использование памяти следует выбирать алгоритмы обработки, не требующие дублирования исходных данных структурных типов. Если необходимы большие массивы, используемые ограниченное время, то их можно размещать в динамической памяти и удалять при завершении обработки. Необходимо помнить, что при передаче структурных данных в подпрограмму по значению, копии этих данных размещаются в стеке. Избежать копирования иногда удается, если данные передавать по ссылке, но не изменяя их (const). В этом случае в стеке размещается только адрес данных.
Способы уменьшения времени выполнения.
В первую очередь необходимо анализировать циклические участки программы с большим числом повторений. При их написании при возможности необходимо:
выносить вычисления константных, то есть не зависящих от параметров цикла, выражений из цикла;
избегать длинных операций умножения и деления, заменяя их сложением, вычитанием и сдвигом;
оптимизировать запись условных выражений, исключать лишние проверки;
минимизировать преобразование типов выражений;
исключить многократные обращения к элементам массива по индексу (так как при вычислении адреса элемента используется операция умножения на значение индекса). Первый раз прочитав из памяти элемент массива, следует запомнить его в скалярной переменной и использовать в нужных местах – избегать использования различных типов выражений и т.д.
Рассмотрим пример:
1). Пусть имеется цикл
for y:=0 to 99 do
for x:=0 to 99 do
a[320*x+y]:=s[k,l]
Оптимизируем цикл, используя, что 320=28+ 2 6
Выполняя оптимизацию можно ухудшить технологичность.
2). for k:=2 to n do