Структурное программирование Джексона ( 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 . out . println ( firstLineOfGroup + " " + count ); } count = 0 ; firstLineOfGroup = line ; } count ++ ; } if ( firstLineOfGroup != null ) { System . out . println ( firstLineOfGroup + " " + count ); }
Вот версия той же программы в стиле 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 — это последовательность, состоящая из операций B, C и D.
Итерация снова представлена соединенными блоками. Кроме того, итерированная операция имеет звездочку в правом верхнем углу своего блока. В примере ниже A — это итерация из нуля или более вызовов операции B.
Выбор похож на последовательность, но с кружком, нарисованным в правом верхнем углу каждой необязательной операции. В примере A — это выбор одной и только одной из операций B, C или D.
Обратите внимание, что на приведенных выше диаграммах именно элемент A является последовательностью или итерацией, а не элементы B, C или D (которые на приведенных выше диаграммах являются элементарными). Джексон дает «правило взгляда вниз» для определения того, что такое элемент, т. е. посмотрите на элементы, расположенные ниже элемента, чтобы узнать, что это такое.
В качестве примера, вот как программист JSP спроектирует и закодирует кодировщик длины прогона . Кодировщик длины прогона — это программа, входные данные которой представляют собой поток байтов, которые можно рассматривать как происходящие в прогонах , где прогон состоит из одного или нескольких вхождений байтов одного и того же значения. Выходные данные программы представляют собой поток пар байтов, где каждая пара байтов представляет собой сжатое описание прогона. В каждой паре первый байт представляет собой значение повторяющегося байта в прогоне, а второй байт — число, указывающее количество раз, которое это значение было повторено в прогоне. Например, прогон из восьми вхождений буквы «A» во входном потоке («AAAAAAAA») даст «A8» как пару байтов в выходном потоке. Кодировщики длины прогона часто используются для грубого сжатия растровых изображений.
В JSP первым шагом является описание структуры данных входного потока программы. Программа имеет только один входной поток, состоящий из нуля или более серий одного и того же байтового значения. Ниже представлена диаграмма структуры данных JSP для входного потока.
Вторым шагом является описание структуры выходных данных, которая в данном случае состоит из нуля или более итераций пар байтов.
Следующим шагом является описание соответствий между компонентами входных и выходных структур.
Следующий шаг — использовать соответствия между двумя структурами данных для создания структуры программы, способной обрабатывать входную структуру данных и создавать выходную структуру данных. (Иногда это невозможно. См. обсуждение конфликтов структур ниже.)
После завершения разработки структуры программы программист создает список вычислительных операций, которые должна выполнить программа, а диаграмма структуры программы дополняется путем присоединения этих операций к соответствующим структурным компонентам.
Также на этом этапе перечисляются и добавляются в структурную схему программы условия итераций (циклов) и выборов (операторы if-then-else или case).
После того, как диаграмма будет готова, ее можно перевести на любой используемый язык программирования. Вот перевод на 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 ); putchar ( count ); } return EXIT_SUCCESS ; }
В книге «Принципы проектирования программ» Джексон выявил ситуации, которые создавали определенные виды проблем проектирования, и предложил методы их решения.
Одной из таких ситуаций является случай, когда программа обрабатывает два входных файла, а не один. В 1975 году одной из стандартных «злых проблем» было то, как разработать программу обработки транзакций. В такой программе последовательный файл записей обновлений запускается против последовательного главного файла, создавая обновленный главный файл в качестве вывода. (Например, ночью банк запускал пакетную программу, которая обновляла остатки на счетах своих клиентов на основе записей депозитов и снятий, которые они сделали в тот день.) Принципы проектирования программ предоставили стандартное решение для этой проблемы, а также объяснение логики, лежащей в основе дизайна.
Другой тип проблем включал то, что Джексон называл «трудностями распознавания», а сегодня мы бы назвали проблемами синтаксического анализа. Базовая техника проектирования JSP была дополнена операциями POSIT и QUIT, чтобы позволить проектирование того, что мы сейчас называем анализатором с возвратом.
JSP также распознает три ситуации, которые называются «конфликтами структур» — конфликт границ, конфликт упорядочения и конфликт чередования — и предоставляет методы для их решения. В ситуациях конфликта структур входные и выходные структуры данных настолько несовместимы, что невозможно создать выходной файл из входного файла. По сути, необходимо написать две программы — первая обрабатывает входной поток, разбивает его на более мелкие фрагменты и записывает эти фрагменты в промежуточный файл. Вторая программа считывает промежуточный файл и создает желаемый вывод.
JSP был разработан задолго до того, как стали доступны объектно-ориентированные технологии. Он и его преемник метод JSD не рассматривают то, что сейчас называется «объектами», как наборы более или менее независимых методов. Вместо этого, следуя работе CAR Hoare , JSP и JSD описывают программные объекты как сопрограммы . [5] [6]
{{citation}}
: CS1 maint: местоположение ( ссылка ) CS1 maint: местоположение отсутствует издатель ( ссылка )