1) Понятие модели. Понятие спецификации.Один объект или система может выступать в роли модели другого объекта или системы, если между ними установлено сходство в каком-то смысле. Моделью системы (или какого-либо другого объекта или явления) может быть формальное описание системы, в котором выделены основные объекты, составляющие систему, и отношения между этими объектами.
Построение моделей - широко распространенный способ изучения сложных объектов и явлений. В модели опущены многочисленные детали, усложняющие понимание. Моделирование широко распространено и в науке, и в технике.
Модели помогают:
1) проверить работоспособность разрабатываемой системы на ранних этапах ее разработки;
2) общаться с заказчиком системы, уточняя его требования к системе;
3) вносить (в случае необходимости) изменения в проект системы (как в начале ее проектирования, так и на других фазах ее жизненного цикла).
Любые достаточно большие программы являются сложными системами. Проблема сложности преодолевается путем декомпозиции задачи. Базовая парадигма в подходе к любой большой задаче ясна: необходимо "разделять и властвовать".
Под спецификацией понимается достаточно полное и точное описание решаемой задачи на этапах проекта. Спецификация является моделью проектируемого объекта (программы).
Спецификация может описывать соглашение между программистами и заказчиками (пользователями). Программист берется написать программу, а пользователь соглашается не полагаться на знания о том, как именно эта программа реализован, то есть не предполагать ничего такого, что не было бы указано в спецификации. Такое соглашение позволяет разделить анализ реализации от собственно использования программы. Спецификации дают возможность создавать логические основы, позволяющие успешно "разделять и властвовать".
Сложность проектируемых систем привела к созданию специальных абстрактных языков, графических нотаций и поддерживающих их автоматизированных систем, облегчающих процесс создания спецификаций.
Первичные спецификации составляют в терминах решаемой задачи, а не программы. В ходе выполнения проекта спецификации последовательно претерпевают изменения до программных документов стадий и вплоть до документации, которая необходима для эксплуатации и сопровождения программы.
Уже в первичных спецификациях можно выделить две части: функциональную и эксплуатационную.
Первичная функциональная спецификация, в первую очередь, описывает:
1) объекты, участвующие в задаче (что делает программа и что делает человек, работающий с этой программой);
2) процессы и действия (проектные процедуры и эвроритмы для человека, алгоритмы методов решения задачи в машине с указанием сути и порядка обработки информации с занимаемой ей и программой размером оперативной памяти);
3) входные и выходные данные, их организацию (например, сценарий диалога с экранными формами, организация файлов с указанием длин полей записей и предельного количества информации в файлах). Здесь желательна разработка инструкции пользования будущей программой.
То есть вначале фиксируются внешние функциональные спецификации, а затем и внутренние.
В общем случае, внешние функциональные спецификации включают:
1) спецификации входных и выходных данных;
2) их организацию;
3) реакции на исключительные ситуации;
4) определение, что делает человек (по каким эвроритмам он работает, откуда человек берет информацию и как он ее готовит к вводу в ЭВМ), а что машина.
То есть все, что бы увидел пользователь, когда бы он получил готовую программу. К тестированию хорошо составленных внешних спецификаций можно привлечь потенциальных пользователей еще до разработки структуры программы и реализации программы. Пользователю можно показывать макеты экранов в порядке выполнения программы, а пользователь может готовить данные для тестирования всех функций программы и сможет апробировать методику работы с программой. Внешние спецификации обычно фиксируются в ТЗ или ЭП, но могут быть уточнены в ТП.
К внутренним спецификациям относятся описания состава внутренних частей программы, описания их взаимосвязи, а также внутренние функциональные спецификации.
Внутренние функциональные спецификации включают описания алгоритмов, как всей программы, так и ее частей с учетом спецификации внутренних данных программы (переменных, особенно структурированных). 2) Моделирование и программирование. Понятия: абстракция и декомпозиция.
Любые достаточно большие программы являются сложными системами. Проблема сложности преодолевается путем декомпозиции задачи. Базовая парадигма в подходе к любой большой задаче ясна: необходимо "разделять и властвовать".
При декомпозиции используется абстрагирование для получения абстрактных моделей. Абстракция – мысленное отвлечение, обособление от тех или иных сторон, свойств или связей предметов и явлений для выявления существенных их признаков. Абстрагирование от проблемы предполагает игнорирование ряда подробностей с тем, чтобы свести задачу к более простой задаче.
Мозг человека оперирует данными через ассоциации, создавая паутину из цепочек, в которые вовлечены клетки головного мозга. Характерной особенностью человеческого мышления является малая, без особых тренировок, возможность абстрагирования от предметов окружающего мира, т.е. если человек производит действие, то он обычно производит его над конкретным предметом.
Отдельные виды абстракций определяют наиболее эффективный способ декомпозиции применительно к конкретным целям. Верно опознав абстракции, можно получить модели, которые доступны для понимания, как отдельными людьми, так и коллективу участников проекта.
Задачи абстрагирования и последующей декомпозиции типичны для процесса создания программ. Декомпозиция используется для разбиения программы на компоненты, которые затем могут быть объединены, позволяя решить основную задачу. Абстрагирование же предполагает продуманный выбор компонент.
Каждая стадия проекта завершается утверждением программных документов. Исключение может составлять разработка бесхитростных программ с коротким (до полугода) жизненным циклом и с трудоемкостью не более одного человеко-месяца. Полное документирование таких программ экономически нецелесообразно. Программная документация составляется на основе разработанных в ходе проекта спецификаций.
3) Моделирование и программирование. Понятие процедурной абстракции.
Абстракции процедур наиболее полно воплотились в технологии структурного программирования.
Разделяя в программе тело процедуры и обращения к ней, язык высокого уровня реализует два важных метода абстракции: абстракцию через параметризацию и абстракцию через спецификацию.
Абстракция через параметризацию позволяет, используя параметры, представить фактически неограниченный набор различных вычислений одной процедурой, которая есть абстракция всех этих наборов. Например, необходима процедура сортировки массива целых чисел А. При дальнейшей разработке программы возможно возникновение потребности в сортировке другого массива, но уже с другим именем. Использование абстракции через параметризацию обобщает процедуру сортировки и делает ее более универсальной.
Абстракция через спецификацию позволяет абстрагироваться от процесса вычислений, описанных в теле процедуры, до уровня знания лишь того, что данная процедура должна в итоге реализовать. Это достигается путем задания для каждой процедуры спецификации, описывающей эффект ее работы, после чего смысл обращения к данной процедуре становится ясным через анализ этой спецификации, а не самого тела процедуры.
При анализе спецификации для уяснения смысла обращения к процедуре нужно придерживаться следующих двух правил.
Правило 1. После выполнения процедуры можно считать, что выполнено конечное условие. Выполнение конечного условия при соблюдении начальных условий - это собственно то, ради чего и построена процедура. Если это процедура поиска максимального значения в массиве, то конечное условие - факт, что максимальный элемент найден. Если это процедура вычисления квадратного корня, то конечное условие - нахождение квадратного корня.
Правило 2. Можно ограничиться только той информацией, которую подразумевает конечное условие.
Эти правила демонстрируют два преимущества абстракции через спецификацию. Первое состоит в том, что программисты, использующие данную процедуру, не обязаны знакомиться с ее телом. Следовательно, им не нужно уяснять, например, подробности алгоритма отыскания квадратного корня, устанавливая действительно ли возвращенный результат искомое число.
Второе правило показывает, что на самом деле имеем дело с абстракцией: абстрагируясь от тела процедуры, можно не обращать внимания на несущественную информацию. Именно такое "игнорирование" информации и отличает абстракцию от декомпозиции. Конечно, анализируя тело процедуры можно извлечь некоторое количество информации, не следующей из конечного условия (как, например, то, что найденный элемент первый или последний в рассмотренном выше примере). В спецификации подобная информация о возвращаемом результате отбрасывается.
Абстракции через параметризацию и через спецификацию являются мощным средством для создания программ. Они позволяют определить два вида абстракций: процедурную абстракцию и абстракцию данных. В общем случае каждая процедурная абстракция и абстракция данных используют оба способа.
Например, абстракцию SQRT (извлечение квадратного корня) можно сравнить с операцией: она абстрагирует отдельное событие или задачу. Мы будем ссылаться к абстракциям такого рода как к процедурным абстракциям. Отметим, что абстракция SQRT включает в себя как абстракцию через параметризацию, так и абстракцию через спецификацию.
На процедурной абстракции основана разработка структуры программы в технологии структурного программирования. Базовая компонента технологии структурного программирования – модуль, которому обычно соответствует подпрограмма (процедура или функция на языках программирования высокого уровня).
Рассматривая программу не как набор процедур, а, прежде всего, как некоторые наборы данных, каждый из которых имеет разрешенную группу процедур, получаем абстрактное представление программы
4) Моделирование и программирование. Понятие абстракции данных.Дейкстрой предложена относительно редко применяемая технология, основанная на абстракции данных. Данная технология является альтернативой структурному программированию. В чистом виде она успешно применялась при разработке СУБД и других изделий, ориентированных на преобразование информации из одной формы в другую.
В данной технологии и технологии объектно-ориентированного программирования применяется функциональная модель в виде набора диаграмм потоков данных (далее - ДПД), которые описывают смысл операций и ограничений. ДПД отражает функциональные зависимости значений, вычисляемых в системе, включая входные значения, выходные значения и внутренние хранилища данных. ДПД - это граф, на котором показано движение значений данных от их источников через преобразующие их процессы к их потребителям в других объектах.
Поток данных соединяет выход объекта (или процесса) со входом другого объекта (или процесса). Он представляет промежуточные данные вычислений.
Хранилище данных - это пассивный объект в составе ДПД, в котором данные сохраняются для последующего доступа. Хранилище данных допускает доступ к хранимым в нем данным в порядке, отличном от того, в котором они были туда помещены. Агрегатные хранилища данных, как, например, списки и таблицы, обеспечивают доступ к данным в порядке их поступления, либо по ключам.
ДПД показывает все пути вычисления значений, но не показывает в каком порядке эти значения вычисляются. Решения о порядке вычислений связаны с управлением программой, которое отражается в динамической модели. Эти решения, вырабатываемые специальными функциями, или предикатами, определяют, будет ли выполнен тот или иной процесс, но при этом не передают процессу никаких данных, так что их включение в функциональную модель необязательно. Тем не менее, иногда бывает полезно включать указанные предикаты в функциональную модель, чтобы в ней были отражены условия выполнения соответствующего процесса.
Современная, вытесняющая технологии структурного программирования и абстракции данных, объектно-ориентированная технология сочетает в себе абстракции процедур и данных в новой абстракции – объекте (Рис. 1.7.). Понятие абстракции данных расширено до того, что как внутренние данные, так и код процедур рассматривается как новый тип данных – объект.
5) Моделирование и программирование. Понятие диаграммы потока данных.
Поток данных соединяет выход объекта (или процесса) со входом другого объекта (или процесса). Он представляет промежуточные данные вычислений.
Хранилище данных - это пассивный объект в составе ДПД, в котором данные сохраняются для последующего доступа. Хранилище данных допускает доступ к хранимым в нем данным в порядке, отличном от того, в котором они были туда помещены. Агрегатные хранилища данных, как, например, списки и таблицы, обеспечивают доступ к данным в порядке их поступления, либо по ключам.
ДПД показывает все пути вычисления значений, но не показывает в каком порядке эти значения вычисляются. Решения о порядке вычислений связаны с управлением программой, которое отражается в динамической модели. Эти решения, вырабатываемые специальными функциями, или предикатами, определяют, будет ли выполнен тот или иной процесс, но при этом не передают процессу никаких данных, так что их включение в функциональную модель необязательно. Тем не менее, иногда бывает полезно включать указанные предикаты в функциональную модель, чтобы в ней были отражены условия выполнения соответствующего процесса.
Современная, вытесняющая технологии структурного программирования и абстракции данных, объектно-ориентированная технология сочетает в себе абстракции процедур и данных в новой абстракции – объекте (Рис. 1.7.). Понятие абстракции данных расширено до того, что как внутренние данные, так и код процедур рассматривается как новый тип данных – объект.
6) Моделирование и программирование. Понятие объектной абстракции.
Объектная модель базируется на двух постулатах:
1) все есть объекты;
2) объекты взаимодействуют передачей сообщений.
Методы структурного проектирования помогают упростить процесс разработки сложных систем за счет использования алгоритмов как готовых строительных блоков. Объект - более крупный строительный блок. Он может включать в себя как данные (поля), так и процедуры (методы). Укрупнение строительных блоков стало необходимостью при создании больших программ.
7)Понятия: объект и сообщение.Объекты - это наименее зависимые по данным части программы. Объекты моделируют свойства и поведение компонентов мира, в котором мы живем. Они являются конечной абстракцией данных.
ООП - мышление адекватно способу естественного человеческого мышления, ибо человек мыслит "образами" и "абстракциями". Чтобы проиллюстрировать некоторые из принципов объектно-ориентированного мышления обратимся к следующему примеру.
Рассмотрим ситуацию из обыденной жизни. Допустим, Вы решили поехать в другой город на поезде. Для этого Вы приходите на ближайшую железнодорожную станцию и сообщаете кассиру номер нужного Вам поезда и дату, когда Вы планируете уехать. Теперь Вы можете быть уверены, что ваш запрос будет удовлетворен (при условии, что Вы покупаете билет заранее).
Таким образом, для решения своей проблемы Вы нашли объект (железнодорожная касса) и передали ему сообщение, содержащее запрос. Обязанностью кассы (или работников кассы) будет удовлетворить запрос. Имеется некоторый определенный метод или эвроритм, или последовательность операций, которые используют работники кассы для выполнения Вашего запроса. Вам совершенно не обязательно знать какой конкретно метод используется ими.
Однако если бы Вас заинтересовал этот вопрос, то обнаружили бы, что кассир пошлет свое сообщение автоматизированной системе железнодорожного вокзала. Та, в свою очередь, примет необходимые меры и т. д. Тем самым Ваш запрос, в конечном счете, будет удовлетворен через последовательность запросов, пересылаемых от одного объекта к другому.
Таким образом, действие в объектно-ориентированном программировании инициируется посредством передачи сообщений объекту, ответственному за действие. Сообщение содержит запрос на осуществление действия и сопровождается дополнительными аргументами, необходимыми для его выполнения.
Различие между вызовом процедуры и пересылкой сообщения состоит в том, что в последнем случае существует определенный получатель и интерпретация (то есть выбор подходящего метода, который запускается в ответ на сообщение) может быть различной для разных получателей.
Вы можете передать свое сообщение, к примеру, своему приятелю, и он его поймет, и как результат действие будет выполнено (а именно билеты будут куплены). Но если вы попросите о том же продавца магазина, у него может не оказаться подходящего метода для решения поставленной задачи. Если предположить, что продавец магазина вообще воспримет этот запрос, то он, скорее всего, если можно так выразиться, выдаст надлежащее сообщение об ошибке.
Обычно конкретный объект-получатель неизвестен вплоть до выполнения программы, так что определить, какой метод какого объекта будет вызван, заранее невозможно. В таком случае говорят, что имеет место позднее связывание между сообщением (именем процедуры или функции) и фрагментом кода (методом), исполняемым в ответ на сообщение. Эта ситуация противопоставляется раннему связыванию (на этапе компилирования или компоновки программы) имени с фрагментом кода, что происходит при традиционных вызовах процедур.
8)Понятие класса.
Фундаментальной концепцией в объектно-ориентированном программировании является понятие классов.
Все объекты являются представителями, или экземплярами, классов. Обратимся к нашему примеру. У Вас наверняка есть примерное представление о реакции кассира на запрос о заказе билетов, поскольку Вы имеете общую информацию о людях данной профессии, и ожидаете, что он, будучи представителем данной категории, в общих чертах будет соответствовать шаблону. То же самое можно сказать и о представителях других профессий, что позволяет разделить человеческое общество на определенные категории по профессиональному признаку (на классы). Каждая категория в свою очередь делится на представителей этой категории. Таким образом, человеческое общество представляется в виде иерархической структуры с наследованием свойств объектов всех категорий. В корне такой классификации может находиться класс HomoSapience или даже млекопитающие.
9)Понятие наследования классов. Понятие множественного наследования.Метод, активизируемый объектом в ответ на сообщение, определяется классом, к которому принадлежит получатель сообщения. Все объекты одного класса используют одни и те же методы в ответ на одинаковые сообщения.
Классы могут быть организованы в иерархическую структуру с наследованием свойств. Дочерний класс (или подкласс) наследует атрибуты родительского класса (или надкласса), расположенного выше в иерархическом дереве. Абстрактный родительский класс это класс, не имеющий экземпляров объектов. Он используется только для порождения подклассов. Класс HomoSapience, скорее всего, будет абстрактным, поскольку для практического применения, например, работодателю экземпляры его объектов не интересны. Согласно произведенной классификации, объекты скрипач и водитель будут экземплярами разных классов. Для того чтобы получить объект Иванов, являющийся одновременно скрипачом и водителем, необходим особый класс, который может быть получен из классов скрипач и водитель множественным наследованием. Теперь работодатель, послав особое сообщение делегирования, может поручить (делегировать) Иванову выполнять функцию либо водителя, либо скрипача. Объект Иванов, находящийся за рулем автомобиля, не должен начать играть на скрипке. Для этого может быть реализован механизм самоделегирования полномочий – объект Иванов, находясь за рулем, запрещает сам себе игру на скрипке. Таким образом, понятие обязанности или ответственности за выполнение действия является фундаментальным в объектно-ориентированном программировании.
Информация, содержащаяся в подклассе, может переопределять информацию, наследуемую из родительского класса. Очень часто, при реализации такого подхода, метод, соответствующий подклассу, имеет то же имя, что и соответствующий метод в родительском классе. При этом для поиска метода, подходящего для обработки сообщения, используется следующее правило: Поиск метода, который вызывается в ответ на определенное сообщение, начинается с методов, принадлежащих классу получателя. Если подходящий метод не найден, то поиск продолжается для родительского класса. Поиск продвигается вверх по цепочке родительских классов до тех пор, пока не будет найден нужный метод или пока не будет исчерпана последовательность родительских классов. В первом случае выполняется найденный метод, во втором выдается сообщение об ошибке. Если выше в иерархии классов существуют методы с тем же именем, что и текущий, то говорят, что данный метод переопределяет наследуемое поведение.
10) Недостатки операционной технологии разработки алгоритмов
Способ описания Недостатки
Словесно пошаговый способ 1) не ясно, что является главным, а что второстепенным (что-то понять можно лишь после индукции основного замысла);
2) трудно отслеживаются передачи управления;
3) невозможность эффективного тестирования.
Графический способ в виде схем алгоритмов 1) не ясно, что является главным, а что второстепенным (что-то понять можно лишь после индукции основного замысла);
2) трудно записывать комментарии;
3) для понимания схемы алгоритмов необходимо дополнять достаточно длинными текстовыми описаниями, которые должны содержать большое количество тестовых данных для различных маршрутов вычислений;
4) невозможность эффективного тестирования.
11) Назначение методики, изложенной в проектной процедуре разработки функциональных описаний. Что такое функциональное описание.
На наш взгляд, развитие отдельных направлений программирования, филологии, психологии, теории проектирования и искусственного интеллекта подошло к точке, когда ощущается настоятельная необходимость интеграции накопленных результатов.
Попытка такой интеграции воплотилась в излагаемой далее проектной процедуре, которая может быть применена для составления функциональных описаний (описаний процессов). Инструкция пользования каким-либо устройством, инструкция вообще или алгоритм программы являются функциональными описаниями.
Хорошим функциональным описанием является описание: безошибочное, однозначное для читателя, краткое, суть которого понимается быстро. Согласно проектной процедуре, хорошее функциональное описание составляется от общего к частному с использованием особых конструкций предложений – типовых элементов (типовых структур или просто структур).
Обычно человек мыслит предложениями естественного языка. Если научиться упорядочивать мысли в процессе мышления, то можно научиться получать алгоритмы и иные функциональные описания со скоростью не только не меньшей, чем до обучения, но даже большей. Опытный программист пишет текст на языке программирования со скоростью, с которой он думает, в случае простых алгоритмов, со скоростью набора текста на клавиатуре. Еще одно преимущество применения проектной процедуры заключается в снижении усталости программиста за счет исключения необходимости неоднократного возврата для получения одной и той же идеи. В голове программиста не должно быть суеты мыслей.
Программисты могут применять проектную процедуру при написании: инструкций работы пользователя в системе организации (учреждения) с использованием ЭВМ и разрабатываемой программы; внутренних функциональных спецификаций программы (метода решения задачи, алгоритма программы в целом); исходных текстов модулей программы при использовании технологии структурного программирования; кода методов объектов при использовании технологии объектно-ориентированного программирования.
Умение применять проектную процедуру полезно и непрограммистам. При помощи данной проектной процедуры можно составлять: короткие и понятные описания любых процессов; инструкции пользования изделиями; описания принципов функционирования изделий; тексты должностных инструкций организационного обеспечения. Написание технической документации - особый жанр эпистолярного искусства. В настоящее время в развитых странах появляется новая специальность Technical Writer - технический писатель. Вероятно, одна из сфер применения проектной процедуры заключается в ее использовании такими специалистами.
Считается, что уровень интеллекта определяется, прежде всего, степенью структурированности и обобщенности модели мира человека, а также степенью отработанности операций на этой модели. Знания человека - это не сумма, а система. Создание такой системы, обеспечивающей успешную деятельность в нестандартных ситуациях - основная задача образования. До настоящего времени, одной из наиболее сложных проблем образования остается развитие навыков применения методов системного подхода при решении сложных задач. Предлагаемая проектная процедура прошла успешно многолетнюю проверку применения в процессе первичного обучения функциональному анализу. Обучение программистов проводилось на примерах составления алгоритмов логически запутанных программ. На примерах разработки инструкций пользования приборами и инструкций действий людей в разных жизненных ситуациях обучались специалисты в областях, не связанных с программированием.
12) Требования к способу мышления пользователя проектной процедурой разработки функциональных описаний.Главнейшее требование к обобщающему тесту – его наглядность в представлении порядка изменения информации. Известно, что при изучении геометрии, успех решения задачи определяется наглядностью рисунков. Наглядные геометрические рисунки обычно получаются многовариантным их построением, и требуется приобретение некоторых навыков для развития искусства их выполнения. Все это относится и к составлению наглядных обобщающих тестов. Наглядность обобщающих тестов достигается правильным выбором способа отображения информации, который обеспечивает восприятие порядка преобразования информации.
13) Порядок этапов (шагов) проектной процедуры
При словесно пошаговом способе алгоритмы описывались по изложенному ниже принципу.
Шаг 1. Выполняется такое-то действие для того-то. Если получается, что A<B, то переходим к шагу 4.
Шаг 2. Выполняется такое-то действие для того-то.
Шаг 3. Если A>B, то переходим к выполнению шага 1.
Шаг 4. Выполняется такое-то действие для того-то.
Шаг 5. Если A>B, то переходим к выполнению шага 2.
Изображение того же алгоритма в форме схемы алгоритма приведено на рис. 3.1.
Выполнение проектной процедуры начинается с подготовки и рассмотрения тестовых примеров для детализации всего описываемого процесса в виде одного СЛЕДОВАНИЯ. Для активизации мышления используется модель "черный ящик". Берется чистый лист бумаги. Внизу листа записываются термины выходных объектов и их состояния. Применительно к программам определяются имена и типы переменных, файлы, макеты экранных форм. Применительно к физическим системам определяются месторасположения и состояния объектов. Например, чайник без воды находится на полке. Результат действий - чайник, заполненный кипятком до половины объема, находится на плите. Выход определяет вход, а не наоборот! Поэтому сначала записывается результаты действий и лишь затем состояния объектов до действий. Далее в верхней части листа записываются термины входных объектов и состояния входных объектов. В середине листа записывается одно простое распространенное предложение, характеризующее процесс преобразования входной информации в выходную информацию. Многократным анализом входа, выхода и сути предложения уточняется вся информация листа. После смысловой и литературной обработки результат исследований процесса переносится в чистовик. Главный принцип - передай другим ход своих мыслей так, чтобы они смогли понять, но при этом не следует переусердствовать в деталях. Излишние комментарии могут вызвать раздражение читателя и усилить непонимание.
Параллельно с этими действий, еще на одном листе составляется множество тестовых примеров, охватывающее все случаи вычислений.
На основе совокупности тестов надо на отдельном листе составить один или несколько обобщающих тестов. При этом необходимо спроектировать рациональную форму иллюстрирования, например, рисунки промежуточных состояний данных процесса или таблицы состояний данных. Обобщающий тест необходим для понимания сути функционирования процесса. На обобщающем тесте приводятся обозначения всех входных, выходных и внутренних переменных. Из теста должны быть видны все процессы преобразования входных данных в результат.
Далее, обучаемым, находящимся в начальной стадии изучения, рекомендуется предварительно описать протекание процесса по принципу: «Как можешь!» Качество описания должно соответствовать попытке объяснения процесса какому-то заурядному человеку или даже ребенку.
14) Описание внешних и внутренних данных
Особое внимание при выполнении проектной процедуры уделяется составлению описаний внешних и внутренних данных.
Внешние данные описываются: макетами (рисунками) экранов ввода и вывода информации; формами документов, выводимых на печать; спецификациями файлов. Спецификации файлов могут быть составлены: в виде рисунков; в виде таблиц последовательной расшифровки назначения байтов и битов файла; в виде описаний переменных на языке программирования в которые считывается информация из файла (или из которых записывается информация в файл)
Внутренние данные программы составляют глобальные константы (переменные с неизменяемыми значениями) и переменные как простые, так и структурированные. Переменные описываются детально сразу после их выявления. Например, массивы определяются именем (желательно с мнемоникой, раскрывающей их назначение), типом элементов, возможными границами изменения индексов, внешне смысловым порядком следования элементов массива, а также простой переменной, которая содержит количество элементов, реально находящихся в массиве. Иногда определяется переменная-носитель индекса. Переменные лучше всего документировать операторами описания их типов и самих переменных с указанием в комментариях: назначения переменных, порядка информации в массивах и характерных значений конкретных переменных. Следует помнить, что данные могут иметь иерархическую структуру. Нежелательно рассосредоточение данных. Так вместо трех массивов: фамилия, имя, отчество лучше использовать один массив-контингент в виде массива записей с полями: фамилия, имя, отчество.
Спецификации файлов могут быть составлены: в виде рисунков; в виде таблиц последовательной расшифровки назначения байтов и битов файла; в виде описаний переменных на языке программирования, в которые считывается информация из файла (или из которых записывается информация в файл).
Тестовые примеры составляются как для правильных, так и для неправильных данных. Обобщающий тест или тесты - минимальный набор тестовых данных, охватывающих все возможные случаи вычислений.
Структура Характеристики Признак
СЛЕДОВАНИЕ Описывается либо простыми распространенными предложениями естественного языка, либо даже предложениями без сказуемого (например, «Погрузка мебели», «Решение квадратного уравнения») Соответствует строго одному действию
ЦЕПОЧКА СЛЕДОВАНИЙ Представляет собой цепочку из последовательно выполняемых следований Последовательно выполняемые разнородные действия
ЦЕПОЧКА АЛЬТЕРНАТИВ может иметь разновидности:
1) простая
АЛЬТЕРНАТИВА
2) ЛЬТЕРНАТИВА
из двух действий
3) ВЫБОР
1) Описывается конструкцией: "Если выполняется какое-то условие, то выполняется СЛЕДОВАНИЕ 1"
2) Описывается конструкцией: «Если выполняется какое-то условие, то выполняется СЛЕДОВАНИЕ 1, в противном случае, выполняется СЛЕДОВАНИЕ 2»
3) представляет собой цепочку из более чем две простейшие альтернативы с одним действием. Одно или несколько действий, каждое из которых выполняется при определенном условии или не выполняется вообще (обязательно конечное число разных действий при разных условиях)
ПОВТОРЕНИЕ может иметь раз¬новидности:
1) ПОВТОРЕНИЕ-ДО
2) ПОВТОРЕНИЕ-ПОКА
3)НЕУНИВЕР¬САЛЬНОЕ ПО¬ВТОРЕНИЕ
1) Описывается конструкцией: "До выполнения какого-то условия многократно выполнять СЛЕДО¬ВАНИЕ".
2) Описывается конструкцией: "Пока выполняется какое-то усло¬вие, многократно выполнять СЛЕ¬ДОВАНИЕ"
3) Обеспечивает заданное количе¬ство. Многократно выпол¬няемое действие (но обязательно конечное число раз). Повторениям соответствуют мысли: "Это действие должно быть выполнено пять раз"; "Это действие вы-полняется многократно до наступления такого-то события". Призна¬ками ПОВТОРЕНИЙ также являются пере¬менное количество АЛЬТЕРНАТИВ, любая мысль о возврате "на¬зад", чтобы повторить какие-то действия. Часто главный общий процесс вида ПОВТО¬РЕНИЕ скрыт в контек¬сте "и т.д." или "и т.п.", "это совсем просто", или даже в многоточиях "...".
15) Порядок детализации структур универсальных циклов ДО и ПОКА.
Порядок декомпозиции циклов:
1) набирается "пустой" текст оператора цикла;
2) записывается логическое условие продолжения ЦИКЛ-ПОКА или завершения ЦИКЛ-ДО (при этом выявляется переменная цикла);
3) декомпозируется то действие тела цикла, которое изменяет логическое условие до невыполнения условия ***ЦИКЛ-ПОКА или до выполнения условия ЦИКЛ-ДО;
4) детализируется СЛЕДОВАНИЕ "Подготовка цикла";
5) детализируется оставшееся действие тела цикла как СЛЕДОВАНИЕ;
6) проводится проверка информационной согласованности всех элементов цикла;
7) проводится проверка правильности работы цикла с помощью безмашинного расчета трассы выполнения тестов с трехкратным (или более), однократным выполнением цикла и вообще без выполнения.
В текстах программ может использоваться еще одна вычислительная структура - РЕКУРСИЯ. Признаком этой структуры является наличие рекурсивных формул и вычислений. Все, что делает рекурсия, можно реализовать при помощи циклов и массивов. Однако если язык программирования допускает рекурсию, то ее использование может сократить код программы. Рекурсия всегда очень тщательно комментируется.
16) Кодирование структуры НЕУНИВЕРСАЛЬНЫЙ ЦИКЛ-ДО.
Не универсальный ЦИКЛ-ДО имеет две конструкции и используется для задания заданного числа повторений. Рассмотрим их запись на языке программирования Pascal.
Конструкция по возрастанию: Конструкция по убыванию:
for i:=3 to 5 do for i:=5 downto 3 do
begin begin
{тело цикла i=3,4,5} {тело цикла i=5,4,3}
end; end;
Рассмотрим запись вариантов кодирования структуры не универсальный ЦИКЛ-ДО на языке программирования C.
Конструкция по возрастанию: Конструкция по убыванию:
for(i=3; i<=5; i++) for (i=5; i>=3; i++)
{ {
/*тело цикла i=3,4,5*/ /*тело цикла i=5,4,3*/
} }
Здесь i - переменная цикла. Обычно эти циклы не требуют после кодирования дополнительного тестирования.
Универсальные циклы имеют конструкции ЦИКЛ-ДО и ЦИКЛ-ПОКАИх запись на языке Pascal приведена ниже:
Универсальный ЦИКЛ-ПОКА: Универсальный ЦИКЛ-ДО:
{Подготовка} {Подготовка}
while L do repeat
begin {Тело цикла}
{Тело цикла} until L;
end;
Ниже приведена запись тех же с