КЛАССИЧЕСКИЕ

МЕТОДОЛОГИИ РАЗРАБОТКИ ПРОГРАММНЫХ СРЕДСТВ

 

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

·        Реализация основ структурного программирования в языках программирования

·        Графическое представление структурированных схем алгоритмов

·        Модульное проектирование программных средств

ü  Методы нисходящего проектирования

ü  Методы восходящего проектирования

ü  Методы расширения ядра

 

 

 

 

 

 

 

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

 

В 70-х гг. ХХ в. возник новый подход к разработке алгоритмов и программ, который получил название структурного программирования. Одним из первых инициаторов структурного программирования был профессор Э. Дейкстра. В 1965 г. он высказал предположение, что оператор GoTo (оператор без­условного перехода) вообще может быть исключён из языков программирова­ния. По мнению Дейкстры, «квалификация программиста обратно пропорцио­нальна числу операторов GoTo в его программах».

Достоинства структурного программирования по сравнению с интуи­тивным неструктурным программированием:

·        уменьшение трудностей тестирования программ;

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

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

·        повышение эффективности объектного кода программ как с точки зрения времени их выполнения, так и с точки зрения необходимых затрат памя­ти.

 

Основные положения структурного программирования

К концепциям структурного программирования относятся:

·        отказ от использования оператора безусловного перехода (GoTo);

·        применение фиксированного набора управляющих конструкций;

·        использование метода нисходящего проектирования

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

Основой реализации структурированных программ является принцип Бома и Джакопини, в соответствии с которым любая программа может быть разработана с использованием лишь трех базовых структур:

·        функционального блока;

·        конструкции принятия двоичного (дихотомического) решения;

·        конструкции обобщенного цикла.

Функциональный блок - это отдельный вычислительный оператор или любая последовательность вычислений с единственным входом и единствен­ным выходом.

Рисунок 1 Изображение функционального блока в структурном программировании

Конструкция принятия двоичного (дихотомического) решения называет­ся также конструкцией If-Then-Else (если-то-иначе), разветвлением или ветвле­нием. Это структура, обеспечивающая выбор между двумя альтернативными путями вычислительного процесса в зависимости от выполнения некоторого условия. Изображается с помощью символов «Решение» и «Процесс»

Рисунок 2 Изображение конструкции If-Then-Else в структурном программировании

 

Конструкция обобщенного цикла - в качестве базовой конструкции структурного программирования используется цикл с предусловием, называе- мый циклом «Пока» (пока условие истинно, тело цикла выполняется). Изобра­жается с помощью символов «Решение» и «Процесс».

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

Рисунок 3 Изображение конструкции обобщенного цикла в структурном программировании

 

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

 

 

Первая

 

Вторая

 

Третья

 

 

подзадача

 

подзадача

 

подзадача

 

 

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

Таким образом, всякая программа, состоящая из функциональных блоков, операторов цикла с предусловием и операторов If-Then-Else, поддаётся после­довательному преобразованию к единственному функциональному блоку. Эта последовательность преобразований может быть использована как средство понимания программы, подход к доказательству ее правильности и структурированности.

Резюме

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

 

Реализация основ структурного программирования в языках программирования

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

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

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

·        вложенные на произвольную глубину операторы If-Then-Else;

·        циклические операторы (цикл с предусловием).

Этих средств достаточно для составления структурированных программ. Однако иногда допускаются расширения данных конструкций:

·        дополнительные конструкции организации цикла:

·        цикл с параметром как вариант цикла с предусловием;

·        цикл с постусловием, называемый в структурном программировании циклом «До», в котором тело цикла выполняется перед проверкой условия выхода из цикла и повторяется до выполнения условия;

·        использование оператора Case как расширения конструкции If-Then-Else;

·        подпрограммы с несколькими входами или несколькими выходами (например один выход нормальный, второй - по ошибке), если это допускается отраслевыми стандартами или стандартами предприятия;

 

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

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

Метод Дамке

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

 

 

Рисунок 4 Представление функционального блока

 

Рисунок 5 Представление конструкции If-Then-Else

 

Рисунок 6 Представление цикла с предусловием

 

Рисунок 7 Представление цикла с постусловием

 

Рисунок 8 Представление конструкции цикла с параметром

 

 

Рисунок 9 Представление конструкции Case по методу Дамке

Достоинства метода Дамке:

·        схема алгоритма, представленная с помощью данного метода, нагляд­нее, чем классическая, особенно для больших программ;

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

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

Схемы Насси-Шнейдермана

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

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

Схемы Насси-Шнейдермана называют ещё структурограммами.

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

Рисунок 10 Представление функционального блока

Рисунок 11 Представление блока следования

Рисунок 12 Представление блока решения

Рисунок 13 Представление блока Case

Рисунок 14 Представление цикла с предусловием

Рисунок 15 Представление цикла с постусловием

 

Модульное проектирование программных средств

 

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

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

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

Признаки модульности программ:

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

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

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

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

·        упрощение разработки ПС;

·        исключение чрезмерной детализации обработки данных;

·        упрощение сопровождения ПС;

·        облегчение чтения и понимания программ;

·        облегчение работы с данными, имеющими сложную структуру.

Недостатки модульности:

·        модульный подход требует большего времени работы центрального процессора (в среднем на 5 - 10 %) за счет времени обращения к модулям;

·        модульность программы приводит к увеличению ее объема (в среднем на 5 - 10 %);

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

 

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

·        методы нисходящего проектирования;

·        методы расширения ядра;

·        методы восходящего проектирования.

На практике обычно применяются различные сочетания этих методов.

Резюме

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

 

Методы нисходящего проектирования

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

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

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

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

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

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

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

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

Существуют различные способы реализации пошагового уточнения.

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

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

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

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

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

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

 

Методы восходящего проектирования

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

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

Метод восходящего проектирования целесообразно применять в следую­щих случаях:

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

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

Резюме

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

 

Методы расширения ядра

 

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

Существует два подхода к реализации методов расширения ядра.

Первый подход основан на методах проектирования структур данных, используемых при иерархическом проектировании модулей. Данный подход применяется в методах JSP и JSD, разработанных Майклом Джексоном.

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

 

Метод JSP Джексона

Метод структурного программирования JSP (Jackson Structured Programming) разработан М. Джексоном в 70-х гг. XXв.  Данный метод наибо­лее эффективен в случае высокой степени структуризации данных. Это харак­терно, например, для класса планово-экономических задач.

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

Основные конструкции данных

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

1. Конструкция последовательности данных

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

Графически конструкция последовательности данных (последователь­ность данных) изображается в соответствии с рис. На данном рисунке компоненты В, С, D, E объединяются в указанном порядке и образуют после­довательность А.

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

Рисунок 16 Конструкция последовательности данных

 

 

 

 

Рисунок 17 Пример последовательности данных

 

2. Конструкция выбора данных

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

 

Рисунок 18 Пример правильного представления конструкции выбора данных

3. Конструкция повторения данных

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

Рисунок 19 Конструкция повторения данных

 
4. Элементарная конструкция

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

Резюме

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

 

Рисунок 20 Иерархическая структура данных

 

Резюме

Большинство структур (иерархическая, сетевая, реляционная) реальных наборов данных может быть сведено к иерархическим структурам, которые мо­гут быть представлены в нотации структур метода JSP Джексона.

 

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

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

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

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

 

Этапы проектирования программного средства

Метод JSP реализуется пятью этапами:

·        Проектирование структур входных и выходных данных.

·        Идентификация соответствий между структурами данных.

·        Проектирование структуры программы.

·        Перечисление и распределение выполняемых операций.

·        Создание текста программы на метаязыке структурированного описания.