Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Какой подход в программировании называется структурным

Лекция №1. Структурный подход к программированию

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

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

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

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

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

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

Бурное развитие технологий программирования, основанных на объектном подходе, позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальное программирование, например, Delphi, C++ Builder, Visual C++ и т. д. При использовании визуальной среды у программиста появляется возможность проектировать некоторую часть, например, интерфейсы будущего продукта, с применением визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.

Можно дать обобщающее определение: объект ООП — это совокупность переменных состояния и связанных с ними методов (операций). Упомянутые методы определяют, как объект взаимодействует с окружающим миром.

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

Структурное программирование (СП) возникло как вариант решения проблемы уменьшения СЛОЖНОСТИ разработки программного обеспечения.

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

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

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

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

Подход базируется на двух основных принципах:

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

· Использование структурного кодирования.

Напомним, что данная методология является важнейшим развитием императивной методологии.

Происхождение, история и эволюция. Создателем структурного подхода считается Эдсгер Дейкстра. Ему также принадлежит попытка (к сожалению, совершенно неприменимая для массового программирования) соединить структурное программирование с методами доказательства правильности создаваемых программ. В его разработке участвовали такие известные ученые как Х. Милс, Д.Э. Кнут, С. Хоор.

Методы и концепции, лежащие в основе структурного программирования. Их три

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

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

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

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

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

Теорема о структурировании (Бёма-Джакопини (Boem-Jacopini)): Всякую правильную программу (т.е. программу с одним входом и одним выходом без зацикливаний и недостижимых веток) можно записать с использованием следующих логических структур — последовательность, выбора и повторение цикла

Следствие 1: Всякую программу можно привести к форме без оператора goto.

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

Следствие 3: Сложность структурированных программ ограничена, даже в случае их неограниченного размера.

Структурное программирование- это не самоцель. Его основное назначение- это получение хорошей («правильной») программы, однако даже в самой хорошей программе операторы перехода goto иногда нужны: например — выход из множества вложенных циклов.

Практически на всех языках, поддерживающих императивную методологию, можно разрабатывать программы и по данной методологии. В ряде языков введены специальные заменители оператора goto, позволяющие облегчить управление циклами (например, Break и Continue в языке C).

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

Try Objective-с

сайта «Try Objective-c — программирование для начинающих»!

Здесь простым и доступным языком представлен материал по основам программирования.

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

Читать еще:  Плюсы и минусы модульного программирования

Сам процесс обучения программированию довольно трудоемок, но если у вас есть цель — то у вас все получится!

Заучивать весь представленный материал нет необходимости. Главное — чтобы вы понимали саму суть здесь изложенного.

  • Просмотров: 21787
  • Автор: Midav
  • Дата: 5-10-2012, 00:57

1.17 Типы программирования. Часть 1. Структурное программирование. Циклы

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

Языки программирования – формальные языки, предназначенные для описания алгоритмов.

Формальные языки характерны тем, что имеют четкие синтаксические правила.
Например запись 2×2=4 является синтаксически правильной математической записью, а 2=+4 – нет.

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

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

Парадигма программирования — это некий набор правил, который определяет стиль написания программ.

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

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

Перевод осуществлён Kovalev Filipp

Это обзорная лекция профессора Джери Кейн с факультета Computer Sciense университета Стэнфорд.
Парадигмы программирования представляют несколько языков, включая C, Ассемблер, C++, Параллельное программирование, Sheme и Python.
Цели данного курса — научить слушателей как писать код на каждом из этих языков и понимать парадигмы программирования, представляемые этими языками.

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

Рассмотрим основные моменты касающиеся структурного программирования.

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

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

1
Последовательное исполнение
— однократное выполнение операций в том порядке, в котором они записаны в тексте программы (сначала выполняется инструкция 1, затем инструкция 2, затем следующая. и так далее);

2
Ветвление (if)
— это однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
Операторы выполняющие функции ветвления имеют название — условные операторы.

Условие — любое выражение
Оператор — любой допустимый оператор или блок операторов
Если условие истинно — оператор будет выполнен.
Если условие ложно — оператор будет пропущен

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

3
Цикл
— многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла — например производить увеличение числа на единицу, пока оно не станет равным, к примеру, 5).

Цикл for
Для организации цикла for необходимо выполнить три обязательных действия:
— установить начальные значения переменных
— проверять истинность условия цикла
— на каждом шаге изменять значение счетчика чикла

— Выражение 1 — инициализация (выполняется только один раз в самом начале цикла)
— Выражение 2 — условие цикла (выполняется на каждом последующем витке цикла)
— Выражение 3 — приращение счетчика (выполняется на каждом последующем витке цикла после выполнения оператора)

циклы с предусловием (while)
сперва выполняется условие (проверяется его истинность или ложность) и только после этого выполняется сам цикл. Данный цикл может не выполниться ни разу если результатом проверки окажется «ложь».

Условие — любое выражение
Оператор — любой допустимый оператор или блок операторов

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

В программе циклы могут быть ВЛОЖЕННЫЕ друг в друга произвольным образом.

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

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

Процедура, будучи вызванной выполняет какое то действие.
Функция (в отличии от процедуры) всегда возвращает значение.

Например в программе мы можем какой либо переменной присвоить значение (результат) какой то функции:
x = function(y)
Здесь мы переменной Х присваиваем значение Y, которое вернула функция function
(синтаксис мы будем рассматривать позднее)
В языке СИ например, что процедура, что функция называются одинаково — функция. Независимо от того какую работу они выполняют.

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

Ярким представителем структурного программирования является язык программирования СИ
Основы программирования на Си мы также будем рассматривать в дальнейшем.

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

Второй этап — структурный подход к программированию (60-70-е годы XX в.);

Структурный подход к программированию представляет собой совокупность рекомендуемых

технологических приемов, охватывающих выполнение всех этапов разработки программного

обеспечения. В основе структурного подхода лежит декомпозиция (разбиение на части) сложных

систем с целью последующей реализации в виде отдельных небольших (до 40 — 50 операторов)

подпрограмм. С появлением других принципов декомпозиции (объектного, логического и т. д.)

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

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

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

Проектирование, таким образом, осуществлялось «сверху вниз» и подразумевало реализацию

общей идеи, обеспечивая проработку интерфейсов подпрограмм. Одновременно вводились ог-

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

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

Поддержка принципов структурного программирования была заложена в основу так

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

Читать еще:  Построить математическую модель задачи линейного программирования

«структурные» операторы передачи управления, поддерживали вложение подпрограмм,

локализацию и ограничение области «видимости» данных. Среди наиболее известных языков этой

группы стоит назвать PL/1, ALGOL-68, Pascal, С.

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

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

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

версиях развиваемых языков.

Дальнейший рост сложности и размеров разрабатываемого программного обеспечения

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

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

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

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

технология модульного программирования.

Модульное программирование предполагает выделение групп подпрограмм, использующих

одни и те же глобальные данные в отдельно компилируемые модули (библиотеки подпрограмм),

например, модуль графических ресурсов, модуль подпрограмм вывода на принтер (рис. 1.5). Связи

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

интерфейс, в то время как доступ к реализации модуля (телам подпрограмм и некоторым

«внутренним» переменным) запрещен. Эту технологию поддерживают современные версии

языков Pascal и С (C++), языки Ада и Modula.

Использование модульного программирования существенно упростило разработку

программного обеспечения несколькими программистами. Теперь каждый из них мог

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

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

позволяет получать достаточно надежные программы, размер которых не превышает 100 000

операторов [10]. Узким местом модульного программирования является то, что ошибка в

интерфейсе при вызове подпрограммы выявляется только при выполнении программы (из-за

раздельной компиляции модулей обнаружить эти ошибки раньше невозможно). При увеличении

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

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

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

Структурный подход к программированию

Программирование — процесс составления программ (перевода алгоритма на язык программирования).

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

В настоящее время “язык программирования” и “алгоритмический язык” часто выступают как синонимы.

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

— нисходящее пошаговое проектирование;

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

Структурное программирование предполагает составление алгоритма задачи из конструкций строго определенного вида.

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

Каждая структура должна иметь один вход и один выход. На каждом шаге нисходящего проектирования следует составлять алгоритм одного из трех указанных видов (рис. 7.2).

Нисходящая разработка дает возможность лучше управлять ходом (процессом) составления программ.

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

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

а). Линейная: б). Разветвление: в). Ветвление с

— с предусловием: — с постусловием: — с известным числом повторов:

Рис. 7.2. Виды управляющих структур

Языки программирования

В программировании выделяют языки различных уровней: машинные, Ассемблер, высокого уровня (алгоритмические языки).

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

Недостатки программирования на машинном языке:

— большие трудозатраты при записи программы;

— сложность процесса отладки программ;

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

— язык связан с конкретным типом ЭВМ.

— высокая эффективность программ;

— возможность использования всех ресурсов аппаратуры ЭВМ.

Языки уровня Ассемблера являются машинно-ориентированными. Ассемблер позволяет составить программы в более удобной для человека форме.

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

— наличие средств контроля ошибок;

— достаточно высокая эффективность программ;

— использование всех возможностей ЭВМ.

— излишняя детализация записи программ;

— отсутствие контроля за обращением к элементам памяти.

Языки высокого уровня не содержат машинно-зависимых операторов. Языки этого типа: Фортран, Алгол, Бейсик, Фокал, Пл/1, Паскаль, Кобол и др.

Достоинства программирования на этих языках:

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

— простота эксплуатации программ;

— возможность переноса программ с одной машины на другую (т.е. универсальность).

— пониженная по сравнению с языками низкого уровня эффективность программ;

— не всегда оптимальное и полное использование ресурсов ЭВМ;

— необходимость наличия в памяти ЭВМ специальной программы-транслятора, написанной на машинном языке (или Ассемблере), которая обрабатывает символическое описание алгоритма и осуществляет автоматический перевод программы на внутренний язык машины.

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

Интерпретатор — программа, которая транслирует каждый оператор исходной программы и сразу его выполняет.

Структурное программирование

— Учитель,- проговорил Сунь У-кун.- Я человек простой и вашего городского языка не понимаю. Что значат подпорки к стене?

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

У Чэн-энь. «Путешествие на Запад», глава 2

Общая характеристика структурного программирования

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

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

Начнем с того, что обратимся к истории.

В теории схем программ было замечено, что некоторые случаи блок-схем легче поддаются анализу [ 16 ] . Поэтому естественно было выделить такой класс блок-схем, что и сделали итальянские ученые С. Бем и К. Джакопини в 1966 г. Они доказали, что любую блок-схему можно привести к структурированному виду, использовав несколько дополнительных булевых переменных. Э. Дейкстра подчеркнул, что программы в таком виде, как правило, являются легче понимаемыми и модифицируемыми, так как каждый блок имеет один вход и один выход .

Читать еще:  Для чего предназначены системы программирования

В качестве методики структурного программирования Э. Дейкстра предложил пользоваться лишь конструкциями цикла и условного оператора, изгоняя go to как концептуально противоречащее этому стилю

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

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

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

Средства структурного программирования в первую очередь включаются во все языки программирования традиционного типа и во многие нетрадиционные языки. Они занимают основное место в учебных курсах программирования и в теоретических работах (например, [ 1 ] , [ 4 ] , [ 9 ] ).

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

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

действия и условия локальны.

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

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

Для структурного стиля программирования требуется следующее. Задача разбивается на подзадачи, и таким образом выстраивается дерево вложенности подзадач. Информационное пространство структурируется в точном соответствии с деревом вложенности: для каждой подзадачи оно состоит из ее локальных объектов, определяемых вместе с подзадачей и для нее, и так называемых глобальных объектов, определяемых как информационное пространство непосредственно объемлющей подзадачи. Таким образом, информационное пространство всей задачи (подзадачи самого верхнего уровня) расширяется по мере перехода к подзадачам за счет их локальных объектов. Для различных дочерних подзадач одной подзадачи оно имеет общую часть — информационное пространство родительской подзадачи 3 В этой системе требований без труда распознается так называемая блочная структура языков программирования, появившаяся еще в Algol 60 и ставшая в настоящее время фактическим стандартом. .

К структурным операторам добавляются либо циклы , либо рекурсии .

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

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

Первым обратил внимание на необходимость введения призраков для логического и концептуального анализа программ Г. С. Цейтин в 1971 г. В Америке это «независимо» открыли заново в 1979 г., хотя упомянутая статья Цейтина была опубликована на английском языке в общедоступном издании. Даже название сущностям было дано то же самое. Этому важнейшему и традиционно игнорируемому понятию посвящена отдельная лекция в курсе «Основания программирования» [ 21 ] .

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

Для структурного программирования весьма важно требование:

Все структуры подчиняются структуре информационного пространства.

Это общее требование конкретизируется в следующие.

  1. Необходимо, чтобы структура управления программы была согласована со структурой ее информационного пространства. Каждой структуре управления соответствуют согласующиеся с ней структуры данных и часть информационного пространства. Это условие позволяет человеку легко отслеживать порядок выполнения конструкций в программе.
  2. Подзадачи могут обмениваться данными только посредством обращения к объектам из общей части их информационных пространств (в современных языках чаще всего к глобальным).
  3. Информационные потоки должны протекать согласно иерархии структур управления; мы должны четко видеть для каждого блока программы, что он имеет на входе и что дает на выходе. Таким образом, свойства каждого логически завершенного фрагмента программы должны ясно осознаваться и в идеале четко описываться в самом тексте программы и в сопровождающей ее документации 5 Как видим, программа должна составляться после того, как программист хорошенько подумал, а не до того. .
  4. Описание переменных, представляющих перерабатываемые объекты, а также других, вспомогательных переменных при структурном программировании строго подчиняется разбиению задачи на подзадачи.
  5. Все призраки действуют на своем структурном месте и соответствуют идеальным сущностям, которые, согласно парадоксу изобретателя, должны вводиться для эффективного решения задачи.
  6. Все подпорки строго локализованы в том месте, где их вынуждены ввести. Желательно даже обозначать их по-другому, чем идеальные сущности, например, оставляя мнемонические имена лишь для идеальных сущностей, а подпорки именовать джокерами типа x или i . Необходимо строго следить за тем, чтобы подпорки не искажали идеальную структуру программы.

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

Ссылка на основную публикацию
Adblock
detector