Основы структурного программирования
На заре эры компьютеров (50-e и 60-e г.г.) стоимость hardware (аппаратной части ЭВМ) была весьма велика, а ее возможности ограниченны. Это приводило к тому, что программисты в процессе создания программного обеспечения (software) и написания программ решения задач придумывали различные хитрые методы, направленные на сокращение времени решения, экономию памяти ЭВМ и т. д. Программирование становилось чем-то вроде искусства, в котором огромную роль играют интуиция и личный опыт, и вершинами которого, как известно, овладевают немногие. В то время, как в области hardware наблюдался неуклонный рост производительности и падение себестоимости, затраты на ПО возрастали. Иногда они доходили до 80\% общей стоимости вычислительной системы. По мере возрастания сложности решаемых на ЭВМ задач большинство соответствующих программ становились неоправданно сложными из-за отсутствия в них четкой структуры. Их было трудно читать и практически невозможно модернизировать. Все чаще разработка новых систем стоимостью в миллионы долларов не укладывалась в запланированные сроки, а в процессе эксплуатации в них обнаруживались тысячи ошибок. Итак, к концу 60-х годов в программном мире сложилась ситуация, получившая название "кризис программного обеспечения". На этом фоне весьма плодотворным вкладом в теорию программирования оказалась работа Э. Дейкстры "Заметки по структурному программированию", опубликованная в 1968 году. Главным объектом критики Дейкстра избрал команду безусловного перехода (оператор GOTO). Весьма полезная в некоторых случаях, она в то же время затрудняет восприятие программы человеком. Чтение программы с использованием этой команды похоже на то, как если бы при чтении романа приходилось все время перелистывать книгу на несколько страниц то вперед, то назад. Такие перерывы в логической последовательности алгоритма весьма затрудняют возможность хорошо разобраться в программе всем, кроме ее автора. Вместо GOTO Дейкстра предложил использовать при написании программ три типа управляющих структур: простую последовательность, ветвление, повторение. Это предложение опирается на хорошо известную теперь теорему о структурировании, являющуюся фундаментом структурного программирования. Теорема о структурировании: схема любого, самого сложного алгоритма может быть представлена с использованием только трех базовых элементарных структур: следования, ветвления и цикла. Эти элементарные структуры могут соединяться между собой, образуя более сложные структуры, но по тем же элементарным схемам. В основу структурного программирования как научной методологии разработки алгоритмов и программ заложен ряд принципов системного подхода: 1) программа должна составляться поэтапно небольшими шагами; 2) размер шага определяется количеством решений, применяемых программистом на этом шаге; 3) сложная задача должна разбиваться на простые, легко воспринимаемые блоки, каждый из которых имеет один вход и один выход; 4) логика алгоритма и программы должна опираться на минимальное число достаточно простых базовых управляющих структур. Структурированная программа представляет собой композицию из последовательных или вложенных друг в друга блоков с одним входом и одним выходом каждый, причем размеры этих блоков могут доходить до уровня отдельных операторов языка. Сначала идеи Э. Дейкстры вызывали лишь усмешку программистов. Ситуация изменилась после того, как в начале 70-х годов группа сотрудников фирмы IBM применила идеи структурного программирования для создания информационной базы данных газеты "Нью-Йорк Таймс". Работа над проектом шла на удивление гладко, а законченная программа почти не содержала ошибок. С тех пор структурное программирование стало оказывать заметное влияние на развитие ПО всех рангов. Важной вехой на пути признания методов структурного программирования явился 1975-й год, когда Д. Кемени и Т. Курц, авторы языка "Бейсик", ввели в него структурные возможности и практически выбросили оператор GOTO. В настоящее время имеется уже несколько языков высокого уровня, основанных на принципах структурного программирования (Паскаль, Модула, Ада, Си). Структурное программирование наиболее эффективно в следующих случаях: 1) когда разрабатываются большие программы; 2) если объем памяти и быстродействие ЭВМ не являются критичными; 3) если стоимость разработки программного обеспечения является существенным фактором. Существует несколько методик реализации идей структурного программирования, основной из которых считается метод пошаговой детализации (другие названия: программирование "сверху вниз", нисходящее проектирование). Он начинается с описания решения задачи в самом общем виде, когда продумывается и фиксируется общая структура алгоритма без детальной проработки отдельных его частей. Далее осуществляется детализация укрупненных блоков. Если после этого этапа все еще имеются сложные конструкции, они прорабатываются на следующем этапе и т. д. На каждом этапе используются только канонические управляющие структуры. Полностью закончив детализацию всех блоков, мы получим решение всей задачи в целом. В качестве примера использования нисходящего проектирования рассмотрим разработку алгоритма решения задачи табуляции функции одной переменной z(x)
Из рассмотренной схемы следует, что на первом этапе используются структуры следования и цикла с постусловием. На втором детализируется с помощью следования вычисление функции z. Функция y, входящая как аргумент в формулу для z, является сложной и детализируется с помощью структуры ветвления на третьем этапе разработки алгоритма. На последнем этапе, подставляя детализированные на предыдущих этапах блоки, получаем окончательную схему алгоритма задачи:
|
|