Similar presentations:
Структурное программирование
1.
Структурное программированиеКанарейкин А. И.
2.
Содержание1.История
2. Цель
3. Спагетти-код
4. Оператор goto
5. Теорема о структурном программировании
6. Принципы структурного программирования
3.
История структурного программированияПервоначально идея структурного программирования появилась на свет в связи с оператором goto и
сомнениями в целесообразности его применения. Впервые подобные сомнения высказал Хайнц Земанек (Heinz
Zemanek) на совещании по языку Алгол в начале 1959 года в Копенгагене. Однако это выступление не
привлекло к себе внимания и не имело последствий. Эдсгер Дейкстра вспоминает: «До некоторой степени я
виню себя за то, что в то время не смог оценить значимость этой идеи»
Ситуация коренным образом изменилась через десять лет, когда в марте 1968 года Дейкстра опубликовал своё
знаменитое письмо «Оператор Go To считается вредным» (Go To Statement Considered Harmful). Это поистине
исторический документ, оказавший заметное влияние на дальнейшее развитие программирования.
Судьба самого документа очень интересна. Дело в том, что Дейкстра дал статье совсем другое название:
«Доводы против оператора GO TO» (A Case against the GO TO Statement).
Однако в момент публикации произошло нечто непонятное — статья почему-то загадочным образом
превратилась в «Письмо к редактору», причем прежнее название столь же загадочно исчезло. Что произошло на
самом деле? Дейкстра объяснил таинственное превращение статьи в письмо лишь много лет спустя, в 2001 году,
за год до смерти.
4.
ЦельЦель структурного программирования — повысить производительность труда программистов, в
том числе при разработке больших и сложных программных комплексов, сократить число ошибок,
упростить отладку, модификацию и сопровождение программного обеспечения.
Такая цель была поставлена в связи с ростом сложности программ и неспособностью
разработчиков и руководителей крупных программных проектов справиться с проблемами,
возникшими в 1960—1970 годы в связи с развитием программных средств.
5.
Спагетти-кодСтруктурное программирование призвано, в частности, устранить беспорядок и ошибки в программах,
вызванные трудностями чтения кода, несистематизированным, неудобным для восприятия и анализа исходным
текстом программы. Такой текст нередко характеризуют как «спагетти-код».
Спагетти-код — плохо спроектированная, слабо структурированная, запутанная и трудная для понимания
программа, содержащая много операторов goto (особенно переходов назад), исключений и других
конструкций, ухудшающих структурированность. Самый распространённый[источник не указан 1507 дней]
антипаттерн программирования.
Спагетти-код назван так потому, что ход выполнения программы похож на миску спагетти, то есть извилистый
и запутанный. Иногда называется «кенгуру-код» (kangaroo code) из-за множества инструкций jump.
В настоящее время термин применяется не только к случаям злоупотребления goto, но и к любому
«многосвязному» коду, в котором один и тот же небольшой фрагмент исполняется в большом количестве
различных ситуаций и выполняет много различных логических функций.
Спагетти-код может быть отлажен и работать правильно и с высокой производительностью, но он крайне
сложен в сопровождении и развитии. Доработка спагетти-кода для добавления новой функциональности
иногда несет значительный потенциал внесения новых ошибок. По этой причине становится практически
неизбежным рефакторинг — главное лекарство от спагетти.
6.
7.
Оператор gotoНачиная с 1970-х годов оператор безусловного перехода goto оказался в центре систематической и
всевозрастающей критики. Неправильное и необдуманное использование оператора goto в исходном тексте
программы приводит к получению запутанного, неудобочитаемого «спагетти-кода». По тексту такого кода
практически невозможно понять порядок исполнения и взаимозависимость фрагментов.
Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Оператор Go To считается вредным».
Дейкстра заметил, что качество программного кода обратно пропорционально количеству операторов goto в
нём. Статья приобрела широкую известность, в результате чего взгляды на использование оператора goto были
существенно пересмотрены. В работе «Заметки по структурному программированию» Дейкстра обосновал тот
факт, что для кода без goto намного легче проверить формальную корректность.
Код с goto трудно форматировать, так как он может нарушать иерархичность выполнения (парадигму
структурного программирования) и потому отступы, призванные отображать структуру программы, не всегда
могут быть выставлены правильно. Кроме того, оператор goto мешает оптимизации компиляторами
управляющих структур.
Некоторые способы применения goto могут создавать проблемы с логикой исполнения программы:
Если некоторая переменная инициализируется (получает значение) в одном месте и потом используется
далее, то переход в точку после инициализации, но до использования, приведёт к тому, что будет выбрано
значение, которое находилось в памяти, выделенной под переменную, до момента выделения (и которое, как
правило, является произвольным и случайным).
Передача управления внутрь тела цикла приводит к пропуску кода инициализации цикла или
первоначальной проверки условия.
Однако в языках высокого уровня, где этот оператор сохранился, на его использование, как правило,
накладываются жёсткие ограничения, препятствующие использованию наиболее опасных методов его
применения: например, запрещается передавать управление извне цикла, процедуры или функции внутрь.
Стандарт языка C++ запрещает обход инициализации переменной с помощью goto.
8.
9.
Теорема о структурном программированииТеорему сформулировали и доказали итальянские математики Коррадо Бём и Джузеппе Якопини (Giuseppe
Jacopini). Они опубликовали её в 1965 году на итальянском языке и в 1966 году на английском[13]. Наряду с
теоремой, в статье Бёма и Якопини описывались методы преобразования неструктурных алгоритмов в
структурные на примере созданного Бёмом языка программирования P′′. Язык P′′ — первый полный по
Тьюрингу язык программирования без оператора goto.
Теорема Бёма-Якопини написана сложным языком и в непривычных обозначениях. Если использовать
современную терминологию и обозначения, она примет вид:
Любая программа, заданная в виде блок-схемы, может быть представлена с помощью трёх управляющих
структур:
последовательность — обозначается: f THEN g,
ветвление — обозначается: IF p THEN f ELSE g,
цикл — обозначается: WHILE p DO f,
где f, g — блок-схемы с одним входом и одним выходом,
р — условие,
THEN, IF, ELSE, WHILE, DO — ключевые слова.
Пояснение. Формула f THEN g означает следующее: сначала выполняется программа f, затем выполняется
программа g.
Как отмечает Харлан Миллс (англ. Harlan Mills), данная теорема резко контрастирует с обычной (в 1960—
1970 годы) практикой программирования, когда наблюдалось массовое использование операторов перехода
goto.
Бём и Якопини не употребляли термин «структурное программирование». Тем не менее, доказанную ими
теорему (и её последующие вариации у разных авторов) впоследствии стали называть «теоремой о
структурном программировании», «структурной теоремой», «теоремой о структурировании».
10.
Принципы структурного программированияПринцип 1: Следует отказаться от использования оператора безусловного перехода goto.
Принцип 2: Любая программа строится из трёх базовых управляющих конструкций: последовательность,
ветвление, цикл.
Принцип 3: В программе базовые управляющие конструкции могут быть вложены друг в друга произвольным
образом. Никаких других средств управления последовательностью выполнения операций не
предусматривается.
Принцип 4: Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и
функций). Таким же образом (в виде подпрограмм) можно оформить логически целостные фрагменты
программы, даже если они не повторяются.
Принцип 5: Каждую логически законченную группу инструкций следует оформить как блок. Блоки являются
основой структурного программирования.
Принцип 6: Все перечисленные конструкции должны иметь один вход и один выход.
Принцип 7. Разработка программы ведётся пошагово, методом «сверху вниз» (top-down method).