10645

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

Реферат

Информатика, кибернетика и программирование

Тема: Обеспечения технологичности программных продуктов 1.Структурное и неструктурное программирование. Средства описания структурных алгоритмов. Стиль оформления программы. 2. Эффективность и технологичность. 3. Программирование

Русский

2013-03-29

617 KB

26 чел.

PAGE  10

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

1.Структурное и «неструктурное» программирование. Средства описания структурных алгоритмов. Стиль оформления программы.

2. Эффективность и технологичность.

3. Программирование «с защитой от ошибок». Сквозной структурный контроль.

1. Структурное и «неструктурное» программирование. Средства описания структурных алгоритмов

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

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

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

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

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

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

Для реализации указанных вычислительных процессов в программах используют соответствующие управляющие операторы.

После того, как в 60-х годах XX в. было доказано, что любой сколь угодно сложный алгоритм можно представить с использованием трех основных управляющих конструкций, в языках программирования высокого уровня появились управляющие операторы для реализации соответствующих конструкций. Эти три конструкции принято считать базовыми.

Рис. 1. Базовые алгоритмические структуры: а — следование; б- ветвление; в - цикл-пока

К ним относят конструкции:

следование - обозначает последовательное выполнение действий (рис. 1, а);

ветвление - соответствует выбору одного из двух вариантов действий (рис. 1, б);

цикл-пока - определяет повторение действий, пока не будет нарушено некоторое  условие,  выполнение  которого  проверяется  в  начале  цикла (рис. 1, в).

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

• выбор - обозначает выбор одного варианта из нескольких в зависимости от значения некоторой величины (рис. 2., а);

•  цикл-до - обозначает повторение некоторых действий до выполнения заданного условия, проверка которого осуществляется после выполнения действий в цикле (рис. 2., б);

•  цикл с заданным числом повторений (счетный цикл) - обозначает повторение некоторых действий указанное количество раз (рис. 2., в).

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

Перечисленные шесть конструкций были положены в основу структурного программирования.

Рис. 2. Дополнительные структуры алгоритмов:

а — выбор; б - цикл-до; в - цикл с заданным числом повторений

Слово «структурное» в данном названии подчеркивает тот факт, что при программировании использованы только перечисленные конструкции (структуры). Отсюда и понятие «программирование без goto».

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

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

• предполагает слишком низкий уровень детализации, что часто скрывает суть сложных алгоритмов;

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

Рис. 3. Схема алгоритма реализации поискового цикла:

а — неструктурный вариант; б— структурный вариант

Классическим примером последнего является организация поискового цикла с использованием неструктурной передачи управления (рис. 3, а) и эквивалентный структурный вариант (рис. 3, б).

Стиль оформления программы

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

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

Стиль оформления программы включает:

•  правила именования объектов программы (переменных, функций, типов, данных и т. п.);

•  правила оформления модулей;

• стиль оформления текстов модулей.

Правила именования объектов программы. 

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

•  имя объекта должно соответствовать его содержанию, например:

MaxItem - максимальный элемент; NextItem - следующий элемент;

•  если позволяет язык программирования, можно использовать символ «_» для визуального разделения имен, состоящих из нескольких слов, например:

Max_Item, Next_Item;

•   необходимо избегать близких по написанию имен, например:

Index и InDec.

Правила оформления модулей. 

Каждый модуль должен предваряться заголовком, который, как минимум, содержит:

• название модуля;

• краткое описание его назначения;

• краткое описание входных и выходных параметров с указанием единиц измерения;

• список используемых (вызываемых) модулей;

•  краткое описание алгоритма (метода) и/или ограничений;

•  ФИО автора программы;

•  идентифицирующую информацию (номер версии и/или дату последней корректировки). Например:

{********************************************************}

{*       Функция: Length_Path(n:word; L: array of real):real                *}

{*       Цель: определение суммарной длины отрезков                     *}

{*       Исходные данные:                                                                     *}

{*           n - количество отрезков,                                                       *}

{*           L - массив длин отрезков (в метрах)                                   *}

{*       Результат:   длина (в метрах)                                                   *}

{*       Вызываемые модули: нет                                                         *}

{*       Описание алгоритма:                                                                *}

{*               отрезки суммируются методом накопления, n>0          *}

{*       Дата: 25.12.2001    Версия 1.01.                                               *}

{*       Автор: Иванов И.И.                                                                  *}

{*       Исправления:   нет                                                                    *}

{********************************************************}

Стиль оформления текстов модулей.

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

{проверка количества отрезков и выход, если отрезки не заданы}

 if n<0 then

                    begin

                       WriteLn('Количество отрезков отрицательно');

                       exit;

                    end;

{цикл суммирования длин отрезков}

S:=0;

for i:=0 to n-1 do S:=S + Len[i];

Для таких языков, как Pascal, C++ и Java, использование отступов позволяет прояснить структуру программы:

обычно дополнительный отступ обозначает вложение операторов языка, например:

аmах: =а[1,1];

for i:=l to n do

    for j:=1 to m do

          if a[i,j]>amax then amax:=a[i,j];

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

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

{проверка условия и выход, если условие не выполняется}

if n<0 then

                 begin

writeln ('Количество отрезков отрицательно');

 exit;

                 end;

2. Эффективность и технологичность

Традиционно эффективными считают программы, требующие минимального времени выполнения и/или минимального объема оперативной памяти.

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

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

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

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

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

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

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

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

•  машинно-независимые выполняют оптимизацию на уровне входного языка, например, вынесение вычислений константных (независящих от индекса цикла) выражений из циклов и т. п.

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

Способы экономии памяти. 

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

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

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

Также следует помнить, что при передаче структурных данных в подпрограмму «по значению» копии этих данных размещаются в стеке. Избежать копирования иногда удается, если передавать данные «по ссылке», но как неизменяемые (описанные const). В последнем случае в стеке размещается только адрес данных, например:

Type Massiv=array[1..100] of real;

function Summa(Const a:Massiv; ...)...

Способы уменьшения времени выполнения. 

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

При их написании необходимо по возможности:

•  выносить вычисление константных, т. е. не зависящих от параметров цикла, выражений из циклов;

•  избегать «длинных» операций умножения и деления, заменяя их сложением, вычитанием и сдвигами;

• минимизировать преобразования типов в выражениях;

•  оптимизировать запись условных выражений - исключать лишние проверки;

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

•  избегать использования различных типов в выражении и т. п.

3. Программирование «с защитой от ошибок»

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

Рис. 4. Способы проявления ошибок процессов.

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

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

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

Детальный анализ ошибок и их возможных ранних проявлений показывает, что целесообразно проверять:

• правильность выполнения операций ввода-вывода;

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

Проверки правильности выполнения операций ввода-вывода.

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

При этом принято различать:

•  ошибки передачи - аппаратные средства, например, вследствие неисправности, искажают данные;

•  ошибки преобразования - программа неверно преобразует исходные данные из входного формата во внутренний;

•  ошибки перезаписи - пользователь ошибается при вводе данных, например, вводит лишний или другой символ;

• ошибки данных - пользователь вводит неверные данные.

Ошибки передачи обычно контролируются аппаратно.

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

Обнаружить и устранить ошибки перезаписи можно только, если пользователь вводит избыточные данные, например контрольные суммы. Если ввод избыточных данных по каким-либо причинам нежелателен, то следует по возможности проверять вводимые данные, хотя бы контролировать интервалы возможных значений, которые обычно определены в техническом задании, и выводить введенные данные для проверки пользователю.

Неверные данные обычно может обнаружить только пользователь.

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

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

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

Например:

•  если каким-либо образом вычисляется индекс элемента массива, то следует проверить, что этот индекс является допустимым;

•  если строится цикл, количество повторений которого определяется значением переменной, то целесообразно убедиться, что значение этой переменной не отрицательно;

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

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

избегать вычитания близких чисел (машинный ноль);

избегать деления больших чисел на малые;

•  сложение длинной последовательности чисел начинать с меньших по абсолютной величине;

•  стремиться по возможности уменьшать количество операций;

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

• не использовать условие равенства вещественных чисел;

• вычисления производить с двойной точностью, а результат выдавать - с одинарной.

Обработка исключений. Поскольку полный контроль данных на входе и в процессе вычислений, как правило, невозможен, следует предусматривать перехват обработки аварийных ситуаций.

Для перехвата и обработки аппаратно и программно фиксируемых ошибок в некоторых языках программирования, например, Delphi Pascal, C++ и Java, предусмотрены средства обработки исключений. Использование этих средств позволяет не допустить выдачи пользователю сообщения об аварийном завершении программы, ничего ему не говорящего. Вместо этого программист получает возможность предусмотреть действия, которые позволят исправить эту ошибку или, если это невозможно, выдать пользователю сообщение с точным описанием ситуации и продолжить работу.

Сквозной структурный контроль

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

Термин «сквозной» в названии отражает выполнение контроля на всех этапах разработки.

Термин «структурный» означает наличие четких рекомендаций по выполнению контролирующих операций на каждом этапе.

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

Одна из первых сессий должна быть организована на этапе определения спецификаций.

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

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

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

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

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

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


 

А также другие работы, которые могут Вас заинтересовать

33204. Особенности развития внимания 15.43 KB
  Устойчивость внимания с возрастом меняется. Для детей с нарушениями слуха характерно более позднее становление высшей формы внимания т. произвольного и опосредствованного что обусловлено более поздним формированием умений использовать средства организации внимания управление им а также отставанием в развитии речи способствующей организации и управлению собственным поведением.
33205. Память как хранитель информации 15.52 KB
  Глухие дети раньше познают в объектах специфическое чем особое и общее отмечают несущественные детали в ущерб главным но менее заметным. Значительно больше глухие отстают в запоминании слов обозначающие звуковые явления. Глухие запоминают больше слов обозначающих качество предметов воспринимаемых тактильно. Часто глухие школьники заменяют слова глаголы из области слуховых представлений словами глаголами связанными со зрительной вибрационной и тактильной сферами.
33206. РАЗВИТИЕ СЛОВЕСНОЙ ПАМЯТИ 17.46 KB
  На успешность запоминания слов оказывает влияние к какой грамматической категории относятся слова. РАЗВИТИЕ СЛОВЕСНОЙ ПАМЯТИ глухих детей проходит ряд стадий: 13 класс характеризуется распространяющимся типом запоминания при котором используется повторение. 46 классы охватывающий тип запоминания. Часто наблюдается сочетание осмысленного и механического запоминания.
33207. УСЛОВИЯ РАЗВИТИЯ ПОНЯТИЙНОГО МЫШЛЕНИЯ У ГЛУХИХ ДЕТЕЙ 16.36 KB
  УСЛОВИЯ РАЗВИТИЯ ПОНЯТИЙНОГО МЫШЛЕНИЯ У ГЛУХИХ ДЕТЕЙ Экспериментальные психологические исследования большинства ученых показали что мышление у детей с нарушениями слуха имеет целый ряд особенностей которые обусловлены вопервых более медленным и своеобразным развитием речи у этих детей и вовторых недостаточным вниманием которое уделяется формированию мыслительной деятельности детей в практике дошкольного и школьного воспитания и обучения. Исследования свидетельствуют о том что наибольшие трудности возникают у глухих детей при...
33208. ПРЕДМЕТ И ЗАДАЧИ СУРДОПСИХОЛОГИИ 13.38 KB
  Предметом сурдопсихологии являются изучение своеобразия психического развития людей с недостатками слуховой функции и установление возможностей и путей компенсации нарушений различной сложности. Задачи сурдопсихологии заключаются в следующем: выявить общие и специфические закономерности психического развития людей с нарушенным слухом по сравнению с людьми имеющими сохранный слух; изучить особенности развития отдельных видов познавательной деятельности людей с нарушенным слухом; изучить закономерности развития их личности; ...
33209. СУРДОПСИХОЛОГИЯ В РОССИИ (Краткий исторический обзор) 20.51 KB
  Лаговский писал о наличии у глухих детей остатков слуха которые могут быть активизированы и развиты. Отечественная сурдопедагогика на всех этапах своего развития придавала большое значение изучению психологических особенностей детей с нарушениями слуха для обоснования методов педагогического воздействия.Выготский столкнулся с проблемами обучения детей имеющих различные нарушения глухоту слепоту умственную отсталость; с необходимостью выявления их потенциальных возможностей и оказания им помощи. статья Принципы социального воспитания...
33210. Причины нарушений слуха 15.39 KB
  Нарушения слуха возникают в результате заболеваний поражающих наружное среднее или внутреннее ухо слуховой нерв. Если поражено внутреннее ухо и стволовая часть слухового нерва в большинстве случаев наступает глухота если же среднее ухо то чаще наблюдается частичная потеря слуха. Большую роль в возникновении нарушений слуха у ребенка играет неблагополучное протекание беременности прежде всего вирусные заболевания матери в первом триместре беременности такие как краснуха корь грипп герпес.
33211. Педагогические классификации подходов к обучению детей с нарушениями слуха 14.69 KB
  Боскис предложила новые критерии учитывающие своеобразие развития детей с нарушениями слуха: степень потери слуха; время возникновения нарушения слуха; уровень развития речи. К этой группе относят детей с такой степенью потери слуха которая лишает их возможности естественного восприятия речи и самостоятельного овладения ею. У них может быть разная степень нарушения слуха и разный уровень сохранности речи поскольку при возникновении нарушения слуха без специальной педагогической поддержки речь начинает распадаться.