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

редактировать
Пример диаграммы JSP.

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

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

Содержание

  • 1 Введение
  • 2 Мотивация для метода
  • 3 Базовый метод
  • 4 Рабочий пример
  • 5 Методы решения сложных проблем проектирования
  • 6 JSP и объектно-ориентированный дизайн
  • 7 См. Также
  • 8 Ссылки
  • 9 Внешние ссылки

Введение

Майкл А. Джексон Изначально JSP был разработан в 1970-х годах. Он задокументировал систему в своей книге 1975 года «Принципы разработки программ». Выступая на конференции 2001 года, он представил ретроспективный анализ исходных движущих сил этого метода и связал его с последующими разработками в области разработки программного обеспечения. Целью Джексона было упростить изменение и обслуживание программ обработки пакетных файлов COBOL, но этот метод можно использовать для разработки программ для любого языка программирования, который имеет структурированные управляющие конструкции - последовательность, итерация., и выбор («если / то / еще»).

Структурированное программирование Джексона было похоже на структурированное программирование Warnier / Orr, хотя JSP учитывал как входные, так и выходные структуры данных, в то время как метод Warnier / Orr фокусировался почти исключительно на структуре выходного потока.

Обоснование использования метода

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

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

Строка строки; int count = 0; Строка firstLineOfGroup = null; // начинаем один основной цикл while ((line = in.readLine ())! = null) {if (firstLineOfGroup == null ||! line.equals (firstLineOfGroup)) {if (firstLineOfGroup! = null) {System.out.println (firstLineOfGroup + "" + счетчик); } count = 0; firstLineOfGroup = строка; } count ++; } если (firstLineOfGroup! = null) {System.out.println (firstLineOfGroup + "" + счетчик); }

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

Строка строки; int numberOfLinesInGroup; line = in.readLine (); // начало внешнего цикла: обработка 1 группы while (line! = null) {numberOfLinesInGroup = 0; String firstLineOfGroup = line; // начало внутреннего цикла: обработка 1 записи в группе while (line! = null line.equals (firstLineOfGroup)) {numberOfLinesInGroup ++; line = in.readLine (); } System.out.println (firstLineOfGroup + "" + numberOfLinesInGroup); }

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

Базовый метод

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

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

JSP структурирует программы по четырем типам компонентов:

  • основные операции
  • последовательности
  • итерации
  • выборки

Метод начинается с описания входные данные программы в терминах четырех основных типов компонентов. Затем таким же образом описываются результаты программы. Каждый вход и выход моделируются как отдельная диаграмма структуры данных (DSD). Чтобы JSP работал для приложений с интенсивными вычислениями, таких как цифровая обработка сигналов (DSP), также необходимо рисовать схемы структуры алгоритмов, которые фокусируются на внутренних структурах данных, а не на входных и выходных.

Затем структуры ввода и вывода объединяются или объединяются в окончательную структуру программы, известную как диаграмма структуры программы (PSD). Этот шаг может включать добавление небольшого количества структуры управления высокого уровня для объединения входов и выходов. Некоторые программы обрабатывают весь ввод перед выводом, в то время как другие читают одну запись, записывают одну запись и выполняют итерацию. Такие подходы должны быть отражены в PSD.

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

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

Простая операция изображена в виде рамки.

A box labeled 'A'. Операция

Последовательность операций представлена ​​прямоугольниками, соединенными линиями. В приведенном ниже примере операция A состоит из последовательности операций B, C и D.

A box labeled 'A' connected to three boxes below it labeled 'B', 'C' and 'D'. Последовательность

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

A box labeled 'A' connected to a box labeled 'B' below it with a star in the top right corner. Итерация

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

A box labeled 'A' connected to three boxes below it labeled 'B', 'C' and 'D' each with a circle in the top right hand corner. Выбор

Рабочий пример

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

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

JSP RLE input.png

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

JSP RLE output1.png

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

JSP RLE corredence.png

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

JSP RLE program.png

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

  1. прочитать байт
  2. запомнить байт
  3. установить счетчик на ноль
  4. увеличить счетчик
  5. вывести запомненный байт
  6. выходной счетчик

Кроме того, на этом этапе условия на итерациях (циклах) и выборках (if-then-else или case-операторы) перечисляются и добавляются к диаграмме структуры программы.

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

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

#include #include int main (int argc, char * argv) {int c; int first_byte; int count; c = getchar (); / * получить первый байт * / while (c! = EOF) {/ * обработать первый байт в прогоне * / first_byte = c; count = 1; c = getchar (); / * получить следующий байт * / / * обработать последующие байты в прогоне * / while (c! = EOF c == first_byte count < 255) { /* process one byte of the same value */ count++; c = getchar(); /* get next byte */ } putchar(first_byte); putchar(count); } return EXIT_SUCCESS; }

Методы решения сложных проблем проектирования

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

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

Другой вид проблем связан с тем, что Джексон называл «трудностями распознавания», а сегодня мы бы назвали их проблемами синтаксического анализа. Базовая техника разработки JSP была дополнена операциями POSIT и QUIT, что позволило разработать то, что мы теперь называем анализатором с возвратом.

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

JSP и объектно-ориентированный дизайн

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

См. Также

Ссылки

Внешние ссылки

Викискладе есть материалы, связанные с структурным программированием Джексона.
Последняя правка сделана 2021-05-24 11:31:07
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте