Полезное в сети

Всегда в теме

Статистика


Яндекс.Метрика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Рекомендуем



Главная » Статьи » Образовательные » Программирование

ТЕХНОЛОГИЯ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ

1. ПОНЯТИЕ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ

Исторически сложилось так, что императивные языки в настоящее время доминируют в программировании. Однако ис­следования, проведенные в 70-80-х годах XX века, показали, что аппликативная методика обеспечивает более эффективные способы верификации программ и доказательство их корректности. Это видно из блок-схем, представленных на рис. 4. На рис. 4, а изобра­жена блок-схема, типичная для программ 60-х годов XX века. В ней нет никакой явной структуры. Такие программы называют про-граммами-спагетти. Из-за большого числа нерациональных пере­дач управления назад и вперед трудно понять, каково состояние программы в каждый момент времени в процессе ее выполнения.

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

Структурное программирование - подход, при котором для передачи управления в программе используются только три конст­рукции, допускающих последовательную, условную и итеративную передачи управления. При этом безусловная передача управления например, оператором goto запрещается.


Рис. 4. Аппликативные методы в императивных языках

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

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

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

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

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

создание программ коллективом разработчиков;

окончание создания программ в заданный срок.

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

2. ПРИНЦИП УТАИВАНИЯ ИНФОРМАЦИИ

Концепция структурного программирования предпола­гает разбиение программы на отдельные компоненты согласно принципу утаивания информации.

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

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

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

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

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

1) действуют все идентификаторы, определенные внутри про­цедуры/функции;

2)  действуют все идентификаторы окружающего контекста, ес­ли их имена отличаются от имен, объявленных внутри процеду­ры/функции;

3)локальные идентификаторы процедуры/функции во внешнем окружении не действовуют никогда;

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

3. МЕТОДЫ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ

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

решения частных задач приводят к решению общей задачи;

данная последовательность отдельных действий наиболее ра­циональна;

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

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

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

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

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

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

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

4. СТРУКТУРНАЯ СХЕМА ПРОГРАММЫ И СРЕДСТВА ДЛЯ ЕЕ ИЗМЕНЕНИЯ

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

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

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

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

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

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

Фрагменты с горизонтальными вызовами на одном уровне мо­гут быть преобразованы в вертикальные вызовы модулей разных уровней посредством введения дополнительных переменных, кото­рые не могли быть получены декомпозицией функционального описания на подфункции. Эти дополнительные переменные обыч­но имеют тип целый или логический и называются флагами, сема­форами, ключами событий. Их смысл обычно характеризуется фра­зой: в зависимости от следующей предыстории действий, выпол­нить такие-то действия.

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

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

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

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

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

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

5. КРИТЕРИИ ОЦЕНКИ КАЧЕСТВА

СТРУКТУРНОЙ СХЕМЫ ПРОГРАММЫ

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

1)  полнота выполнения специфицированных функций;

2)возможность быстрого и дешевого пополнения новыми, ра­нее не специфицированными функциями;

3)обозримость  (понятность) для  проектировщика составных частей программы;

4)максимальная независимость отдельных частей программы;

5)  возможность связывания подпрограмм редактором связей;

6)достаточность оперативной памяти;

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

8)  отсутствие разных модулей со сходными функциями. Один и тот же модуль должен вызываться на разных уровнях схемы иерархии;

9)достижение такого графика работы коллектива программи­стов при реализации программы, который обеспечивает равномер­ную загрузку коллектива;

 

10)всемерное сокращение затрат на тестирование программы.
Хорошая схема иерархии в 2-5 раз сокращает затраты на тестиро­
вание по сравнению с первоначальным вариантом;

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

Генерация вариантов прекращается при невозможности даль­нейших улучшений. Рациональная структура программы обеспечи­вает сокращение общего объема текстов в 2-3 раза, что соответст­венно удешевляет создание программы и ее тестирование, на кото­рое обычно приходится не менее 60% от общих затрат. При этом облегчается и снижается стоимость сопровождения программы.

Категория: Программирование | Добавил: Admin (19.04.2012)
Просмотров: 9896 | Рейтинг: 4.5/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Поиск

Вход

Гость
  • Вход
  • Регистрация
  • Читаемое

    Заходи не жди