Меню Рубрики

Положения структурного программирования. Технология структурного программирования. Смотреть что такое "Структурное программирование" в других словарях

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

Характерными принципами структурного программирования являются:

· нисходящее программирование – способ разработки программ, при котором программи­рование ведется методом «сверху-вниз», от общего к деталям;

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

· использование при программировании трех структур управления (следование, выбор, повторение). Структура следование предполагает естественную последовательность выполнения операторов. Структура выбор задается схемой «если – то – иначе» (условный оператор if). Структуре повторения сопоставлен оператор цикла;

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

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

Следование– это линейная последовательность действий (рис. 2.6):

Рис. 2.6. Следование

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

Ветвление алгоритмическая альтернатива. Управление передается одному из двух блоков в зависимости от истинности или ложности условия. Затем происходит выход на общее продолжение (рис. 2.7):

Рис. 2.7. Ветвление

Цикл повторение некоторой группы действий по условию. Различаются два типа цикла. Первый цикл с предусловием (рис. 2.8):

Рис. 2.8. Цикл с предусловием

Пока условие истинно, выполняется серия, образующая тело цикла.

Второй тип циклической структуры цикл с постусловием (рис. 2.9):

Рис. 2.9. Цикл с постусловием

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

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

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

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

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

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

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

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

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

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

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

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

«снизу вверх»: сначала составляются вспомогательные алгоритмы, затем основной.

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

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

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

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

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

  • Структурная
    • Разделение ответственности :
  • Шаблон: программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков . Предложена в 70-х годах XX века Э. Дейкстрой , разработана и дополнена Н. Виртом .

    В соответствии с данной методологией

    1. Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:
      • последовательное исполнение - однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
      • ветвление - однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
      • цикл - многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).
      В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается.
    2. Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т. н. подпрограмм (процедур или функций). В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы . При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы.
    3. Разработка программы ведётся пошагово, методом «сверху вниз».

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

    Теорема о структурном программировании:

    Основная статья: Теорема Бома-Якопини

    Любую схему алгоритма можно представить в виде композиции вложенных блоков begin и end, условных операторов if, then, else, циклов с предусловием (while) и может быть дополнительных логических переменных (флагов).
    Эта теорема была сформулирована итальянскими математиками К. Бомом и Дж. Якопини в 1966 году и говорит нам о том, как можно избежать использования оператора перехода goto .

    История

    Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что «интуитивная» (неструктурированная, или «рефлекторная») разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ.

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

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

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

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

    1. Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что значительно снижает сложность программы и, что ещё важнее, облегчает понимание её другими разработчиками.
    2. В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные - дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов (по сути, сама программа является собственной блок-схемой).
    3. Сильно упрощается процесс тестирования и отладки структурированных программ.

    См. также

    Ссылки


    Wikimedia Foundation . 2010 .

    • Махаджанапады
    • Camel

    Смотреть что такое "Структурное программирование" в других словарях:

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

      структурное программирование - struktūrinis programavimas statusas T sritis automatika atitikmenys: angl. structured coding; structured programming vok. strukturelle Programmierung, f rus. структурированное программирование, n; структурное программирование, n pranc.… … Automatikos terminų žodynas

      Структурное программирование - 46. Структурное программирование Structured programming Источник: ГОСТ 19781 90: Обеспечение систем обработки информации программное. Термины и определения … Словарь-справочник терминов нормативно-технической документации

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

      ПРОГРАММИРОВАНИЕ - 1) процесс составления программы, плана действий. 2) Раздел информатики, изучающий методы и приёмы составления программ. С долей условности П. как дисциплина разделяется на: теоретическое, изучающее матем. абстракции программ (как объектов с… … Физическая энциклопедия

      Программирование основанное на прототипах - Прототипное программирование стиль объектно ориентированного программирования, при котором отсутствует понятие класса, а повторное использование (наследование) производится путём клонирования существующего экземпляра объекта прототипа.… … Википедия

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

      Компьютерное программирование - Разработка программного обеспечения Процесс разработки ПО Шаги процесса Анализ | Проектирование | Реализация | Тестирование | Внедрение | Сопровождение Модели / методы Agile | Cleanroom | Итеративная | Scrum | RUP | MSF | Спиральная | … Википедия

      Неструктурированное программирование - Структурное программирование методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70 х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом. В … Википедия

      Компонентно-ориентированное программирование - Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия

    Книги

    • Дисциплина программирования , Дейкстра Э. , Книга написана одним из крупнейших зарубежных специалистов в области программирования, известным советскому читателю по переводам его книг на русский язык (например, «Структурное… Категория: Математика и естественные науки Серия: Издатель: ЁЁ Медиа , Купить за 2177 руб
    • Программирование. Основы алгоритмизации и программирования. Учебник , А. Н. Пылькин , Б. Г. Трусов , Н. И. Парфилова , Учебник создан в соответствии с Федеральным государственным образовательным стандартом по направлению подготовки 230100 `Информатика и вычислительная техника` (квалификация `бакалавр`).… Категория:

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

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

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

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

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

    1. Структура типа «следование » (рис.1.3а) – образуется последовательностью действий, S 1, S 2, …, Sn , следующих одно за другим: выполнить S 1; выполнить S 2; …; выполнить Sn . В линейном вычислительном процессе все операции выполняются последовательно в порядке их записи. Типовым примером такого процесса является стандартная вычислительная схема, состоящая из трех этапов:

    1) ввод исходных данных;

    2) вычисление по формулам;

    3) вывод результата.

    В языке Pascal такая структура заключается в операторные скобки Begin ... End :

    Begin S 1; S 2; ... Sn ; End

    2. Структура типа «ветвление » (ЕСЛИ – ТО – ИНАЧЕ ) (рис.1.3б) – обеспечивает в зависимости от результата проверки условия Р , принимающего одно из двух логических значении Да (True ) или Нет (False ), выбор одного из альтернативных путей работы алгоритма: если Р , то выполнить S 1, иначе выполнить S 2 . Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран.

    В языке Pascal

    If P Then S 1 Else S 2;

    3. Структура типа «цикл с предусловием » (рис.1.3в) – обеспечивает многократное выполнение действия S в зависимости от того, какое значение принимает логическое условие Р : до тех пор, пока Р , выполнять S . Выполнение цикла прекращается, когда условие Р не выполняется.

    В языке Pascal такая структура имеет следующий формат:

    While P Do S ;


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

    4. Структура типа «сокращенное ветвление » (ЕСЛИ – ТО ) (рис. 1.4а) – если результат проверки условия Р принимает значение Да (True ), то выполняется действие S ; в противном случае это действие пропускается и управление передается следующей структуре: если Р , то выполнить S 1 .

    В языке Pascal такая структура имеет следующий формат:

    If P Then S ;

    5 . Структура типа «выбор – иначе » (рис. 1.4б) являются расширенным вариантом структуры типа ЕСЛИ – ТО – ИНАЧЕ . Здесь проверяемое условие Р может принимать не два логических значения, а несколько порядковых значений, например, 1, 2, …, n . Если Р = i , то будет выполняться действие Si . Если же значение Р будет выходить из диапазона допустимых значений, то выполняется действие S (в укороченном варианте «выбор » никакого действия не производится и управление передается к следующей структуре.

    Case P Of

    6. Структура типа «цикл с постусловием » (рис. 1.4в) – обеспечивает многократное выполнение действия S до тех пор, пока не выполняется условие Р .

    В языке Pascal такая структура имеет следующий формат:

    Until P ;

    7. Структура типа «цикл с параметром » (рис. 1.4г) – обеспечивает заранее определенное многократное выполнение действия S . При этом здесь последовательно выполняются следующие типовые операции:

    · задание начального значения используемого параметра цикла (например, если переменной цикла является i , то ей присваивается значение i 1, т.е. i :=i 1);

    · выполнение действий S , предусмотренных в теле цикла;

    · изменение параметра цикла, который обеспечивает вычисление результата с новыми начальными данными (например, если параметр цикла i изменяется с шагом i 3, i :=i + i 3);

    · проверка текущего значения параметра цикла с заданным конечным значением (i <=i 2);

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

    В языке Pascal такая структура имеет следующий формат:

    For Переменная :=i 1 To (Downto) i 3 Do S ;

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

    Структурные операторы обычно применяются уже на ранних стадиях нисходящего проектирования программы.

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

    Структурированность программы может нарушаться операторами безусловного перехода GoTo . Бессистемное употребление этих операторов является источником многих ошибок, а также затрудняет восприятие и тестирование программы. В свое время даже возник термин «программирование без goto ». Однако умеренное использование переходов в виде процедур break , continue и exit языка Pascal обычно упрощает программу.


    Выводы

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

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

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

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


    Похожая информация.


    Введение

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

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

    История

    Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что "интуитивная" разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ. Наиболее сильной критике со стороны разработчиков структурного подхода к программирования подвергся оператор GOTO (оператор безусловного перехода), имеющийся почти во всех языках программирования. Использование произвольных переходов в тексте программы приводит к получению запутанных, плохо структурированных программ, по тексту которых практически невозможно понять порядок исполнения и взаимозависимость фрагментов.

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

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

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

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

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

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

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

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

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

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

    Структурное программирование можно толковать как "проектирование, написание и тестирование программы в соответствии с заранее определенной дисциплиной".

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

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

    Структурное программирование улучшает ясность и читабельность программ.

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

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

    Наконец, структурное программирование призвано улучшить эффективность программ.

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

    Основные критерии оценки качества программы для ЭВМ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    6. Простота и эффективность. Программа должна быть просто организована.

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

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

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

    КОНСПЕКТ ОБЗОРНОЙ ЛЕКЦИИ

    Для студентов специальности
    Т1002 «Программное обеспечение информационных технологий»

    (А.М.Кадан , к.т.н., доцент)

    Вопрос №34.
    Характеристика основных методологий разработки программного обеспечения

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

    2. Императивное программирование.

    2.1. Модульное программирование.

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

    3. Метод объектно-ориентированного программирования.

    Методология и технология программирования

    Приведем основные определения.

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

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

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

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

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

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

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

    Технологии удобно характеризовать в двух измерениях - вертикальном (представляющем процессы) и горизонтальном (представляющем стадии).

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

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

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

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

    Императивное программирование

    Императивное программирование - это исторически первая методология программирования, которой пользовался каждый программист, программирующий на любом из «массовых» языков программирования – Basic , Pascal , C .

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

    Методы и концепции

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

    · Метод управления потоком исполнения - заключается в пошаговом контроле управления. Метод поддерживается концепцией потока исполнения.

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

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

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

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

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

    Императивные языки программирования. Императивные языки программирования манипулируют данными в пошаговом режиме, используя последовательные инструкции и применяя их к разнообразным данным. Считается, что первым алгоритмическим языком программирования был язык Plankalkuel (от plan calculus), разработанный в 1945-1946 годах Конрадом Цузе (Konrad Zuse ).

    Наиболее известные и распространенные императивные языки программирования, большинство из которых было создано в конце 50-х - середине 70-х годов XX века, представлены на рисунке. Обратите внимание на пустое место на рисунке, соответствующее 80-м и 90-м годам прошлого века. Это период увлечения новыми парадигмами, и императивных языков в это время практически не появлялось.

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

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

    Рекомендации по литературе. Особенности императивного программирования изложены в огромном количестве книг. Наиболее систематично они приведены в работе "Универсальные языки программирования. Семантический подход" [Калинин, Мацкевич 1991].

    Модульное программирование

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

    Концепции модульного программирования. В основе модульного программирования лежат три основных концепции:

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

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

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

    синтаксическая обособленность, т. е. выделение модуля в тексте син таксическими элементами;

    семантическая независимость, т. е. независимость от места, где про граммная единица вызвана;

    общность данных, т. е. наличие собственных данных, сохраняющихся при каждом обращении;

    полнота определения, т. е. самостоятельность программной единицы.

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

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

    потребность организационного расчленения крупных разработок;

    возможность параллельного исполнения модулей (в контексте парал лельного программирования).

    Определения модуля и его примеры. Приведем несколько дополнительных определений модуля.

    • Модуль - это совокупность команд, к которым можно обратиться по имени.

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

    Функциональная спецификация модуля должна включать:

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

    · описание семантики функций, выполняемых модулем по каждому из его входов.

    Разновидности модулей. Существуют три основные разновидности модулей:

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

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

    a) задачи в языке программирования Ada ;

    b) кластер в языке программирования CLU ;

    c) классы в языках программирования C++ и Java .

    3) "Большие” (логические) модули, объединяющие набор "средних" или "маленьких" модулей. Примеры "больших" модулей в языках программи рования:

    a) модуль в языке программирования Modula-2;

    b) пакеты в языках программирования Ada и Java .

    Набор характеристик модуля предложен Майерсом [Майерс 1980]. Он состоит из следую щих конструктивных характеристик:

    1) размера модуля;

    В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оператив ном буфере памяти человека. Символьные образы в человеческом мозгу объединяются в "чанки " - наборы фактов и связей между ними, запоминаемые и извлекаемые как единое целое. В каждый момент времени человек может обр абатывать не более 7 чанков .

    Модуль (функция) не должен превышать 60 строк. В результате его мож но поместить на одну страницу распечатки или легко просмотреть на экране монитора.

    2) прочности (связности) модуля;

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

    Связность (прочность) модуля (cohesion ) - мера независимости его частей. Чем выше связность модуля - тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Можно выделить типы связности, приведенные ниже.

    Функциональная связность. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на 2 модуля с теми же типами связностей.

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

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

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

    3) сцепления модуля с другими модулями;

    Сцепление (coupling ) - мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Рассмотрим раз личные типы сцепления.

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

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

    · Сцепление по простым элементам данных.

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

    4) рутинности (идемпотентность, независимость от предыдущих обраще ний) модуля.

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

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

    · В большинстве случаев делаем модуль рутинным, т. е. независимым от предыдущих обращений.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Рекомендации по литературе. Одной из наиболее известных работ в этой области является статья "Заметки по структурному программированию" [Дейкстра 1975]. Методы структурного программирования подробно рассмотрены в книге "Теория и практика структурного прграммирования " [Лингер , Миллс, Уитт 1982]. Практику структурного программирования можно изучать по книге "Алгоритмы + структуры данных = программы" [Вирт 1985]. Философия визуального структурного программирования подробно изложена в работе [Паронджанов 1999].

    Метод объектно-ориентированного программирования.

    Метод структурного программирования оказался эффективен при написании программ «ограниченной сложности». Однако с возрастанием сложности реализуемых программных проектов и, соответственно, объема кода создаваемых программ, возможности метода структурного программирования оказались недостаточными.

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

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

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

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

    Объектно-ориентированные программы называют «программами, управляемыми от событий», в отличие от традиционных программ, называемых «программам, управляемыми от данных».

    Основные методы и концепции ООП

    · Метод объектно-ориентированной декомпозиции – заключается в выделении объектов и связей между ними. Метод поддерживается концепциями инкапсуляции, наследования и полиморфизма.

    · Метод абстрактных типов данных – метод, лежащий в основе инкапсуляции. Поддерживается концепцией абстрактных типов данных.

    · Метод пересылки сообщений – заключается в описании поведения системы в терминах обмена сообщениями между объектами. Поддерживается концепцией сообщения.

    Вычислительная модель чистого ООП поддерживает только одну операцию – посылку сообщения объекту . Сообщения могут иметь параметры, являющиеся объектами. Само сообщение тоже является объектом.

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

    Синтаксис и семантика

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

    В объектно-ориентированном программировании определяют три основных свойства:

    Инкапсуляция. Это сокрытие информации и комбинирование данных и функций (методов) внутри объекта.

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

    Большинство окружающих нас объектов относится к категориям, рассмотренным в книге [Шлеер , Меллор 1993]:

    · Реальные объекты – абстракции предметов, существующих в физическом мире;

    · Роли – абстракции цели или назначения человека, части оборудования или организации;

    · Инциденты – абстракции чего-то произошедшего или случившегося;

    · Взаимодействия – объекты, получающиеся из отношения между другими объектами.

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

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

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

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

    Пример описания в некотором абстрактном Pascal -подобном объектно-ориентированном языке класса «точка», являющегося наследником класса «координаты» может выглядеть так:

    Type TCoordinates = class (TObject )

    x, y: integer;
    Constructor Init (_x, _y: integer);
    Function GetX : integer;
    Function GetY : integer;
    Procedure SetX (_x: integer);
    Procedure SetY (_y: integer);
    Procedure Move (dx , dy : integer);
    Destructor Done; virtual;

    Constructor Init();
    x:= _x; y:= _y
    end;
    Function GetX : integer;
    begin
    GetX := x
    end;
    . . . . . . . . . . . . .
    End;

    TPoint = class (TCoordinates )
    Color: integer;
    Constructor Init (_x, _y, _Color: integer);
    Function SetColor (_Color: integer);
    Function GetColor : integer;

    Constructor Init(_x, _y, _Color: integer);
    Inherited Init(_x, _y);
    Color:= _Color
    end;
    . . . . . . . . . . . . .

    End ;

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

    Var P1: Point;

    P 1. Init (0,0 , 14); P 1. Move (+2, -2);

    Для поддержки концепции ООР были разработаны специальные объектно-ориентирован-ные языки программирования. Все языки OOP можно разделить на три группы.

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

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

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

    Литература

    ISO/IEC 12207:1995 Information Technology – Software Life Cycle Processes.

    [Вирт 1985] – Вирт Н. Алгоритмы + структуры данных = программы. – М.: Мир, 1985

    [Дейкстра 1975] – Дейкстра Э. Заметки по структурному программированию // Дал У., Дейкстра Э., Хоар К. Структурное программирование. – М.: Мир, 1975

    [Калинин, Мацкевич 1991] – Калинин А.Г., Мацкевич И.В. Универсальные языки программирования. Семантический подход. – М.: Радио и связь, 1991

    [Лингер , Миллс, Уитт 1982] – Лингер Р., Миллс Х., Уитт Б. Теория и практика структурного программирования. – М.: Наука, 1990

    [Майерс 1980] – Майерс Г. Надежность программного обеспечения. – М.: Мир, 1980

    [Паронджанов 1999]- Параноджанов В.Д. Как улучшить работу ума. – М.: Радио и связь, 1999

    [Пратт Т., 1979] - Пратт Т. Языки программирования: разработка и реализация. -М .:Мир , 1979

    [Шлеер , Меллор 1993] - Шлеер С., Меллор С. Объектно-ориентированный анализ: моделирование мира в состояниях. – Киев: Диалектика, 1993.