Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR13-14.doc
Скачиваний:
63
Добавлен:
10.03.2016
Размер:
274.94 Кб
Скачать

Модульное программирование

Назначение модулей

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

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

Основным принципом модульного программирования является принцип «разделяй и властвуй». Модульное программирование – это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определенным правилам.

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

Термин «модуль» в программировании начал использоваться в связи с внедрением модульных принципов при создании программ. В 70-х годах под модулем понимали какую-либо процедуру или функцию, написанную в соответствии с определенными правилами. Например: «Модуль должен быть простым, замкнутым (независимым), обозримым (от 50 до 100 строк), реализующим только одну функцию задачи, имеющим одну входную и одну выходную точку».

Первым основные свойства программного модуля более-менее четко сформулировал Парнас (Parnas): «Для написания одного модуля должно быть достаточно минимальных знаний о тексте другого». Таким образом, в соответствии с определением, модулем могла быть любая отдельная процедура (функция) как самого нижнего уровня иерархии (уровня реализации), так и самого верхнего уровня, на котором происходят только вызовы других процедур-модулей.

Таким образом, Парнас первым выдвинул концепцию скрытия информации (information hiding) в программировании. Однако существовавшие в языках 70-х годов только такие синтаксические конструкции, как процедура и функция, не могли обеспечить надежного скрытия информации, поскольку подвержены влиянию глобальных переменных, поведение которых в сложных программах бывает трудно предсказуемым.

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

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

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

Впервые специализированная синтаксическая конструкция модуля была предложена Н. Виртом в 1975 г. и включена в его новый язык Modula. Насколько сильно изменяются свойства языка, при введении механизма модулей, свидетельствует следующее замечание Н.Вирта, сделанное им по поводу более позднего языка Модула-2: «Модули – самая важная черта, отличающая язык Модула-2 от его предшественника Паскаля».

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

Рис.2. Последовательность разработки программного проекта

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

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

Структура модулей

Всякий модуль имеет следующую структуру:

Unit <имя_модуля>;

interface

<интерфейсная часть>;

implementation

<исполняемая часть>;

begin

<инициирующая часть>;

end.

Здесь UNIT – зарезервированное слово (единица); начинает заголовок модуля;

<имя_модуля> - имя модуля (правильный идентификатор);

INTERFACE – зарезервированное слово (интерфейс); начинает интерфейсную часть модуля;

IMPLEMENTATION – зарезервированное слово (выполнение); начинает исполняемую часть модуля;

BEGIN – зарезервированное слово; начинает инициирующую часть модуля; причем конструкция begin <инициирующая часть> необязательна;

END – зарезервированное слово – признак конца модуля.

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

Ниже показана общая структура модуля, дополненная комментариями, поясняющими смысл и назначение каждого раздела модуля.

Unit ИдентификаторМодуля;

{Интерфейсный раздел}

interface

{В этом разделе описывается взаимодействие данного модуля} {с другими пользовательскими и стандартными модулями, а также} {с главной программой. Другими словами – взаимодействие } {модуля с «внешним миром». }

{Список импорта интерфейсного раздела}

uses

{В этом списке через запятые перечисляются идентификаторы} {модулей, информация интерфейсных частей которых должна }

{быть доступна в данном модуле. Здесь целесообразно описывать} {идентификаторы только тех модулей, информация из которых} {используется в описаниях раздела interface данного модуля.}

{Список экспорта интерфейсного раздела}

const {Список экспорта состоит из подразделов описания констант,} type {типов, переменных, заголовков процедур и функций, которые} var {определены в данном модуле, но использовать которые разре-} procedure {шено во всех других модулях и программах, включающих имя} function {данного модуля в своей строке uses. Для процедур и функций} {здесь описываются только заголовки, но с обязательным} {полным описанием формальных параметров.}

{Раздел реализации}

implementation

{В этом разделе указывается реализационная (личная) часть} {описаний данного модуля, которая недоступна для других } {модулей и программ. Другими словами – «внутренняя кухня»}

{модуля.}

{Список импорта раздела реализации}

uses

{В этом списке через запятые перечисляются идентификаторы} {тех модулей, информация интерфейсных частей которых должна} {быть доступна в данном модуле. Здесь целесообразно описывать} {идентификаторы всех необходимых модулей, информация из} {которых не используется в описаниях раздела interface данного} {модуля и об использовании которых не должен знать ни один} {другой модуль. }

{Подразделы внутренних для модуля описаний}

label {В этих подразделах описываются метки, константы, типы,} const {переменные, процедуры и функции, которые описывают} type {алгоритмические действия, выполняемые данным модулем, и} var {которые являются «личной собственностью» исключительно} procedure{только данного модуля. Эти описания недоступны ни одному} function {другому модулю. Заголовки процедур и функций в этом} {подразделе допускается указывать без списка формальных} {параметров. Если заголовки указаны все же с параметрами, то} {их список должен быть идентичен такому же списку для} {соответствующей процедуры (функции) в разделе interface}

{Раздел инициализации}

begin

{В этом разделе указываются операторы начальных установок,} {необходимых для запуска корректной работы модуля. Операторы} {разделов инициализации модулей, используемых в программе,} {выполняются при начальном запуске программы в том же } {порядке, в каком идентификаторы модулей описаны в } {предложении uses. Если операторы инициализации не требуются, } {то слово begin может быть опущено.}

end.

Заголовок модуля и связь модулей друг с другом

Заголовок модуля состоит из зарезервированного слова unit и следующего за ним имени модуля. Для правильной работы среды Турбо Паскаля и возможности подключения средств, облегчающих разработку больших программ, имя модуля должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Если, например, имеем заголовок модуля

Unit primer;

то исходный текст этого модуля должен размещаться на диске в файле primer.pas.

Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением:

uses <список модулей>

Здесь USES – зарезервированное слово (использует);

<список модулей> - список модулей, с которыми устанавливается связь; элементы списка – имена модулей через запятую.

Если в программе модули используются, то предложение uses <список модулей> должно стоять сразу после заголовка программы, т.е. должно открывать раздел описаний основной программы. В модулях могут использоваться другие модули. В модулях предложение uses <список модулей> может стоять сразу после слова interface или сразу после слова implementation. Допускается и два предложения uses, т.е. оно может стоять и там, и там.

Интерфейсная часть

Интерфейсная часть открывается зарезервированным словом INTERFACE. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны быть доступны основной программе и (или) другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:

Unit complexn;

Interface

Type

Complex= record

Re, im: real;

End;

Procedure AddC(x,y: complex, var z: complex);

Procedure MulC (x,y: complex, var z: complex);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]