Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Классификация программного обеспечения↑ Стр 1 из 10Следующая ⇒ Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
ОСНОВНЫЕ ПОНЯТИЯ КЛАССИФИКАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Программирование - в широком смысле представляет собой все технические операции, необходимые для создания программы, включая анализ требований и все стадии разработки и реализации. В узком смысле - это кодирование и тестирование программы в рамках некоторого конкретного проекта. Программное обеспечение (ПО) (software) - общий термин для обозначения «неосязаемых» (в отличие от физических) составных частей вычислительной системы. В большинстве случаев он относится к программам, выполняемым вычислительной системой, чтобы подчеркнуть их отличие от аппаратных средств той же системы. Этот термин охватывает как программы в символической записи, так и исполняемые формы этих программ. Все существующее ПО можно разделить на следующие классы: системное: операционные системы; драйверы устройств; различные утилиты; для разработчиков: среды программирования; трансляторы и интерпретаторы; CASE-средства; библиотеки программ; для конечных пользователей: текстовые процессоры; электронные таблицы; графические редакторы; решатели математических задач; обучающие и контролирующие системы; компьютерные игры; прикладные программы. Прикладная программа (application program) - любая программа, способствующая выполнению задачи, возложенной на ЭВМ в пределах данной организации, и вносящая прямой вклад в реализацию этой задачи. Например, там, где на ЭВМ возложена задача контроля финансовой деятельности какой-либо фирмы, прикладной программой будет программа подготовки платежных ведомостей. В противоположность этому операционная система не является прикладной программой, так как не вносит прямого вклада в удовлетворение конечных потребностей пользователя. Программная система представляет собой набор решений множества различных, но связанных между собой задач (ОС, СУБД). Более узкоспециализированные программы не называют системами (редактор текстов, компилятор и т. п.) ЦИКЛ ЖИЗНИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Жизненный цикл ПО (software life-cycle) - весь период времени существования системы программного обеспечения, начиная от выработки первоначальной концепции этой системы и кончая ее моральным устареванием. Жизненный цикл (рис. 1) представляется в виде некоторого числа последовательных фаз, в определенных местах охватываемых обратными связями, когда может возникнуть необходимость повторения какого-либо одного или даже всех этапов разработки системы. Такая модель обеспечивает отражение итеративности* процессов существования ПО.
Итерация - повторение численного или нечисленного процесса, когда результаты одного или нескольких шагов являются входной информацией для следующего начального шага этого цикла. Как правило, такая циклическая процедура заканчивается при достижении заданных результатов, или после того, как результаты перестают меняться. Термин «жизненный цикл ПО» используется в том случае, когда предполагается, что программы будут иметь достаточно большой срок действия, в отличие от экспериментального программирования, при котором программы обычно прогоняются несколько раз, а затем аннулируются. ЭТАПЫ СОЗДАНИЯ ПРОГРАММ 1. Системный анализ. в рамках этого этапа осуществляется анализ требований, предъявляемых к программной системе. Он проводится на основе первичного исследования всех потоков информации при традиционном проведении работ и осуществляется в следующей последовательности: а) уточнение видов и последовательности всех работ; б) определение целей, которые должны быть достигнуты разрабатываемой программой; в) выявление аналогов, обеспечивающих достижение подобных целей, их достоинств и недостатков. 2. Внешнее специфицирование. Состоит в определении внешних спецификаций, то есть описаний входной и выходной информации, а) постановка задачи на разработку новой программы; б) оценка достигаемых целей разрабатываемого программного изделия. Далее, при необходимости, этапы 1-2 могут быть повторены до достижения удовлетворительного облика программной системы с описанием выполняемых ею функций и некоторой ясностью реализации ее функционирования. 3. Проектирование программы. На этом этапе проводится комплекс работ по формированию описания программы. Исходными данными для этой фазы являются требования, изложенные в спецификации, разработанной на предыдущем этапе. Принимаются решения, касающиеся способов удовлетворения требований спецификации. Эта фаза разработки программы делится на два этапа: а) архитектурное проектирование. Представляет собой разработку описания программы в самом общем виде. Это описание содержит сведения о возможных вариантах структурного построения программного изделия (либо в виде нескольких программ, либо в виде нескольких частей одной программы), а также об основных алгоритмах, и структурах данных. Результатом этой работы являются окончательный вариант архитектуры программной системы, требования к структуре отдельных программных компонент и организации файлов для межпрограммного обмена данными; б) рабочее проектирование. На этом этапе архитектурное описание программы детализируется до такого уровня, который делает возможными работы по ее реализации (кодированию и сборке). Для этого осуществляется составление и проверка спецификаций модулей, составление описаний логики модулей, составление окончательного плана реализации программы. 4. Кодирование и тестирование. Эти виды деятельности осуществляются для отдельных модулей и совокупности готовых модулей до получения готовой программы. 5. Комплексное тестирование. 6. Разработка эксплуатационной документации. 7.Приемо-сдаточные и другие виды испытаний. 8. Корректировка программ. Проводится по результатам предшествующих испытаний. 8. Сдача заказчику. Осуществляется окончательная сдача программного изделия заказчику. 10. Тиражирование. 11. Сопровождение программы. В понятие «сопровождение» входят все технические операции, необходимые для использования данной программы в рабочем режиме. Сюда входит не только исправление ошибок. На этом этапе также осуществляется модификация программы, внесение исправлений в рабочую документацию, усовершенствование программы и др. Вследствие широких масштабов подобных операций сопровождение является итеративным процессом, который желательно осуществлять не столько после, Современные технологии проектирования программного обеспечения направлены на частичную автоматизацию описанных выше этапов и на совмещение их во времени с целью сокращения сроков выполнения проектов. ДОКУМЕНТИРОВАНИЕ ПРОГРАММ Каждая стадия проектирования завершается составлением соответствующих документов,.поэтому важным элементом проектирования программных приложений является оформление программной документации. Исключение может составлять разработка бесхитростных программ с коротким жизненным циклом и небольшой трудоемкостью. Программная спецификация (program specification) - точное описание того результата, которого нужно достичь с помощью программы. Это описание должно точно устанавливать, что должна делать программа, не указывая, как она должна это делать. Для программ, заканчивающих свою работу каким-то результатом, обычно составляются спецификации ввода-вывода, в которых описывают желаемое отображение множества входных величин во множество выходных величин. Для циклических программ (в которых нельзя указать точку завершения), разрабатывают спецификации, где основное внимание сосредоточивается на отдельных функциях, реализуемых программой в ходе циклических операций. Существует большое число различных систем обозначений, используемых в программных спецификациях — от естественного языка с использованием математических уравнений и таблиц до формализованных описаний, основанных на исчислении предикатов (Предикат - функция, определяемая па некоторой предметной области переменных и принимающая значения в области истинностных значений.) первого порядка. Разработку программных систем начинают с составления первичных спецификаций. В ходе выполнения проекта первичные спецификации последовательно претерпевают изменения до программных документов стадий и вплоть до документации, которая необходима для эксплуатации и сопровождения программы. Первичные спецификации обычно составляют в терминах решаемой задачи, а не программы. Первичная спецификация описывает: объекты, участвующие в задаче (что делает программа и что делает человек, работающий с этой программой); процессы и действия (проектные процедуры и действия человека, алгоритмы решения задачи в машине, порядок обработки информации, размер оперативной памяти, требуемый для работы программы); входные и выходные данные, а также их организацию (например, сценарий диалога с экранными формами, организация файлов с указанием длин полей записей и предельного количества информации в файлах); инструкции пользования будущей программой. Различают внешнюю программную документацию, которая согласуется с заказчиком, и промежуточную внутреннюю документацию проекта. При составлении программной документации сначала разрабатываются внешние спецификации, а затем — внутренние. Внешние спецификации включают спецификации входных и выходных данных, их организацию, реакции на исключительные ситуации, определение, что делает человек (по каким алгоритмам он работает и откуда берет информацию), а что машина. То есть все, что бы увидел пользователь, когда бы он получил готовую программу. Внешние спецификации зависят сильно от жизненного цикла программы. Еще до разработки структуры и реализации программы к тестированию внешних спецификаций следует привлекать потенциальных пользователей. Пользователю можно показывать макеты экранов в порядке выполнения программы, а пользователь может готовить данные для тестирования всех функций программы и сможет апробировать методику работы с программой. Внутренние спецификации включают описание внутренних данных программы (переменных, особенно структурированных) и описания алгоритмов всей программы и ее частей. Внутренние спецификации даются в единстве с описанием архитектуры программного комплекса и внутренней структурой построения отдельных программных компонент. ТЕОРИЯ ПЕРВИЧНЫХ ПРОГРАММ
Теория первичных программ была предложена Маддуксом в качестве обобщения методологии структурного программирования для определения однозначной иерархической декомпозиции блок-схем. В этой теории предполагается, что графы программ могут содержать три класса узлов (рис. 2): функциональные узлы — представляют вычисления, производимые программой, и изображаются прямоугольниками с одной входящей в этот узел дугой и одной выходящей. Функциональные узлы представляют операторы присваивания, выполнение которых вызывает изменение состояния виртуальной машины; узлы принятия решения - изображаются в виде ромбов с одной входящей дутой и двумя выходящими (истина и ложь). Эти узлы представляют предикаты, и управление из узла принятия решения передается дальше либо по ветви истина, либо по ветви ложь; узел соединения — представляется в виде точки, в которой сходятся две дуги графа, чтобы сформировать одну выходную дугу.
Любая блок-схема состоит только из этих трех компонентов. Правильная программа — блок-схема, являющаяся некоторой формальной моделью структуры управления, которая имеет: одну входящую дугу; одну выходящую дугу; путь от входящей дуги к любому узлу и из любого узла - к выходящей дуге. Первичная программа является правильной программой, которую нельзя разделить на более мелкие правильные программы. Исключением из этого правила является последовательность функциональных узлов, которая считается одной первичной программой.
На рис. 3 изображены все первичные программы, которые включают в себя не более четырех узлов. Первичные программы а, б, д, и представляют собой последовательности функциональных узлов. Первичная программа е — конструкция if-then,.ж — do-while, з - repeat-until, к - if-then-else, л - do-while-do. Первичные программы в, г, м-т состоят только из узлов принятия решения и соединения. В них нет функциональных узлов, поэтому они не изменяют пространство состояний виртуальной машины. Ни один из этих вариантов первичных программ не представляет эффективной структуры управления в программе. Многие из описанных выше наборов управляющих структур были включены в существующие языки программирования. Эти структуры представляют собой первичные программы с небольшим количеством узлов и просты для понимания. Перечислив все первичные программы, можно сделать очевидный вывод, что конструкция do-while-do является естественной структурой управления, хотя она была проигнорирована разработчиками языков. АЛЬТЕРНАТИВЫ Операторы выбора используются для выбора одного из нескольких возможных путей, по которому должно выполняться вычисление. Обобщенный оператор выбора называется case- оператором (switch-оператор в языке С). Условный оператор является частным случаем case- или switch-оператора, в котором выражение имеет булев тип. Так как булевы типы имеют только два допустимых значения, условный оператор делает выбор между двумя возможными путями. Конструкция для двух альтернатив на Паскале имеет следующий вид: if L then begin {Действие при L-True} end; else begin {Действие при L=False} end; здесь L-логическое выражение. Вариант конструкции для нескольких альтернатив имеет вид: Switch: = 0; L1: =... L2: =... L3: =... if L1 then Swich: = 1; if L2 then Swich: = 2; if L3 then Swich: = 3; case Swich of 1: begin {Действие при L1=True} end; 2: begin {Действие при L2=True} end; 3:begin {Действие при L3=Тrие} end; else begin {Вывод сообщения об ошибочном кодировании модуля} end; end; {End of Case} 2.3. ЦИКЛЫ Оператор цикла имеет одну точку входа, последовательность операторов, которые составляют цикл, и одну или несколько точек выхода. Чтобы циклы завершались, с точкой выхода бывает связано условие, которое определяет, следует сделать выход или продолжить выполнение цикла. Циклы различаются числом, типом и расположением условий выхода. Универсальные циклы в Паскале имеют следующие конструкции. ОПЕРАТОРЫ ПЕРЕХОДА Оператор безусловного перехода имеет следующий вид: goto, здесь goto — зарезервированное слово: <метка> — метка. Метка - это произвольный идентификатор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. Можно теоретически показать, что достаточно if- и while-операторов, чтобы записать любую необходимую управляющую структуру. Однако есть несколько вполне определенных ситуаций, где лучше использовать оператор goto. Первая состоит в том, что многие циклы не могут завершаться в точке входа, как этого требует цикл while. Вторая ситуация, которую легко запрограммировать с помощью goto, - выход из глубоко вложенного вычисления. Например, если глубоко внутри вызовов процедур обнаружена ошибка, что делает неверным все вычисление. В этой ситуации естественно запрограммировать выдачу сообщения об ошибке и возвратить в исходное состояние все вычисление. Однако для этого требуется сделать возврат из многих процедур, которые должны знать, что произошла ошибка. Проще и понятнее выйти в основную программу с помощью goto. В языке С нет никаких средств для обработки этой ситуации (не подходит даже goto по причине ограниченности рамками отдельной процедуры), поэтому для обработки серьезных ошибок нужно использовать средства операционной системы. В современных языках Object Pascal, Ada, C++ и Eiffel есть специальные языковые конструкции, так называемые исключения, которые непосредственно решают и эту проблему. ПЕРЕДАЧА ПАРАМЕТРОВ Для обмена информацией между основной программой и процедурой используется один или несколько параметров вызова. Они перечисляются за именем процедуры и вместе с ним образуют оператор ее вызова. Механизм замены формальных параметров на фактические позволяет нужным образом настроить алгоритм, реализованный в подпрограмме. Компилятор обычно следит за тем, чтобы количество и тип формальных параметров строго соответствовали количеству и типам фактических параметров в момент обращения к подпрограмме. Смысл используемых фактических параметров зависит от того, в каком порядке они перечислены при вызове подпрограммы. Поэтому программист должен сам следить за правильным порядком перечисления фактических параметров при обращении к подпрограмме. Формальные параметры подпрограммы могут быть трех видов: параметры-значения; параметры-переменные; параметры-константы. Например, procedure MyProc (A: Real; var В: Real; const С: String); здесь А - параметр-значение, в - параметр-переменная, С - параметр-константа. Способ определения формального параметра очень важен для вызывающей программы. Если формальный параметр объявлен как параметр-значение или параметр-константа, то при вызове ему может соответствовать произвольное выражение. Если формальный параметр объявлен как параметр-переменная, то при вызове подпрограммы ему должен соответствовать фактический параметр в виде переменной нужного типа. Чтобы понять, в каких случаях использовать тот или иной тип параметров, нужно знать, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме. Если параметр определен как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей программой, так как в этом случае изменяется копия фактического параметра. Если параметр определен как параметр-переменная, то при вызове подпрограммы передается сама переменная, а не ее копия (фактически в этом случае подпрограмме передается адрес переменной). Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей программе. В случае параметра-константы в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычисленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы. Параметры-переменные используются как средство связи алгоритма, реализованного в подпрограмме, с внешним миром. С помощью этих параметров подпрограмма может передавать результаты своей работы вызывающей программе. Однако описание всех формальных параметров как параметров-переменных нежелательно по двум причинам. Во-первых, это исключает возможность вызова подпрограммы с фактическими параметрами в виде выражений, что делает программу менее компактной. Во-вторых, в подпрограмме возможно случайное использование формального параметра, например, для временного хранения промежуточного результата, т.е. всегда существует опасность непреднамеренно испортить фактическую переменную. По той же причине не рекомендуется использовать параметры-переменные в заголовке функции. Если результатом работы функции не может быть единственное значение, то логичнее использовать процедуру или нужным образом декомпозировать алгоритм на несколько подпрограмм. Существует еще одно обстоятельство, которое следует учитывать при выборе вида формальных параметров. Как уже говорилось, при объявлении параметра-значения осуществляется копирование фактического параметра во временную память. Если этим параметром будет массив большой размерности, то существенные затраты времени и памяти на копирование при многократных обращениях к подпрограмме можно минимизировать, объявив этот параметр параметром-константой. Параметр-константа не копируется во временную область памяти, что сокращает затраты времени на вызов подпрограммы, однако любые его изменения в теле подпрограммы невозможны - за этим строго следит компилятор. Нетипизированные параметры. Одним из свойств языка Object Pascal является возможность использования нетипизированных параметров. Параметр считается нетипизированным, если тип формального параметра-переменной в заголовке подпрограммы не указан, при этом соответствующий ему фактический параметр может быть переменной любого типа. Нетипизированными могут быть только параметры-переменные: procedure MyProc(var aParametr); Нетипизированные параметры обычно используются в случае, когда тип данных несуществен. Такие ситуации чаще всего возникают при разного рода копированиях одной области памяти в другую, например, с помощью процедур BlockRead, BlockWrite, Move-Memory и т. п. Процедурные типы. Основное назначение процедурных типов — дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например: type Prod = procedure (a, b, с: Real; var d: Real); РгосЗ == procedure; Fund = function: String; Func2 = function (var s: String): Real; В программе могут быть объявлены переменные процедурных типов, например: var p1: Proc1; fl, f 2: Func2; ар: array [1.. N] of Prod; Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы. 2.7. РЕКУРСИЯ Содержание и мощность рекурсивного определения, а также его главное назначение, состоит в том, что оно позволяет с помощью конечного выражения определить бесконечное множество объектов. Аналогично, с помощью конечного рекурсивного алгоритма можно определить бесконечное вычисление, причем алгоритм не будет содержать повторений фрагментов текста. Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе. Программы, в которых используются рекурсивные процедуры, отличаются простотой, наглядностью и компактностью текста. Такие качества рекурсивных алгоритмов вытекают из того, что рекурсивная процедура указывает что нужно делать, а нерекурсивная больше акцентирует внимание на том, как нужно делать. Однако за эту простоту приходится расплачиваться неэкономным использованием оперативной памяти, так как выполнение рекурсивных процедур требует значительно большего размера оперативной памяти во время выполнения, чем нерекурсивных. При каждом рекурсивном вызове для локальных переменных, а также для параметров процедуры, которые передаются по значению, выделяются новые ячейки памяти. Таким образом, какой-либо локальной переменной А на разных уровнях рекурсии будут соответствовать различные ячейки памяти, которые могут иметь разные значения. Глубиной рекурсии называется максимальное число рекурсивных вызовов процедуры без возвратов, которое происходит во время выполнения программы. В общем случае любая рекурсивная процедура Rec включает в себя некоторое множество операторов S и один или несколько операторов рекурсивного вызова. Безусловные рекурсивные процедуры приводят к бесконечным процессам, и на эту проблему нужно обратить особое внимание, так как практическое использование процедур с бесконечным самовызовом невозможно. Следовательно, главное требование к рекурсивным процедурам заключается в том, что вызов рекурсивной процедуры должен выполняться по условию, которое на каком-то уровне рекурсии станет ложным. Если условие истинно, то рекурсивный спуск продолжается. Когда оно становится ложным, то спуск заканчивается и начинается поочередный рекурсивный возврат из всех вызванных на данный момент копий рекурсивной процедуры. Структура рекурсивной процедуры может принимать три разных формы: 1) форма с выполнением действий до рекурсивного вызова (на procedure Rec; begin S; if условие then Rec; end; 2) форма с выполнением действий после рекурсивного вызова procedure Rec; begin if условие then Rec; S; end; 3) форма с выполнением действий как до, так и после рекурсивного вызова (с выполнением действий как на рекурсивном спуске, так и на рекурсивном возврате). procedure Rec; begin S1; if условие then Rec; S2; end; Все формы рекурсивных процедур находят применение на практике. Многие задачи, в том числе вычисление факториала, безразличны к тому, какая используется форма рекурсивной процедуры. Однако есть классы задач, при решении которых программисту требуется сознательно управлять ходом работы рекурсивных процедур и функций. Такими, в частности, являются задачи, использующие списковые и древовидные структуры данных.
КРИТЕРИИ ОЦЕНКИ КАЧЕСТВА СТРУКТУРНОЙ СХЕМЫ ПРОГРАММЫ Первый вариант структурной схемы, полученный путем простого членения функций программы на подфункции с указанием переменных, необходимых для размещения данных, чаще всего не является оптимальным и требуются проектные итерации для улучшения топологии схемы. Эти действия обычно выполняются методом «проб и ошибок». Каждый новый вариант сравнивается с предшествующим по описанным ниже критериям: 1) полнота выполнения специфицированных функций; 2)возможность быстрого и дешевого пополнения новыми, ранее не специфицированными функциями; 3)обозримость (понятность) для проектировщика составных частей программы; 4)максимальная независимость отдельных частей программы; 5) возможность связывания подпрограмм редактором связей; 6)достаточность оперативной памяти; 7) влияние топологии схемы иерархии на скорость выполнения программы при использовании динамической загрузки программы и механизма подкачки страниц; 8) отсутствие разных модулей со сходными функциями. Один и тот же модуль должен вызываться на разных уровнях схемы иерархии; 9)достижение такого графика работы коллектива программистов при реализации программы, который обеспечивает равномерную загрузку коллектива;
10)всемерное сокращение затрат на тестирование программы. 11)использование в данном проекте как можно большего числа проработанных в предшествующих проектах модулей и библиотек при минимальном объеме изготавливаемых заново частей. Генерация вариантов прекращается при невозможности дальнейших улучшений. Рациональная структура программы обеспечивает сокращение общего объема текстов в 2-3 раза, что соответственно удешевляет создание программы и ее тестирование, на которое обычно приходится не менее 60% от общих затрат. При этом облегчается и снижается стоимость сопровождения программы. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ Реализация принципа структурного программирования осуществляется с использованием макрокоманд и механизмов вызова подпрограмм. Эти же механизмы подходят и для реализации модульного программирования, которое можно рассматривать как часть структурного подхода. Необходимо различать использование слова модуль, когда имеется в виду единица дробления большой программы на отдельные блоки (которые могут быть реализованы в виде процедур и функций) и когда имеется ввиду синтаксическая конструкция языков программирования (unit в Object Pascal). Модульное программирование — это организация программы как совокупности независимых блоков, называемых модулями, структура и поведение которых подчиняются определенным правилам. Концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений: 1) большие задачи разбиваются на ряд более мелких, функционально самостоятельных подзадач — модулей, которые связаны между собой только по входным и выходным данным; 2) модуль представляет собой «черный ящик» с одним входом и одним выходом. Это позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации, облегчает ее 3) в каждом модуле должны осуществляться ясные задачи. Если назначение модуля непонятно, то это означает, что декомпозиция на модули была проведена недостаточно качественно. Процесс декомпозиции нужно продолжать до тех пор, пока не будет ясного понимания назначения всех модулей и их оптимального сочетания; 4) исходный текст модуля должен иметь заголовок и интерфейсную часть, где отражаются назначение модуля и все его внешние связи; 5) в ходе разработки модулей программы следует предусматривать специальные блоки операций, учитывающие реакцию на возможные ошибки в данных или в действиях пользователя. Большое значение в концепции модульного программирования придается организации управляющих и информационных связей между модулями программы, совместно решающими одну или несколько больших задач. При работе с модулями нужно помнить их основное отличие от процедур и функций. Традиционные правила сферы действия глобальных и локальных переменных для модулей не работают. Эта языковая конструкция разработана так, чтобы исключить влияние глобальных переменных, объявленных в главной программе, на внутренние описания модуля. Поэтому, если возникает необходимость ввести доступные для всех блоков программы глобальные описания то следует создать модуль глобальных объявлений и включить его в список импорта всех модулей, где нужны его описания.
3.7. СТРУКТУРА МОДУЛЯ В OBJECT PASCAL Object Pascal имеет различные средства для структурирования программ. На нижнем уровне деления (для элементарных подзадач) чаще всего используются процедуры и функции, а на верхнем уровне (для больших задач) используются модули. В среде Delphi каждой форме обязательно соответствует свой модуль, что позволяет локализовать все свойства окна в отдельной программной единице. Кроме этого, невизуальные алгоритмические действия также оформляются в виде отдельных модулей. Первая строка модуля начинается с ключевого слова: unit <идентификатор_модуля>; Для правильной работы среды программирования это имя должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Далее следует {Интерфейсный раздел} interface где описывается взаимодействие данного модуля с другими пользовательскими и стандартными модулями, а также с главной программой. Здесь содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и/или другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок. Связь модуля с другими модулями устанавливается специальным предложением: {Список импорта интерфейсного раздела} uses <список_модулей> В этом списке через запятые перечисляются идентификаторы модулей, информация интерфейсных частей которых должна быть доступна в данном модуле. {Список экспорта интерфейсного раздела} const type var procedure function Список экспорта состоит из подразделов описания констант, типов, переменных, заголовков процедур и функций, которые определены в данном модуле, но использовать которые разрешено во всех других модулях и программах, включающих имя данного модуля в своей строке uses. Для процедур и функций здесь описываются только заголовки, но с обязательным полным описанием формальных параметров. {Раздел реализации) implementation В этом разделе указывается реализационная (личная) часть описаний данного модуля, которая недоступна для других модулей и программ. {Список импорта раздела реализации) uses В этом списке через запятые перечисляются идентификаторы модулей, информация интерфейсных частей которых должна быть доступна в данном модуле. Здесь целесообразно описывать идентификаторы всех необходимых модулей, информация из которых не используется в описаниях раздела interface данного модуля. {Подразделы внутренних для модуля описаний} label const type var procedure function В этих подразделах описываются метки, константы, типы, переменные, процедуры и функции, которые описывают алгоритмические действия, выполняемые данным модулем, и которые являются «личной собственностью» исключительно только данного модуля. Эти описания недоступны ни одному другому модулю. Исполняемая часть содержит описания подпрограмм, объявленных в интерфейсной части. Описанию подпрограммы должен предшествовать заголовок, в котором можно опускать список формальных параметров и тип результата для функции. Если заголовки указаны с параметрами, то их список должен быть идентичен такому же списку для соответствующей процедуры или функции в разделе interface. {Раздел инициализации} initialization В этом разделе между ключевыми словами initialization и finalization располагаются операторы начальных установок, необходимых для запуска корректной работы модуля. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Операторы разделов инициализации модулей, используемых в программе, выполняются при начальном запуске программы в том же порядке, в каком идентификаторы модулей описаны в предложениях uses файла проекта. Если операторы инициализации не требуются, то зарезервированное слово initialization может быть опущено. {Раздел завершения) finalization Раздел завершения finalization является необязательным и может присутствовать только вместе с разделом инициализации initialization. В разделе завершения располагается список операторов, которые будут выполняться при завершении модуля, что обычно происходит при окончании работы приложения. Разделы finalization модулей приложения выполняются в порядке, противоположном выполнению разделов initialization этих модулей. Раздел завершения используется, как правило, для освобождения ресурсов, которые выделяются приложению в разделе инициализации. Это гарантирует корректное завершение приложения, что особенно это важно, когда приложение заканчивается по возникновению исключительных ситуаций.
ОСНОВНЫЕ ПОНЯТИЯ ПОЛЯ Класс представляет собой единство трех сущностей - полей, методов и свойств. Объединение этих сущностей в единое целое достигается за счет применения инкапсуляции. Полями называются инкапсулированные в классе данные. По аналогии с описанием переменных, описание поля указывает идентификатор, именующий поле и тип данного этого поля. Поля могут быть люб
|
||||
Последнее изменение этой страницы: 2016-08-15; просмотров: 758; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.128.31.194 (0.013 с.) |