Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Пример диаграммы JSP.

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

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

Введение [ править ]

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

Структурированное программирование Джексона было похоже на структурное программирование Варнье / Орра [3] [4], хотя JSP рассматривал как входные, так и выходные структуры данных, в то время как метод Варнье / Орра фокусировался почти исключительно на структуре выходного потока.

Мотивация к методу [ править ]

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

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

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

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

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

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

Основной метод [ править ]

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

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

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

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

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

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

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

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

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

Коробка с надписью "А"
Операция

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

Коробка с надписью "A" соединена с тремя ячейками под ней, обозначенными "B", "C" и "D".
Последовательность

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

Поле с надписью "A" соединено с блоком с надписью "B" под ним со звездой в правом верхнем углу.
Итерация

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

Коробка с надписью "A" соединена с тремя ячейками под ней, обозначенными "B", "C" и "D", каждая с кружком в правом верхнем углу.
Подборка

Обратите внимание, что на приведенных выше диаграммах последовательность или итерация представляет собой элемент A, а не элементы B, C или D (которые на приведенных выше диаграммах являются элементарными). Джексон дает «правило взгляда вниз», чтобы определить, что это за элемент, т. Е. Посмотрите на элементы под элементом, чтобы узнать, что это такое.

Рабочий пример [ править ]

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

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

JSP RLE input.png

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

JSP RLE output1.png

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

JSP RLE корреспонденция.png

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

JSP RLE program.png

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

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

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

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

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

#include  <stdio.h>#include  <stdlib.h>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 )  {  / * обрабатываем один байт того же значения * /  count ++ ;  c  =  getchar ();  / * получить следующий байт * /  } putchar ( first_byte );  путчар ( считать );  }  return  EXIT_SUCCESS ; }

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

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

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

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

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

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

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

См. Также [ править ]

Ссылки [ править ]

  1. ^ a b c Джексон, Массачусетс (1975), Принципы разработки программ , Academic.
  2. ^ Джексон, Массачусетс (2001), JSP в перспективе (PDF) , SD&M Pioneers 'Conference, Бонн, июнь 2001 г. , получено 26 января 2017 г. CS1 maint: location ( ссылка )
  3. ^ Warnier, JD (1974), логическое построение программ , Нью - Йорк: ИЛ Рейнгольд
  4. ^ Орр, KT (1980), "Структурное программирование в 1980 - е годы", Труды ACM 1980 Ежегодная конференция , Нью - Йорк, Нью - Йорк:. ACM Press, стр 323-26, DOI : 10,1145 / 800176,809987 , ISBN 978-0897910286
  5. ^ Виринга, R (Декабрь 1998), "Обзор структурированных и объектно-ориентированных методов спецификации программного обеспечения и техники", вычи Surv , 30 (4): 459-527, CiteSeerX 10.1.1.107.5410 , DOI : 10,1145 / 299917,299919 .
  6. ^ Хендерсон-Селлерс, Брайан ; Эдвардс, JM (сентябрь 1990), "Объектно-ориентированной жизнь системы цикл", коммуникации ACM , 33 (9): 142-59, DOI : 10,1145 / 83880,84529.

Внешние ссылки [ править ]

  • Бесплатный графический редактор JSP, написанный на JAVA.
  • Редактор JSP
  • Краткая история методов Джексона
  • Сайт Jackson Workbench